Aller au contenu

Aller plus loin avec GRUB/Des commandes de l'exemple

Un livre de Wikilivres.

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.

                # 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.
[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.

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