Unix & Linux
centos grub xen grub2-mkconfig
Updated Thu, 22 Sep 2022 02:22:45 GMT

Booting into Xen with grub2-mkconfig 2.03 on centos8 x86_64


Linux localhost.localdomain 4.18.0-394.el8.x86_64 #1 SMP Tue May 31 16:19:11 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
grub2-mkconfig (GRUB) 2.03

On my centos8, I have installed centos-release-openstack-xena.noarch

But I cannot boot into Xen, please help.

Theoretically, after installing Xen, I should only run

grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg

As my /etc/grub.d has a linux_xen file and antoher large number of files hanging there:

[root@localhost ~]# ls /etc/grub.d/
00_header  01_users              10_linux               11_linux_xen       20_linux_xen     30_os-prober      35_fwupd   41_custom
00_tuned   08_fallback_counting  10_reset_boot_success  12_menu_auto_hide  20_ppc_terminfo  30_uefi-firmware  40_custom  README

(11_linux_xen is a symlink I created pointing to 20_linux_xen)

Unfortunately, grub.cfg will have nothing in the linux_xen section.

I added echo << EOF and EOF to the linux_xen file and I got some errors, but I wonder if debugging this complexity is the best way forward or if there is something simpler I can do.

/etc/grub.d/11_linux_xen file contents:


#! /bin/sh
set -e
# grub-mkconfig helper script.
# Copyright (C) 2006,2007,2008,2009,2010  Free Software Foundation, Inc.
#
# GRUB is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# GRUB is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
cat << EOF
prefix="/usr"
exec_prefix="/usr"
datarootdir="/usr/share"
. "$pkgdatadir/grub-mkconfig_lib"
export TEXTDOMAIN=grub
export TEXTDOMAINDIR="${datarootdir}/locale"
CLASS="--class gnu-linux --class gnu --class os --class xen"
if [ "x${GRUB_DISTRIBUTOR}" = "x" ] ; then
  OS="$(sed 's, release .*$,,g' /etc/system-release)"
else
  OS="${GRUB_DISTRIBUTOR}"
  CLASS="--class $(echo ${GRUB_DISTRIBUTOR} | tr 'A-Z' 'a-z' | cut -d' ' -f1|LC_ALL=C sed 's,[^[:alnum:]_],_,g') ${CLASS}"
fi
# loop-AES arranges things so that /dev/loop/X can be our root device, but
# the initrds that Linux uses don't like that.
case ${GRUB_DEVICE} in
  /dev/loop/*|/dev/loop[0-9])
    GRUB_DEVICE=`losetup ${GRUB_DEVICE} | sed -e "s/^[^(]*(\([^)]\+\)).*/\1/"`
  ;;
esac
# Default to disabling partition uuid support to maintian compatibility with
# older kernels.
GRUB_DISABLE_LINUX_PARTUUID=${GRUB_DISABLE_LINUX_PARTUUID-true}
# btrfs may reside on multiple devices. We cannot pass them as value of root= parameter
# and mounting btrfs requires user space scanning, so force UUID in this case.
if ( [ "x${GRUB_DEVICE_UUID}" = "x" ] && [ "x${GRUB_DEVICE_PARTUUID}" = "x" ] ) \
    || ( [ "x${GRUB_DISABLE_LINUX_UUID}" = "xtrue" ] \
    && [ "x${GRUB_DISABLE_LINUX_PARTUUID}" = "xtrue" ] ) \
    || ( ! test -e "/dev/disk/by-uuid/${GRUB_DEVICE_UUID}" \
    && ! test -e "/dev/disk/by-partuuid/${GRUB_DEVICE_PARTUUID}" ) \
    || ( test -e "${GRUB_DEVICE}" && uses_abstraction "${GRUB_DEVICE}" lvm ); then
  LINUX_ROOT_DEVICE=${GRUB_DEVICE}
elif [ "x${GRUB_DEVICE_UUID}" = "x" ] \
    || [ "x${GRUB_DISABLE_LINUX_UUID}" = "xtrue" ]; then
  LINUX_ROOT_DEVICE=PARTUUID=${GRUB_DEVICE_PARTUUID}
