Si vous avez un multi-boot utilisant grub2 sur votre machine et que vous souhaitez démarrer automatiquement sous un système d’exploitation suivant l’heure, le jour ou bien le mois de votre choix, ceci est possible. Lors de l’amorçage de grub2 les fichiers de configuration situé dans /etc/grub.d/ sont exécutés dans l’ordre numérique. Le premier fichier 00_header déterminant le système d’exploitation par défaut, on peut court-circuiter sont fonctionnement en créant un petit script 01_date_based_selection par exemple s’exécutant juste à près le premier. Ce petit script aura besoin de connaitre la date actuelle, ce qui peut se faire en utilisant le module datehook qui permet d’avoir accès aux variables entières DAY, HOUR, MINUTE, MONTH, SECOND, YEAR ainsi que qu’à la chaine de caractères WEEKDAY retournant (Monday, Thuesday…). Il nous reste encore à déterminer les entrées présentes dans le menu de grub grâce à la commande :
grep -E '^menuentry|^submenu' /boot/grub/grub.cfg | cut -d '"' -f2 | cut -d "'" -f2
qui pourrait nous retourner par exemple :
Ubuntu openSUSE 12.3 Microsoft Windows XP Professionnel (on /dev/sda1) Windows 7 (loader) (on /dev/sda2)
Notre script final à placer dans /etc/grub.d/ et qui sera bien entendu rendu exécutable pourra ressemble à ce qui suit si par le plus grand des hasard vous donnez des cours sous Windows XP le vendredi matin :
#!/bin/sh
cat <<EOF
# This module creates special variables that return the current date/time
insmod datehook
# Add and extra 0 to minutes if it's less than 10 (force a 2-digit minute)
if [ \$MINUTE -lt 10 ]; then PADDING="0"; else PADDING=""; fi
TIME=\$HOUR\$PADDING\$MINUTE
# Boot "Windows XP" from 07AM to 11:50AM on Friday
if [ \$WEEKDAY == Friday -a \$TIME -ge 0700 -a \$TIME -lt 1150 ]; then
set default="Microsoft Windows XP Professionnel (on /dev/sda1)"
else
set default="Ubuntu"
fi
EOF
Nous finirons par mettre à jour grub via la commande sudo update-grub2
, afin de mettre à jour le fichier grub.cfg
NoteAprès une mise à jour de grub celui-ci à refusé de changer la priorité du boot… la variable
WEEKDAY à été traduite, il faut maintenant tester pour mon cas \$WEEKDAY == vendredi.