[EDIT2, le 3 mars 2015] On peut trouver ici des informations sur le fonctionnement de Grub2. Cependant la mise en œuvre de la présente notice peut s'avérer délicate du fait des difficultés de codage des chemins d'accès aux fichiers. Le script à interface graphique présenté
sous le titre "[Script/Tuto] Amorcer une image iso sans clé USB ni lecteur de CD-ROM" est plus facile à utiliser. Il peut être judicieux de s'y reporter [/EDIT2]
[EDIT] : les erreurs mentionnées par didli sont corrigées et le problème rencontré par pio_killer est a priori résolu[/EDIT]
I - L'introduction d'options utilisateur dans l'écran de démarrage de Grub2
Grub2 construit l'écran de démarrage à partir du fichier /boot/grub/grub.cfg (pour être plus précis, le nom et la localisation de ce fichier dépendent des paramètres utilisés lors de l'installation de Grub2 par la commande grub-install). De manière standard, cet écran ne présente que les systèmes installés sur le PC, mais vous pouvez y introduire des lignes supplémentaires présentant des options qui vous sont propres, comme la possibilité d'amorcer le PC à partir d'une image iso, directement sans passer par un support externe (CD ou USB).
Vous disposez de deux moyens pour intégrer de nouvelles options à l'écran de démarrage de grub2
- le fichier /etc/grug.d/40_custom, utilisé lors de l'installation ou la mise à jour de Grub2 ; on peut le qualifier de statique dans la mesure où toute modification de ce fichier ne sera prise en compte que lors d'une ultérieure mise à jour de Grub2 (update-grup ou grub-mkconfig)
- le fichier custom.cfg, localisé dans le même répertoire que grub.cfg, lu et interprété à chaque démarrage ; on peut la qualifier de dynamique, dans la mesure où toute modification de ce fichier sera prise en compte à tout démarrage ultérieur du PC
II - Règles de nommage des fichiers dans le langage Grub2
Avant de poursuivre, il convient de préciser que lorsque Grub2 s'exécute, aucun système n'est encore actif, et donc que l'arbre des fichiers GNU/Linux, "/" et tout ce qui y est accroché, n'existe pas. Il n'existe que la structure physique de chacune des partitions avec des répertoires imbriqués les uns dans les autres et des fichiers dans ces répertoires. Exprimé dans le langage Grub2, le chemin d'accès à un fichier se note d'une manière qui rappelle la notation GNU/Linux, tout en en différant par la nécessité de préciser de quelle partition il s'agit. On écrit ainsi (partition)/../../fichier (notation dans laquelle le nom de la partition, généralement de la forme hdx,msdosy, x de 0 à n et y de 1 à p, est inclus dans une paire de parenthèses) pour désigner que le fichier /../../fichier se trouve sur la partition "partition".
Grub2 dispose de la commande search pour trouver la partition sur laquelle se trouve le fichier /.../.../fichier. La notation /.../.../fichier peut ainsi être considérée comme le chemin relatif vers le fichier à partir de la partition dans laquelle il se trouve (reste à savoir laquelle), et non comme dans GNU/Linux, le chemin absolu à partir de la racine. Si votre image iso s'appelle "image.iso" et qu'elle est localisés dans le répertoire "amorces" situé à la racine d'une partition, la commande search appliquée à /amorces/image.iso retourne le nom de la partition en question. Les fonctions que je présente ci-après utilisent la commande search de sorte que
c'est une telle notation relative, /.../.../fichier que vous devez utilisez pour désigner vos propres fichiers.
Enfin, la variable Grub ${prefix} pointe sur le répertoire dans lequel se trouve le fichier grub.cfg. Tout autre répertoire ou fichier contenu dans le même répertoire peut ainsi être désigné par son adresse absolue ${prefix}/répertoire ou ${prefix}/fichier.
III - Méthode proposée
Personnellement j'ai opté pour le fichier custom.cfg, mais le fonctionnement serait identique avec 40_custom. Il reste à savoir comment rédiger ou modifier ce fichier. Dans un premier temps, j'indique comment introduire dans le menu Grub2 une ligne de menu pour l'amorçage avec une seule image iso pour ensuite adapter la méthode à l'utilisation de plusieurs images. Sachez qu'il ne s'agit là que d'une méthode parmi tant d'autres.
Cas 1 : une seule image iso
La méthode proposée ici utilise :
- une image iso, à titre d'exemple, celle de Clonezilla
- le fichier de définition des entrées de menu spécifiques à Clonezilla
- des fonctions Grub2 d'accès aux images iso
- le fichier custom.cfg
a) l'image iso de Clonezilla
Cette image peut être nommée comme bon vous semble et localisée n'importe où dans votre configuration, même sur des systèmes de fichiers FAT ou NTFS, de même d'ailleurs que tous les fichiers mentionnés ici. Dans mon exemple, elle s'appelle "clonezilla-live-20120127-oneiric.iso" et elle est localisée dans un répertoire nommé "amorces". Son chemin d'accès est donc "/amorces/clonezilla-live-20120127-oneiric.iso"
b) le fichier de définition des entrées de menu spécifiques à Clonezilla
Ce fichier peut aussi être nommé et localisé comme vous le souhaitez. Dans mon exemple, il s'appelle "clonezilla-live-20120127-oneiric.loopback.cfg" et est localisé dans le même répertoire qul'utilisation e l'image iso. Son chemin d'accès est donc "/amorces/clonezilla-live-20120127-oneiric.loopback.cfg". J'ai écrit ce fichier à partir des informations présentées
sur le site de Clonezilla et du contenu du fichier /EFI/boot/grub.cfg de l'image iso. Le contenu de ce fichier est présenté ci-dessous
menuentry "Clonezilla live" {
linux /live/vmlinuz boot=live live-config noswap nolocales edd=on nomodeset ocs_live_run=\"ocs-live-general\" ocs_live_extra_param=\"\" ocs_live_keymap=\"/usr/share/keymaps/i386/azerty/fr-latin9.kmap.gz\" ocs_live_batch=\"no\" ocs_lang=\"fr_FR.UTF-8\" vga=788 ip=frommedia nosplash toram=filesystem.squashfs findiso=${iso_path}
initrd /live/initrd.img
}
menuentry "Clonezilla live (Default settings, VGA 800x600)" {
linux /live/vmlinuz boot=live hostname=oneiric live-config quiet noswap nolocales edd=on nomodeset noprompt ocs_live_run=\"ocs-live-general\" ocs_live_extra_param=\"\" ocs_live_keymap=\"\" ocs_live_batch=\"no\" ocs_lang=\"fr_FR\" video=uvesafb:mode_option=800x600-16 ip=frommedia nosplash toram=filesystem.squashfs findiso=${iso_path}
initrd /live/initrd.img
}
menuentry "Clonezilla live (Default settings, VGA 1024x768)" {
linux /live/vmlinuz boot=live hostname=oneiric live-config quiet noswap nolocales edd=on nomodeset noprompt ocs_live_run=\"ocs-live-general\" ocs_live_extra_param=\"\" ocs_live_keymap=\"\" ocs_live_batch=\"no\" ocs_lang=\"fr_FR\" video=uvesafb:mode_option=1024x768-32 ip=frommedia nosplash toram=filesystem.squashfs findiso=${iso_path}
initrd /live/initrd.img
}
menuentry "Clonezilla live (Default settings, VGA 640x480)" {
linux /live/vmlinuz boot=live hostname=oneiric live-config quiet noswap nolocales edd=on nomodeset noprompt ocs_live_run=\"ocs-live-general\" ocs_live_extra_param=\"\" ocs_live_keymap=\"\" ocs_live_batch=\"no\" ocs_lang=\"fr_FR\" video=uvesafb:mode_option=640x480-16 ip=frommedia nosplash toram=filesystem.squashfs findiso=${iso_path}
initrd /live/initrd.img
}
menuentry "Clonezilla live (Safe graphic settings, vga=normal)" {
linux /live/vmlinuz boot=live hostname=oneiric live-config quiet noswap nolocales edd=on nomodeset noprompt ocs_live_run=\"ocs-live-general\" ocs_live_extra_param=\"\" ocs_live_keymap=\"\" ocs_live_batch=\"no\" ocs_lang=\"fr_FR\" vga=normal ip=frommedia nosplash toram=filesystem.squashfs findiso=${iso_path}
initrd /live/initrd.img
}
menuentry "Clonezilla live (Failsafe mode)" {
linux /live/vmlinuz boot=live hostname=oneiric live-config quiet noswap nolocales edd=on nomodeset noprompt ocs_live_run=\"ocs-live-general\" ocs_live_extra_param=\"\" ocs_live_keymap=\"\" ocs_live_batch=\"no\" ocs_lang=\"fr_FR\" acpi=off irqpoll noapic noapm nodma nomce nolapic nosmp ip=frommedia vga=normal ip=frommedia nosplash toram=filesystem.squashfs findiso=${iso_path}
initrd /live/initrd.img
}
Chaque commande menuentry se traduit par une ligne du menu Grub dont le texte est le libellé qui suit immédiatement la commande menuentry. La commande comprend deux lignes de code :
- linux, pour le chargement du noyau,
- et initrd pour l'initialisation de la "ram disk"
Le premier paramètre de l'ordre linux désigne le noyau à utiliser, les autres paramètres sont passés au noyau. Le noyau linux est désigné par /live/vmlinuz. Il s'agit donc du fichier vmlinuz d'un répertoire localisé à la racine d'une partition ; en l'occurrence cette partition est l'image iso elle-même. Une lecture attentive de la page de Clonezilla permet de constater que j'ai modifié la liste de paramètres passés au noyau, et surtout remplacé la variable ${isofile} par la variable ${iso_path} pour me conformer à une normalisation des images iso amorçables avec Grub2 en cours de généralisation. La deuxième commande, initrd, nécessite un paramètre pour désigner le fichier à utiliser pour l'initialisation de la "ram disk". Il s'agit du fichier initrd.img, localisé dans le même répertoire que le fichier noyau vmlinuz.
Ce sont les fonctions Grub2 d'accès aux images, présentées ci-dessous, qui se chargent de définir un périphérique virtuel pointant sur le contenu de l'image, de sorte que la commande search évoquée plus haut saura retrouver la partition sur laquelle se trouve le répertoire live/.
Ces entrées diffèrent les unes des autres essentiellement par la définition de l'écran qui doit être utilisée pour la présentation du menu. Vous pouvez bien sûr supprimer celles qui ne vous conviennent pas.
c) le fichier des fonctions Grub2 d'accès aux images iso
Vous créez dans /boot/grub un répertoire "greffons" et vous y enregistrez un fichier nommé "iso.source.cfg" (donc dont le chemin d'accès est
/boot/grub/greffons/iso.source.cfg) dans lequel vous recopiez le script ci-dessous
#######################################################################################################################
# Avertissement présenté à l'utilisateur si le fichier iso est introuvable, ou n'a pas été donné en paramètre de la commande iso_boot
# Iso file missing
function no_iso_file {
if [ -n "${1}" ] ; then
echo L\'image à partir de laquelle il faut amorcer le PC, ${1}, ne se trouve sur aucun des supports actuellement raccordés à l\'ordinateur.
else
echo Aucune image iso n\'a été attachée au libellé ${chosen} que vous venez de choisir.
fi
}
#######################################################################################################################
# Avertissement présenté à l'utilisateur si le fichier de configuration est introuvable
# Grub configuration file missing
function no_cfg_file {
echo Le fichier de configuration, ${1}, ne se trouve sur aucun des supports actuellement raccordés à l\'ordinateur.
}
#######################################################################################################################
function iso_boot {
#
# Cette procédure crée un periphérique virtuel qui donne accès aux répertoires et fichiers contenu dans le fichier iso
# et cherche le fichier contenant le menu correspondant à l'image iso considérée et l'introduit dans le menu Grub
# paramètre ${1} : le chemin d'accès au fichier iso
# paramètre ${2}, facultatif : le chemin d'accès au fichier contenant les entrées de menu pour l'image iso considérée
# quand il est omis, il s'agit du fichier /boot/grub/loopback.cfg de l'image iso
set image_iso=
set iso_path=${1}
# recherche du fichier iso
if [ -n "${1}" ]; then
# si le fichier ${1} de nom /..../nom existe, alors cela signifie qu'il est sur la partition ${root}
if [ -e ${1} ]; then set image_iso=${root}; else search --file --set=image_iso --no-floppy ${1}; fi
fi
if [ -z "${image_iso}" ]; then no_iso_file ${1}; sleep -v 10; fi
# création du périphérique virtuel qui donne accès au fichier iso
# creation of the virtual device holding the iso file and paths initialisation
loopback iso (${image_iso})${1}
set root=iso,msdos1
set loopcfg=
# recherche et introduction du menu spécifique à l'image iso considérée
if [ -z "${2}" ]; then set sourcefile=/boot/grub/loopback.cfg; else set sourcefile=${2}; fi
# si le fichier se trouve sur le périphérique $root, il n'est pas utile de le chercher
if [ -e ${sourcefile} ]; then set loopcfg=${root} ; else search --file --set=loopcfg --no-floppy ${sourcefile} ; fi
if [ -z "${loopcfg}" ]; then no_cfg_file ${sourcefile}; sleep -v 10; else source (${loopcfg})${sourcefile}; fi
}
d) le fichier custom.cfg
Vous créez, s'il n'existe pas déjà, le fichier /boot/grub/custom.cfg et vous y introduisez le code ci-dessous
source ${prefix}/greffons/config.menu.cfg
submenu 'clonezilla-live-20120127-oneiric' {iso_boot /amorces/clonezilla-live-20120127-oneiric.iso /amorces/clonezilla-live-20120127-oneiric.loopback.cfg}
La commande "source ${prefix}/greffons/config.menu.cfg" ordonne à Grub2 de lire et d'interpréter le fichier source ${prefix}/greffons/config.menu.cfg dans lequel est définie la fonction iso_boot utilisée dans la commande submenu qui suit. ${prefix} est une variable de grub. Elle désigne la partition dans laquelle grub a trouvé
La commande submenu se traduit par une ligne dans le menu Grub2, ligne qui, sélectionnée, déclenche l'affichage des lignes menuentry définies dans le fichier /amorces/clonezilla-live-20120127-oneiric.loopback.cfg que nous avons vu précédemment.
Cas 2 : plusieurs images iso
Lorsque l'on veut étendre la méthode pour englober plusieurs images iso, on peut bien sûr introduire de nouvelles lignes faisant appel à la fonction iso_boot. Ces lignes doivent être de la forme
submenu 'titre du menu' {iso_boot /chemin_accès_image.iso /chemin_accès_fichier_loopback.cfg}
ou simplement
submenu 'titre du menu' {iso_boot /chemin_accès_image.iso}
lorsque l'image iso contient le fichier /boot/boot/loopback.cfg. Une normalisation est en effet en cours, pour introduire dans les images iso amorçables un fichier /boot/grub/loopback.cfg. Cette normalisation tend aussi à utiliser la variable ${iso_path} dans les paramètres d'appel du noyau, et non ${isofile} comme indiqué sur le site de Clonezilla. Bien évidemment, cette normalisation n'était pas encore en vigueur lors de la création de l'image iso de clonezilla dont je me suis servi.
Mais lorsque ces lignes deviennent trop nombreuses, on peut les déporter dans un nouveau fichier, par exemple dans /boot/grub/greffons/iso.menu.cfg et modifier le fichier custom.cfg en conséquence :
source ${prefix}/greffons/iso.source.cfg
source ${prefix}/greffons/iso.menu.cfg
Et on crée le fichier /boot/grub/greffons/iso.menu.cfg avec un contenu tel que
submenu 'Fichiers iso' {
submenu 'Ubuntu' {
submenu 'lubuntu-11.10-desktop-i386' {iso_boot /amorces/lubuntu-11.10-desktop-i386.iso}
submenu 'ubuntu-11.10-desktop-i386-fr' {iso_boot /amorces/ubuntu-11.10-desktop-i386-fr.iso /amorces/ubuntu-11.10-desktop-i386-fr.loopback.cfg}
submenu 'ubuntu-securisee-10.10' {iso_boot /amorces/ubuntu-securisee-10.10.iso}
}
submenu 'boot-repair-disk' {iso_boot /amorces/boot-repair-disk.iso /amorces/boot-repair-disk.loopback.cfg}
submenu 'clonezilla-live-20120127-oneiric' {iso_boot /amorces/clonezilla-live-20120127-oneiric.iso /amorces/clonezilla-live-20120127-oneiric.loopback.cfg}
submenu 'grml96_2011.12' {iso_boot /amorces/grml96_2011.12.iso /boot/grub/grub.cfg}
submenu 'linuxmint-10-kde-dvd-amd64' {iso_boot amorces/linuxmint-10-kde-dvd-amd64.iso}
submenu 'system-rescue' {iso_boot /amorces/systemrescuecd-x86-2.5.0.iso /amorces/systemrescuecd-x86-2.5.0.loopback.cfg}
}
Ce code regroupera tous les éléments de menu relatifs aux fichiers iso dans une seule ligne du menu principal, de titre "Fichiers iso". La sélection de cette ligne entraînera l'apparition d'un second menu dans lequel les distributions Ubuntu seront regroupées dans une seule ligne, "Ubuntu", et ainsi de suite.
On s'aperçoit que dans l'ordre relatif à la distribution "lubuntu-11.10-desktop-i386", la fonction iso_boot n'a qu'un seul arguement, le fichier iso à utiliser. La raison en est que l'image contient un fichier /boot/grub/loopback.cfg, utilisé par défaut par la fonction iso_boot.
Lorsque tel n'est pas le cas, il faut trouver le nom et la localisation du noyau et du fichier initrd dans l'image iso, les paramètres à passer à la commande linux de chargement du noyau et coder les entrées de menu correspondantes dans un fichier loopback.cfg, qui lui, doit être passé comme deuxième paramètre à la fonction iso_boot.
Je n'ai pas encore réussi à mettre au point l'ensemble des fichiers loopback.cfg mentionnés ci-dessus. Merci à ceux d'entre vous qui auraient le temps de le faire et de les communiquer dans la présente discussion. Je viendrai moi aussi ajouter les fichiers au fur et à mesure de leur mise au point.
Arbiel