else
  LINUX_ROOT_DEVICE=UUID=${GRUB_DEVICE_UUID}
fi
# Allow overriding GRUB_CMDLINE_LINUX and GRUB_CMDLINE_LINUX_DEFAULT.
if [ "${GRUB_CMDLINE_LINUX_XEN_REPLACE}" ]; then
  GRUB_CMDLINE_LINUX="${GRUB_CMDLINE_LINUX_XEN_REPLACE}"
fi
if [ "${GRUB_CMDLINE_LINUX_XEN_REPLACE_DEFAULT}" ]; then
  GRUB_CMDLINE_LINUX_DEFAULT="${GRUB_CMDLINE_LINUX_XEN_REPLACE_DEFAULT}"
fi
case x"$GRUB_FS" in
    xbtrfs)
    if [ "x${SUSE_BTRFS_SNAPSHOT_BOOTING}" = "xtrue" ]; then
    GRUB_CMDLINE_LINUX="${GRUB_CMDLINE_LINUX} \${extra_cmdline}"
    else
    rootsubvol="`make_system_path_relative_to_its_root /`"
    rootsubvol="${rootsubvol#/}"
    if [ "x${rootsubvol}" != x ]; then
        GRUB_CMDLINE_LINUX="rootflags=subvol=${rootsubvol} ${GRUB_CMDLINE_LINUX}"
    fi
    fi;;
    xzfs)
    rpool=`${grub_probe} --device ${GRUB_DEVICE} --target=fs_label 2>/dev/null || true`
    bootfs="`make_system_path_relative_to_its_root / | sed -e "s,@$,,"`"
    LINUX_ROOT_DEVICE="ZFS=${rpool}${bootfs}"
    ;;
