Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
grub-pc-annexe [Le 10/01/2010, 20:31]
lucge mutliboot lvm avec opensuse ou fedora
— (Version actuelle)
Ligne 1: Ligne 1:
-====== Annexe à grub-pc : exemples de scripts d'​autoconfiguration ====== 
-{{tag>​grub boot karmic}} 
  
-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/grub.d et doivent être validés en exécution. 
-La génération du fichier /​boot/​grub/​grub.cfg se fait par la commande: 
- 
-<​code>​ 
-sudo update-grub 
-</​code>​ 
- 
-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/​grub.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. Le script sélectionne automatiquement les NBLISTMAX derniers noyaux du système en cours. 
- 
-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é ==== 
- 
- 
-<​code>​ 
-#! /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 
-</​code>​ 
- 
-===== Distributions OpenSuse ou Fedora en mutiboot LVM à partir d'une partition /boot commune===== 
- 
-Pour réaliser un multiboot de plusieurs distributions linux en LVM, il est souvent commode de créer une partition primaire /boot commune à toutes ces distributions et à partir de laquelle il sera possible de booter. 
-Karmic dispose d'un script permettant de traiter le cas des autres OS que le système en cours. Cependant, dans sa version actuelle, il ne sait traiter que windows et ubuntu. Les autres distributions linux se traduisent par le message suivant: 
-<​code>​ 
-Found openSUSE 11.2 (i586) on /​dev/​mapper/​GB-linux3 
-  openSUSE 11.2 (i586) is not yet supported by grub-mkconfig. 
-Found Mandriva Linux 2010.0 (2010.0) on /​dev/​mapper/​GB-linux4 
-  Mandriva Linux 2010.0 (2010.0) is not yet supported by grub-mkconfig. 
-Found Fedora release 12 (Constantine) on /​dev/​mapper/​Hitachi-hi_linux2 
-  Fedora release 12 (Constantine) is not yet supported by grub-mkconfig. 
-</​code>​ 
-Le script qui suit permet de traiter individuellement le cas des distributions OpenSuse et Fedora. 
-Il sera nécessaire de créer un script distinct par distribution. Chacun de ces scripts devra être plaçé dans /etc/grub.d 
- 
-====  paramètres du script ==== 
-1) NBLISTMAX: ​ 
- 
-Nombre de noyaux à afficher dans le menu. Le script sélectionne automatiquement les NBLISTMAX derniers noyaux du système en cours. 
- 
-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 Fedora 12, on a: PREFILTER="​-2.6.31."​ et POSTFILTER="​.fc12.i686"​ 
-Dans le cas de OpenSuse 11.2, on a: PREFILTER="​-2.6.31."​ et POSTFILTER="​-default"​ 
- 
-3) UUID_BOOT 
-Il s'agit de l'uuid de la partition /boot commune. 
-Il est possible de lister les uuid des différentes partitions du système par la commande: 
- 
-<​code>​ 
-sudo blkid 
-</​code>​ 
- 
-Il sera nécessaire de recopier le code uuid obtenu de /boot dans le paramètre UUID_BOOT du script. 
- 
-4) UUID_LINUX 
-Il s'agit de l'uuid de la partition / dans laquelle la distribution considérée a été installés. 
-De même que pour /boot, il sera nécessaire de recopier le code uuid obtenu pour cette partition dans le paramètre UUID_LINUX du script. 
- 
-5) OPTIONS 
-Il s'agit des paramètres spécifiques à passer au noyau linux de la distribution considérée. 
-Dans le cas de Fedora 12, on a OPTIONS="​LANG=fr_FR.UTF-8 SYSFONT=latarcyrheb-sun16 KEYBOARDTYPE=pc KEYTABLE=fr rhgb quiet" 
-Dans le cas de OpenSuse 11.2, on a OPTIONS="​splash=silent quiet showopts vga=0x317"​ 
- 
-6) DISTRIBUTION 
-Ce paramètre représente le nom de la distribution à insérer dans le menu grub: 
-On pourra avoir DISTRIBUTION="​OpenSuse 11.2" ou DISTRIBUTION="​Fedora 12" selon la distribution considérée. 
- 
-Le script donné ci-après est celui correspondant à Fedora 12. Il pourra être aisément adapté pour OpenSuse en créant un autre script 17_opensuse avec les paramètres adaptés. 
- 
- 
- 
-==== code du script /​etc/​grub.d/​15_fedora ==== 
-<​code>​ 
-#! /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/>​. 
- 
-#LL-start 
-# Paramètres programmables 
-NBLISTMAX=$((1)) 
-POSTFILTER="​.fc12.i686"​ 
-PREFILTER="​-2.6.31."​ 
-MODULES="​ext2"​ 
-DISTRIBUTION="​Fedora 12" 
-UUID_BOOT="​cde325b7-cf67-4bbe-b490-308425afb22e"​ 
-UUID_LINUX="​dc45a507-d8d6-4f9e-80f1-0a1f0ae23dcb"​ 
-OPTIONS="​LANG=fr_FR.UTF-8 SYSFONT=latarcyrheb-sun16 KEYBOARDTYPE=pc KEYTABLE=fr rhgb quiet" 
-# Variables intermédiaires 
-NBLIST=$((0)) 
-#LL-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 
-  NBLIST=$((NBLIST+1)) 
-  linux=`version_find_latest $list` 
-  if [ "​$NBLIST"​ -le "​$NBLISTMAX"​ ] ; then 
-    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}"​ \ 
-    "​initramfs-${alt_version}.img"​ "​initramfs-${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 
- 
-    cat << EOF 
-menuentry "​${DISTRIBUTION} - ${version}"​ { 
- insmod ${MODULES} 
- search --no-floppy --fs-uuid ${UUID_BOOT} --set root  
- linux /​${basename} ro root=/​dev/​disk/​by-uuid/​${UUID_LINUX} ${OPTIONS} ​ 
- initrd /​${initrd} ​ 
-} 
-EOF 
- 
- 
-    if [ "​x${GRUB_DISABLE_LINUX_RECOVERY}"​ != "​xtrue"​ ]; then 
-      linux_entry "​Fedora 12 ${version} (recovery mode)" \ 
- "​single ${GRUB_CMDLINE_LINUX}"​ 
-    fi 
-  fi 
-  list=`echo $list | tr ' ' '​\n'​ | grep -vx $linux | tr '​\n'​ ' '` 
-done 
-</​code>​ 
  • grub-pc-annexe.1263151915.txt.gz
  • Dernière modification: Le 18/04/2011, 14:51
  • (modification externe)