Aller plus loin avec GRUB/Des commandes de l'exemple
Nous nous proposons ici de comprendre plus en détail les commandes de l'exemple, maintenant que les notions de modules et de commandes ont été expliquées au chapitre précédent.
Autrement dit, nous nous intéressons plus spécifiquement aux commandes de l'exemple.
Commande load_video
[modifier | modifier le wikicode] # load_video est une commande qui charge divers drivers liés à l'affichage vidéo.
load_video
La commande load_video ne semble être ni une commande, ni un module ordinaire. Cet appel semble donc mystérieux pour le moment.
Commande insmod
[modifier | modifier le wikicode] # insmod est une commande qui charge un module dynamique du noyau. gzio est un nom de module sur ce système.
insmod gzio
# Chargement conditionnel de modules de décompression
if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
# Chargement du module liés aux systèmes de partitions de disques du DOS
insmod part_msdos
# Chargement du module lié au système de fichiers ext2.
insmod ext2
La commande insmod
est fournie par le fichier kern/corecmd.c
.
Sa documentation anglaise indique un paramètre: MODULE
et une description "Insert a module."
.
Elle est implémentée dans une fonction grub_core_cmd_insmod
.
Cette fonction renvoie une erreur si aucun argument n'est donné.
Si le premier caractère du premier argument est un /, un ( ou un +, le chargement s'effectue à partir d'un fichier.
Sinon, il s'agit d'un chargement du module.
Commande set
[modifier | modifier le wikicode] # Définition d'une racine, sur un disque hd0 et sur une partition msdos1
set root='hd0,msdos1'
La commande set
est fournie par le fichier kern/corecmd.c
.
Sa documentation anglaise indique un paramètre: [ENVVAR=VALUE]
et une description "Set an environment variable."
.
Elle est implémentée dans une fonction grub_core_cmd_set
.
Suivant le cas:
- En l'absence d'argument, cette fonction peut afficher la liste des variable d'environnement sous la forme
nom=valeur
et renvoie la valeur 0. - En présence d'argument, si l'argument ne contient pas le caractère "=", cette fonction renvoie une erreur.
- En présence d'argument, si l'argument contient le caractère "=", la variable d'environnement présente avant le caractère "=" est positionnée à la valeur présente après le caractère "=", par la fonction
grub_env_set
.
Commande search
[modifier | modifier le wikicode] # Conditionne un traitement à la valeur de la variable $feature_platform_search_hint comparé à la lettre 'y' signifiant "oui".
if [ x$feature_platform_search_hint = xy ]; then
# Les deux branches de l'alternative sont équivalentes, mais la première utilise des options --hint-
search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 074e5a60-b0b8-4876-8673-bec4bc8394a5
else
search --no-floppy --fs-uuid --set=root 074e5a60-b0b8-4876-8673-bec4bc8394a5
fi
Le manuel de documentaiton en langue anglaise démystifie la commande:
La commande search
sert à chercher un périphérique (device en anglais).
L'option set
permet de positionner une variable d'environnement avec le device trouvé.
L'option -n
évite les cherches sur disquettes.
L'option --efidisk-only
quand elle est disponible limite la recherche aux disques EFI.
Les options --hint
permette d'orienter ou privilégier certains disques pour la recherche.
Le fait de terminer une option hint avec une virgule permet de rechercher toutes les partitions du disque.
La commande search
est fournie par le fichier commands/search_wrap.c
.
Cette commande a les particularités suivantes: GRUB_COMMAND_FLAG_EXTRACTOR | GRUB_COMMAND_ACCEPT_DASH
.
Sa documentation embarquée en anglaise indique le paramétrage: [-f|-l|-u|-s|-n] [--hint HINT [--hint HINT] ...] NAME
Sa documentation embarquée en anglaise la décrit ainsiSearch devices by file, filesystem label or filesystem UUID.
If --set is specified, the first device found is set to a variable. If no variable name is specified, `root' is used.
.
Elle est implémentée dans une fonction grub_cmd_search
dont les 110 lignes suggèrent une relative complexité.
Cette fonction récupère une liste de hints
.
Cette fonction renvoie une erreur en cas d'échec d'allocation mémoire pour les hints
.
- Si un argument hors hint est donné, cet argument est utilisé comme id. Si le "set" est paramétré cette variable est utilisée, sinon
root
est utilisé. - Si aucun argument hors hint n'est donné, et si le "set" est positionné avec un argument, L4arguement est utilisé comme id, root est utilisé comme variable.
- Dans les les cas contraire, une erreur est retournée:
one argument expected
.
Ensuite 2 cas de figure se présentent:
- Soit une recherche est spécifiée et effectuée
- Soit une erreur est retournée:
unspecified search type
.
La recherche est considérée comme spécifiée si une option label, FS_UUID ou file est spécifiée.
Dans ce cas, la recherche s'effectue sans disquette, avec l'id et la variable et les hints
.
Le même algorithme de recherche est utilisé dans les trois cas; il s'agit de la fonction try
de 69 lignes qui peut être appelée avec ou sans autoload.
Pour simplifier, cette fonction utilise notamment chacun des hints
pour y rechercher le fichier, le FS_UUID ou le label, soit directement dans le device, soit dans le cas d'un disque sur ses partitions.
Finalement, la valeur retourne le code d'erreur.
Commande echo
[modifier | modifier le wikicode] # Affiche le chargement en cours d'une version d'un noyau Linux
echo 'Loading Linux 5.10.0-17-rt-amd64 ...'
La commande echo
est fournie par le fichier commands/echo.c
.
Cette commande a les caractéristiques GRUB_COMMAND_ACCEPT_DASH | GRUB_COMMAND_OPTIONS_AT_START
.
Sa documentation anglaise indique un paramètre: [-e|-n] STRING
et une description Display a line of text.
.
La documentation de l'option -n indique Do not output the trailing newline.
.
La documentation de l'option -e indique Enable interpretation of backslash escapes
.
Elle est implémentée dans une fonction grub__cmd_echo
.
Cette fonction renvoie une erreur en cas d'échec de l'allocation mémoire.
Elle traite chaque caractère de chaque argument.
Si l'option -e
est utilisée, les backslash sont pris en compte pour \\0, \, \a, \c, \f, \n, \r, \t, et \v.
L'ensemble des caractères sont affichés sur la sortie, à l'exception de \c qui supprime le retour à la ligne final.
Un espace est inséré entre chaque argument.
La fonction retourne 0 en cas de succès.
Commande linux
[modifier | modifier le wikicode] # Active le chargement d'un noyau Linux /boot/vmlinuz-5.10.0-17-rt-amd64
# ... avec une option root pour préciser la partition racine
# ... avec d'autres options à détailler par la suite.
linux /boot/vmlinuz-5.10.0-17-rt-amd64 root=UUID=074e5a60-b0b8-4876-8673-bec4bc8394a5 ro vga=normal nomodeset quiet apparmor=1 security=apparmor
La commande linux
est fournie par le fichier lib/syslinux_parse.c
.
Elle est implémentée dans une fonction cmd_linux
.
Cette fonction renvoie une erreur:
- en l'absence d'entrée
- en cas d'erreur d'allocation pour duplication de la ligne
Elle duplique la ligne pour indiquer le fichier du kernel Linux. Dans ce cas, elle renvoie l'absence d'erreur.
Commande initrd
[modifier | modifier le wikicode] # Affiche le chargement d'un disque initial en mémoire RAM
echo 'Loading initial ramdisk ...'
# Chargement initial du disque /boot/initrd.img-5.10.0-17-rt-amd64
initrd /boot/initrd.img-5.10.0-17-rt-amd64
La commande initrd
est fournie par le fichier lib/syslinux_parse.c
.
Elle est implémentée dans une fonction cmd_initrd
.
Cette fonction renvoie une erreur:
- en l'absence d'entrée
- en cas d'erreur d'allocation mémoire
Elle sépare la ligne suivant les caractères virgule qu'elle contient. Une liste chaînée est constituée avec le premier fichier et le dernier. Dans ce cas, elle renvoie l'absence d'erreur.