esac
title_correction_code=
linux_entry ()
{
  os="$1"
  version="$2"
  xen_version="$3"
  type="$4"
  args="$5"
  xen_args="$6"
  if [ -z "$boot_device_id" ]; then
      boot_device_id="$(grub_get_device_id "${GRUB_DEVICE}")"
  fi
  if [ x$type != xsimple ] ; then
      if [ x$type = xrecovery ] ; then
      title="$(gettext_printf "%s, with Xen %s and Linux %s (recovery mode)" "${os}" "${xen_version}" "${version}")"
      else
      title="$(gettext_printf "%s, with Xen %s and Linux %s" "${os}" "${xen_version}" "${version}")"
      fi
      replacement_title="$(echo "Advanced options for ${OS}" | sed 's,>,>>,g')>$(echo "$title" | sed 's,>,>>,g')"
      if [ x"Xen ${xen_version}>$title" = x"$GRUB_ACTUAL_DEFAULT" ]; then
         quoted="$(echo "$GRUB_ACTUAL_DEFAULT" | grub_quote)"
         title_correction_code="${title_correction_code}if [ \"x\$default\" = '$quoted' ]; then default='$(echo "$replacement_title" | grub_quote)'; fi;"
         grub_warn "$(gettext_printf "Please don't use old title \`%s' for GRUB_DEFAULT, use \`%s' (for versions before 2.00) or \`%s' (for 2.00 or later)" "$GRUB_ACTUAL_DEFAULT" "$replacement_title" "gnulinux-advanced-$boot_device_id>gnulinux-$version-$type-$boot_device_id")"
      fi
      echo "menuentry '$(echo "$title" | grub_quote)' ${CLASS} \$menuentry_id_option 'xen-gnulinux-$version-$type-$boot_device_id' {" | sed "s/^/$submenu_indentation/"
  else
      title="$(gettext_printf "%s, with Xen hypervisor" "${os}")"
      echo "menuentry '$(echo "$title" | grub_quote)' ${CLASS} \$menuentry_id_option 'xen-gnulinux-simple-$boot_device_id' {" | sed "s/^/$submenu_indentation/"
  fi
  if [ x$type != xrecovery ] ; then
      save_default_entry | grub_add_tab | sed "s/^/$submenu_indentation/"
  fi
  if [ -z "${prepare_boot_cache}" ]; then
    prepare_boot_cache="$(prepare_grub_to_access_device ${GRUB_DEVICE_BOOT} | grub_add_tab)"
  fi
  printf '%s\n' "${prepare_boot_cache}" | sed "s/^/$submenu_indentation/"
  xmessage="$(gettext_printf "Loading Xen %s ..." ${xen_version})"
  lmessage="$(gettext_printf "Loading Linux %s ..." ${version})"
  sed "s/^/$submenu_indentation/" << EOF
    echo    '$(echo "$xmessage" | grub_quote)'
        if [ "\$grub_platform" = "pc" -o "\$grub_platform" = "" ]; then
            xen_rm_opts=
        else
            xen_rm_opts="no-real-mode edd=off"
        fi
    insmod ${module_loader}
    insmod ${xen_loader}
    ${xen_loader}   ${rel_xen_dirname}/${xen_basename} placeholder ${xen_args} \${xen_rm_opts}
    echo    '$(echo "$lmessage" | grub_quote)'
    ${module_loader}    ${rel_dirname}/${basename} placeholder root=${linux_root_device_thisversion} ro ${args}
EOF
  if test -n "${initrd}" ; then
    # TRANSLATORS: ramdisk isn't identifier. Should be translated.
    message="$(gettext_printf "Loading initial ramdisk ...")"
    sed "s/^/$submenu_indentation/" << EOF
    echo    '$(echo "$message" | grub_quote)'
    insmod ${module_loader}
    ${module_loader}    --nounzip   ${rel_dirname}/${initrd}
EOF
  fi
  sed "s/^/$submenu_indentation/" << EOF
}
EOF
}
linux_list=
for i in /boot/vmlinu[xz]-* /vmlinu[xz]-* /boot/kernel-*; do
    if grub_file_is_not_garbage "$i"; then
        basename=$(basename $i)
    version=$(echo $basename | sed -e "s,^[^0-9]*-,,g")
    dirname=$(dirname $i)
    config=
    for j in "${dirname}/config-${version}" "${dirname}/config-${alt_version}" "/etc/kernels/kernel-config-${version}" ; do
        if test -e "${j}" ; then
        config="${j}"
        break
        fi
    done
        if (grep -qx "CONFIG_XEN_DOM0=y" "${config}" 2> /dev/null || grep -qx "CONFIG_XEN_PRIVILEGED_GUEST=y" "${config}" 2> /dev/null); then linux_list="$linux_list $i" ; fi
    fi
done
if [ "x${linux_list}" = "x" ] ; then
    exit 0
fi
file_is_not_sym () {
    case "$1" in
    */xen-syms-*)
        return 1;;
    *)
        return 0;;
    esac
}
xen_list=
for i in /boot/xen*; do
    if grub_file_is_not_garbage "$i" && file_is_not_sym "$i" ; then xen_list="$xen_list $i" ; fi
done
prepare_boot_cache=
boot_device_id=
title_correction_code=
machine=`uname -m`
case "$machine" in
    i?86) GENKERNEL_ARCH="x86" ;;
    mips|mips64) GENKERNEL_ARCH="mips" ;;
    mipsel|mips64el) GENKERNEL_ARCH="mipsel" ;;
    arm*) GENKERNEL_ARCH="arm" ;;
    *) GENKERNEL_ARCH="$machine" ;;
esac
# Extra indentation to add to menu entries in a submenu. We're not in a submenu
# yet, so it's empty. In a submenu it will be equal to '\t' (one tab).
submenu_indentation=""
is_top_level=true
while [ "x${xen_list}" != "x" ] ; do
    list="${linux_list}"
    current_xen=`version_find_latest $xen_list`
    xen_basename=`basename ${current_xen}`
    xen_dirname=`dirname ${current_xen}`
    rel_xen_dirname=`make_system_path_relative_to_its_root $xen_dirname`
    xen_version=`echo $xen_basename | sed -e "s,.gz$,,g;s,^xen-,,g"`
    if [ -z "$boot_device_id" ]; then
    boot_device_id="$(grub_get_device_id "${GRUB_DEVICE}")"
    fi
    if [ "x$is_top_level" != xtrue ]; then
    echo "  submenu '$(gettext_printf "Xen hypervisor, version %s" "${xen_version}" | grub_quote)' \$menuentry_id_option 'xen-hypervisor-$xen_version-$boot_device_id' {"
    fi
    if ($grub_file --is-arm64-efi $current_xen); then
    xen_loader="xen_hypervisor"
    module_loader="xen_module"
    else
    if ($grub_file --is-x86-multiboot2 $current_xen); then
        xen_loader="multiboot2"
        module_loader="module2"
    else
        xen_loader="multiboot"
        module_loader="module"
        fi
    fi
    while [ "x$list" != "x" ] ; do
    linux=`version_find_latest $list`
    gettext_printf "Found linux image: %s\n" "$linux" >&2
    basename=`basename $linux`
    dirname=`dirname $linux`
    rel_dirname=`make_system_path_relative_to_its_root $dirname`
    version=`echo $basename | sed -e "s,^[^0-9]*-,,g"`
    alt_version=`echo $version | sed -e "s,\.old$,,g"`
    linux_root_device_thisversion="${LINUX_ROOT_DEVICE}"
    initrd=
    for i in "initrd.img-${version}" "initrd-${version}.img" "initrd-${version}.gz" \
       "initrd-${version}" "initramfs-${version}.img" \
       "initrd.img-${alt_version}" "initrd-${alt_version}.img" \
       "initrd-${alt_version}" "initramfs-${alt_version}.img" \
       "initramfs-genkernel-${version}" \
       "initramfs-genkernel-${alt_version}" \
       "initramfs-genkernel-${GENKERNEL_ARCH}-${version}" \
       "initramfs-genkernel-${GENKERNEL_ARCH}-${alt_version}" ; do
        if test -e "${dirname}/${i}" ; then
        initrd="$i"
        break
        fi
    done
    if test -n "${initrd}" ; then
        gettext_printf "Found initrd image: %s\n" "${dirname}/${initrd}" >&2
    else
    # "UUID=" magic is parsed by initrds.  Since there's no initrd, it can't work here.
        if [ "x${GRUB_DEVICE_PARTUUID}" = "x" ] \
        || [ "x${GRUB_DISABLE_LINUX_PARTUUID}" = "xtrue" ]; then
        linux_root_device_thisversion=${GRUB_DEVICE}
        else
        linux_root_device_thisversion=PARTUUID=${GRUB_DEVICE_PARTUUID}
        fi
    fi
    if [ "x$is_top_level" = xtrue ] && [ "x${GRUB_DISABLE_SUBMENU}" != xy ]; then
        linux_entry "${OS}" "${version}" "${xen_version}" simple \
        "${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT}" "${GRUB_CMDLINE_XEN} ${GRUB_CMDLINE_XEN_DEFAULT}"
        submenu_indentation="$grub_tab$grub_tab"
    
        if [ -z "$boot_device_id" ]; then
        boot_device_id="$(grub_get_device_id "${GRUB_DEVICE}")"
        fi
            # TRANSLATORS: %s is replaced with an OS name
        echo "submenu '$(gettext_printf "Advanced options for %s (with Xen hypervisor)" "${OS}" | grub_quote)' \$menuentry_id_option 'gnulinux-advanced-$boot_device_id' {"
    echo "  submenu '$(gettext_printf "Xen hypervisor, version %s" "${xen_version}" | grub_quote)' \$menuentry_id_option 'xen-hypervisor-$xen_version-$boot_device_id' {"
       is_top_level=false
    fi
    linux_entry "${OS}" "${version}" "${xen_version}" advanced \
        "${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_LINUX_DEFAULT}" "${GRUB_CMDLINE_XEN} ${GRUB_CMDLINE_XEN_DEFAULT}"
    if [ "x${GRUB_DISABLE_RECOVERY}" != "xtrue" ]; then
        linux_entry "${OS}" "${version}" "${xen_version}" recovery \
        "single ${GRUB_CMDLINE_LINUX}" "${GRUB_CMDLINE_XEN}"
    fi
    list=`echo $list | tr ' ' '\n' | fgrep -vx "$linux" | tr '\n' ' '`
    done
    if [ x"$is_top_level" != xtrue ]; then
    echo '  }'
    fi
    xen_list=`echo $xen_list | tr ' ' '\n' | fgrep -vx "$current_xen" | tr '\n' ' '`
done
# If at least one kernel was found, then we need to
# add a closing '}' for the submenu command.
if [ x"$is_top_level" != xtrue ]; then
  echo '}'
fi
echo "$title_correction_code"
EOF

Error message generated when running grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg :

[root@localhost ~]# grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg
Generating grub configuration file ...
losetup: /dev/nvme0n1p3: failed to use device: No such device
/etc/grub.d/11_linux_xen: line 20: make_system_path_relative_to_its_root: command not found
/etc/grub.d/11_linux_xen: line 20: make_system_path_relative_to_its_root: command not found
/etc/grub.d/11_linux_xen: line 20: grub_get_device_id: command not found
/etc/grub.d/11_linux_xen: line 20: gettext_printf: command not found
/etc/grub.d/11_linux_xen: line 20: gettext_printf: command not found
/etc/grub.d/11_linux_xen: line 20: grub_quote: command not found
/etc/grub.d/11_linux_xen: line 20: grub_quote: command not found
/etc/grub.d/11_linux_xen: line 20: gettext_printf: command not found
/etc/grub.d/11_linux_xen: line 20: grub_quote: command not found
/etc/grub.d/11_linux_xen: line 20: gettext_printf: command not found
/etc/grub.d/11_linux_xen: line 20: grub_quote: command not found
/etc/grub.d/11_linux_xen: line 20: prepare_grub_to_access_device: command not found
/etc/grub.d/11_linux_xen: line 20: grub_add_tab: command not found
/etc/grub.d/11_linux_xen: line 20: gettext_printf: command not found
/etc/grub.d/11_linux_xen: line 20: gettext_printf: command not found
/etc/grub.d/11_linux_xen: line 20: grub_quote: command not found
/etc/grub.d/11_linux_xen: line 20: grub_quote: command not found
/etc/grub.d/11_linux_xen: line 158: syntax error near unexpected token `}'

