Ceci est une ancienne révision du document !
Contrôle du nombre de noyaux ubuntu affichés dans le menu de grub
On s'intéresse ici au script /etc/grub.d/10_linux. Ce script génère les éléments du menu relatifs au système sur lequel on est.
Annexe à grub-pc : exemples de scripts d'autoconfiguration
Compléments à la documentation grub-pc.
Cette annexe donne des exemples de fichiers de génération du menu de boot. Ces scripts sont placés dans le répertoire /etc/bootd et doivent être validés en exécution. La génération du fichier /boot/grub/grub.cfg se fait par la commande:
sudo upgrade-grub
La sortie de la commande permet de contrôler les éléments qui seront placés dans le menu.
Faire apparaître un nombre fixe de noyaux du système en cours
On modifie ici le scripts /etc/boot.d/10_linux livré avec ubuntu 9.10 de façon à n'afficher que les NBLISTMAX derniers noyaux du système ubuntu en cours.
Nouveaux paramètres introduits dans le script
1) NBLISTMAX:
Nombre de noyaux à afficher dans le menu.
2) PREFILTER et POSTFILTER:
Filtre sur le nom du noyau permettant de sélectionner les noyaux du système sur lequel on est, dans le cas ou la partition /boot est commune à plusieurs systèmes distincts.
Dans le cas de ubuntu Karmic, on a: PREFILTER="-2.6.31-" et POSTFILTER="-generic"
Nota: ces paramètres peuvent être mis à "" si /boot ne contient que les noyaux d'un unique système.
code du script /etc/grub.d/10_linux modifié
#! /bin/sh -e # grub-mkconfig helper script. # Copyright (C) 2006,2007,2008,2009 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/>. #Modification-start # Number of version to display - can be changed to desired value NBLISTMAX=$((2)) # pre-filtering for kernel to use - can be changed to desired value PREFILTER="-2.6.31-" # post-filtering for kernel to use - can be changed to desired value POSTFILTER="-generic" # Intermediate variable - do not change NBLIST=$((0)) #Modification-end prefix=/usr exec_prefix=${prefix} libdir=${exec_prefix}/lib . ${libdir}/grub/grub-mkconfig_lib if [ "x${GRUB_DISTRIBUTOR}" = "x" ] ; then OS=GNU/Linux else OS="${GRUB_DISTRIBUTOR}" 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}" \ || [ "`grub-probe -t abstraction --device ${GRUB_DEVICE} | sed -e 's,.*\(lvm\).*,\1,'`" = "lvm" ] ; then LINUX_ROOT_DEVICE=${GRUB_DEVICE} else LINUX_ROOT_DEVICE=UUID=${GRUB_DEVICE_UUID} fi # add crashkernel option if we have the required tools if [ -x "/usr/bin/makedumpfile" ] && [ -x "/sbin/kexec" ]; then GRUB_CMDLINE_EXTRA="$GRUB_CMDLINE_EXTRA crashkernel=384M-2G:64M,2G-:128M" fi linux_entry () { cat << EOF menuentry "$1" { recordfail=1 if [ -n \${have_grubenv} ]; then save_env recordfail; fi EOF if [ "x$3" = "xquiet" ]; then cat << EOF set quiet=1 EOF fi save_default_entry | sed -e "s/^/\t/" prepare_grub_to_access_device ${GRUB_DEVICE_BOOT} | sed -e "s/^/\t/" cat << EOF linux ${rel_dirname}/${basename} root=${linux_root_device_thisversion} ro $2 EOF if test -n "${initrd}" ; then cat << EOF initrd ${rel_dirname}/${initrd} EOF fi cat << EOF } EOF } list=`for i in /boot/vmlinu[xz]${PREFILTER}*${POSTFILTER} /vmlinu[xz]${PREFILTER}*${POSTFILTER} ; do if grub_file_is_not_garbage "$i" ; then echo -n "$i " ; fi done` while [ "x$list" != "x" ] ; do #LL-start NBLIST=$((NBLIST+1)) # echo "NBLIST = $NBLIST" >&2 linux=`version_find_latest $list` if [ "$NBLIST" -le "$NBLISTMAX" ] ; then echo "Found linux image: $linux" >&2 #LL-end 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}, Linux ${version}" \ "${GRUB_CMDLINE_LINUX} ${GRUB_CMDLINE_EXTRA} ${GRUB_CMDLINE_LINUX_DEFAULT}" \ quiet if [ "x${GRUB_DISABLE_LINUX_RECOVERY}" != "xtrue" ]; then linux_entry "${OS}, Linux ${version} (recovery mode)" \ "single ${GRUB_CMDLINE_LINUX}" fi #LL-start fi #LL-end list=`echo $list | tr ' ' '\n' | grep -vx $linux | tr '\n' ' '` # echo "liste: $list" >&2 done