Take the 2-minute tour ×
Server Fault is a question and answer site for professional system and network administrators. It's 100% free, no registration required.

I know that I can add command line parameters to the grub2 command line by editing /etc/default/grub according to this answer

How do I add a boot parameter to grub2 in Ubuntu 10.10?

However, that would apply to ALL kernels would it not?

How do I apply the command line parameters to specific kernels? i.e. only xen.

I'm wanting to append something like:

xen-pciback.hide=(06:00.0)

I'm guessing I need to add it somewhere in the file:

/etc/grub.d/20_linux_xen

Which contains:

#! /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/>.

prefix=/usr
exec_prefix=${prefix}
bindir=${exec_prefix}/bin
libdir=${exec_prefix}/lib
. ${libdir}/grub/grub-mkconfig_lib

export TEXTDOMAIN=grub
export TEXTDOMAINDIR=${prefix}/share/locale

CLASS="--class gnu-linux --class gnu --class os --class xen"

if [ "x${GRUB_DISTRIBUTOR}" = "x" ] ; then
  OS=GNU/Linux
else
  OS="${GRUB_DISTRIBUTOR} GNU/Linux"
  CLASS="--class $(echo ${GRUB_DISTRIBUTOR} | tr '[A-Z]' '[a-z]' | cut -d' ' -f1) ${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/"`
    # We can't cope with devices loop-mounted from files here.
    case ${GRUB_DEVICE} in
      /dev/*) ;;
      *) exit 0 ;;
    esac
  ;;
esac

if [ "x${GRUB_DEVICE_UUID}" = "x" ] || [ "x${GRUB_DISABLE_LINUX_UUID}" = "xtrue" ] \
    || ! test -e "/dev/disk/by-uuid/${GRUB_DEVICE_UUID}" \
    || uses_abstraction "${GRUB_DEVICE}" lvm; then
  LINUX_ROOT_DEVICE=${GRUB_DEVICE}
else
  LINUX_ROOT_DEVICE=UUID=${GRUB_DEVICE_UUID}
fi

linux_entry ()
{
  os="$1"
  version="$2"
  xen_version="$3"
  recovery="$4"
  args="$5"
  xen_args="$6"
  if ${recovery} ; then
    title="$(gettext_quoted "%s, with Xen %s and Linux %s (recovery mode)")"
  else
    title="$(gettext_quoted "%s, with Xen %s and Linux %s")"
  fi
  printf "menuentry '${title}' ${CLASS} {\n" "${os}" "${xen_version}" "${version}"
  if ! ${recovery} ; then
      save_default_entry | sed -e "s/^/\t/"
  fi

  if [ -z "${prepare_boot_cache}" ]; then
    prepare_boot_cache="$(prepare_grub_to_access_device ${GRUB_DEVICE_BOOT} | sed -e "s/^/\t/")"
  fi
  printf '%s\n' "${prepare_boot_cache}"
  xmessage="$(gettext_printf "Loading Xen %s ..." ${xen_version})"
  lmessage="$(gettext_printf "Loading Linux %s ..." ${version})"
  cat << EOF
        echo    '$xmessage'
        multiboot       ${rel_xen_dirname}/${xen_basename} placeholder ${xen_args}
        echo    '$lmessage'
        module  ${rel_dirname}/${basename} placeholder root=${linux_root_device_thisversion} ro ${args}
EOF
  if test -n "${initrd}" ; then
    message="$(gettext_printf "Loading initial ramdisk ...")"
    cat << EOF
        echo    '$message'
        module  ${rel_dirname}/${initrd}
EOF
  fi
  cat << EOF
}
EOF
}

linux_list=`for i in /boot/vmlinu[xz]-* /vmlinu[xz]-* ; do
        basename=$(basename $i)
        version=$(echo $basename | sed -e "s,^[^0-9]*-,,g")
        if grub_file_is_not_garbage "$i" && grep -qx "CONFIG_XEN_DOM0=y" /boot/config-${version} 2> /dev/null ; then echo -n "$i " ; fi
      done`
xen_list=`for i in /boot/xen*; do
        if grub_file_is_not_garbage "$i" ; then echo -n "$i " ; fi
      done`
prepare_boot_cache=

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"`
    echo "submenu \"Xen ${xen_version}\" {"
    while [ "x$list" != "x" ] ; do
        linux=`version_find_latest $list`
        echo "Found linux image: $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}" "initrd.img-${alt_version}" \
            "initrd-${alt_version}.img" "initrd-${alt_version}"; do
            if test -e "${dirname}/${i}" ; then
                initrd="$i"
                break
            fi
        done
        if test -n "${initrd}" ; then
            echo "Found initrd image: ${dirname}/${initrd}" >&2
        else
    # "UUID=" magic is parsed by initrds.  Since there's no initrd, it can't work here.
            linux_root_device_thisversion=${GRUB_DEVICE}
        fi

        linux_entry "${OS}" "${version}" "${xen_version}" false \
            "${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}" true \
                "single ${GRUB_CMDLINE_LINUX}" "${GRUB_CMDLINE_XEN}"
        fi

        list=`echo $list | tr ' ' '\n' | grep -vx $linux | tr '\n' ' '`
    done
    echo "}"
    xen_list=`echo $xen_list | tr ' ' '\n' | grep -vx $current_xen | tr '\n' ' '`
done
share|improve this question
    
Great, this is what i was looking for. Thanks a bunch! –  user134777 Sep 5 '12 at 14:08

2 Answers 2

up vote 6 down vote accepted

To answer my own question.

Add: GRUB_CMDLINE_XEN="xen-pciback.hide=(06:00.0)"

to: /etc/default/grub

Then run update-grub to commit the changes.

share|improve this answer
    
exactly what I needed, thanks! –  Steven Rosato May 4 '12 at 6:22

Regarding to the /etc/grub.d/20_linux_xen script, you should define parameters for each image:

  • GRUB_CMDLINE_LINUX_DEFAULT = basic kernel
  • GRUB_CMDLINE_LINUX = basic kernel, included in "recovery"
  • GRUB_CMDLINE_LINUX_XEN_REPLACE_DEFAULT = kernel using Xen hypervisor
  • GRUB_CMDLINE_LINUX_XEN_REPLACE = kernel w/ Xen, incl. in "recovery"
  • GRUB_CMDLINE_XEN_DEFAULT = Xen hypervisor (xen.gz)
  • GRUB_CMDLINE_XEN = Xen hypervisor, incl. in "recovery"

For example, /etc/default/grub:

GRUB_CMDLINE_LINUX_DEFAULT=""
GRUB_CMDLINE_LINUX=""
GRUB_CMDLINE_LINUX_XEN_REPLACE_DEFAULT="xen-pciback.permissive xen-pciback.passthrough=1 xen-pciback.hide=(01:00.0)(01:00.1) 'pci=resource_alignment=01:00.0,01:00.1'"
GRUB_CMDLINE_LINUX_XEN_REPLACE=""
GRUB_CMDLINE_XEN_DEFAULT="'dom0_mem=8192M,max:8192M' xsave=1 iommu=1 dom0_max_vcpus=4 dom0_vcpus_pin"
GRUB_CMDLINE_XEN=""

The only one inconvenience are symbolic links to xen-x.x.x.gz, when grub2-mkconfig will generate a couple of records. Probably the only one solution is delete these links, removing them seems to be safe.

Note: kernel and initrd images are detected only while has been correctly named, as I mentioned here.

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.