Je définis le dossier /boot/grub/greffons dans lequel j'enregistre les scripts que je veux utiliser.
Dans le cas présent, j'utilise deux scripts, un script qui définit des fonctions et un script qui les utilise.
Ces scripts font apparaître dans le menu principal (je veux dire le premier menu affiché par Grub) une ligne
Fichiers cfg
qui, choisie, provoque l'affichage d'un second menu énumérant les fichiers grub.cfg présents dans la configuration, et différents du fichier grub.cfg courant.
J'avais initialement prévu de n'utiliser de sous-menu que lorsqu'il y a le choix entre plusieurs fichiers et d'afficher au niveau du menu principal le choix du seul fichier grub.cfg trouvé, lorsque tel était le cas. J'ai finalement opté pour ce sous-menu, quel que soit le nombre de fichiers trouvés, mais je n'ai pas purgé le code des lignes qui visait à faire cette distinction.
L'utilisation de la touche "Majuscule" fait apparaître un message indiquant, en début d'exécution du fichier grub.cfg, de quel fichier il s'agit.
Le script des fonctions, nommé "fonctions_config.cfg" est le suivant :
##############################################################################
#
# Dénombrement des autres fichiers grub.cfg
#
##############################################################################
function denombre_cfg {
set config_nbr=
insmod regexp
for device in (*); do
# il ne faut pas compter le fichier actuel
if [ "${device}/boot/grub" != "${prefix}" ]; then
if [ -e ${device}/boot/grub/grub.cfg ]; thenfonctions_config.cfg
if [ -z ${config_nbr} ]; then set config_nbr=1; else set config_nbr=2; fi
# si une seule ligne, config_nbr = 1, sinon config_nbr = 2
fi
fi
done
}
##############################################################################
#
# Recherche des fichiers de configuration grub.cfg et constitution du menu
#
##############################################################################
function config_cfg {
insmod regexp
for device in (*); do
if [ -e ${device}/boot/grub/grub.cfg ]; then
probe --set=uuid --fs-uuid "$device"
if probe --set=label --label "$device"; then
menuentry "${device}[${label}]{${uuid}}" "${device}" {
if keystatus --shift; then echo "exécution du fichier ${1}/boot/grub/grub.cfg"; sleep 5; fi
set prefix=${2}/boot/grub
export prefix
configfile ${2}/boot/grub/grub.cfg
}
fi
fi
done
}
Le script qui utilise ces fonctions, config.menu.cfg contient le code ci-dessous
source ${prefix}/greffons/fonctions_config.cfg
denombre_cfg
if [ -n "${config_nbr"} ]; then
submenu 'Fichiers cfg' {
config_cfg
}
fi
On peut bien évidemment fusionné ces deux scripts en remplaçant la ligne
source ${prefix}/greffons/fonctions_config.cfg
par le fichier fonctions_config.cfg.
L'intégration dans le fichier grub.cfg passe par l'introduction dans le fichier /boot/grub/custom.cfg d'une ligne (après création éventuelle de ce fichier s'il n'existe pas)
source ${prefix}/greffons/config.menu.cfg
Arbiel