XCP-ng
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Register
    • Login

    Booting into Xen with grub2-mkconfig 2.03 on centos8 x86_64

    Scheduled Pinned Locked Moved Compute
    3 Posts 2 Posters 1.0k Views 2 Watching
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • brunocekB Offline
      brunocek
      last edited by

      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://unix.stackexchange.com/questions/710283/booting-into-xen-with-grub2-mkconfig-2-03-on-centos8-x86-64

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

      1 Reply Last reply Reply Quote 0
      • DanpD Danp moved this topic from Installation on
      • brunocekB Offline
        brunocek
        last edited by

        Our wiki needs some updates on what is supported. I will try to help there.

        Is Xen alive? Or is it now OpenStack?

        Which Linuxes are native Xen? I guess Gentoo is, but are Debian and Fedora the same?


        On the question I asked, on stackoverflow I have got:
        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.

        1 Reply Last reply Reply Quote 0
        • olivierlambertO Offline
          olivierlambert Vates 🪐 Co-Founder CEO
          last edited by

          PV mode is dead, HVM is faster anyway (with PV drivers).

          Note this is not posted in the right category, since we talk mainly about XCP-ng and not Xen in a general distro 🙂

          1 Reply Last reply Reply Quote 0
          • First post
            Last post