This question was also published at: https://xcp-ng.org/forum/topic/6113/booting-into-xen-with-grub2-mkconfig-2-03-on-centos8-x86_64

And: https://forums.centos.org/viewforum.php?f=54




Solution

The description for package centos-release-openstack-xena.noarch reads:

yum Configs and basic docs for OpenStack as delivered via the CentOS Cloud SIG.

The fact that the package name has the .noarch suffix suggests there is nothing directly bootable in this package, as it means the contents are processor-architecture independent, i.e. only scripts, documentation and/or data.

The name xena also does not refer to Xen as such: it is the release codename of the October 2021 release of OpenStack.

Installing centos-release-openstack-xena.noarch is but the first preparatory step in installing OpenStack. If that's what you are planning, then you should start reading the OpenStack installation guide. You are now in position to begin installing the various OpenStack component services.

But if you are looking for the virtualization hypervisor named Xen, then you have installed a wrong package.

Note that RHEL/CentOS 8 has no support for Xen PV or PVH modes at all, as RedHat favors KVM over Xen. You could run CentOS 8's standard kernel in HVM mode, but I've understood that would probably be less efficient than the PV/PVH modes. Or you could install kernel-ml from ElRepo; that would allow you to run CentOS 8 within Xen, but would be a necessary but not sufficient step in setting up a CentOS 8-based Xen host.





Comments (2)

  • +0 – Thank you! Im looking for Xen. But yum search xen brings only this package. — Jul 18, 2022 at 13:56  
  • +0 – Please see my edit just now. — Jul 18, 2022 at 14:04