Mis à jour le 7 mai 2018
Développement du script: script Bash pour cloner Ubuntu vers une nouvelle partition pour tester la mise à niveau de 18.04 LTS J'ai découvert que vous obtenez des options de menu ridiculement longues qui provoquent la malignité du menu:
4>8 Ubuntu, with Linux 4.14.30-041430-generic (recovery mode) (on /dev/nvme0n1p8)
Ce problème a été résolu aujourd'hui en tronquant les lignes de plus de 68 caractères.
Mis à jour le 5 avril 2018
Cette mise à jour introduit grub-menu.sh
une version bien supérieure à la réponse précédente (toujours disponible ci-dessous). Le nouveau menu grub comprend:
- Affiche les numéros d'entrée du menu grub 2. à savoir
0
, 1
, 1>0
, 1>1
... 2
,3
- La version courte par défaut sans
(upstart)
et les (recover mode)
options de sous - menu peuvent être définies.
- Le paramètre 1 peut être passé en tant que
short
ou long
pour remplacer la valeur par défaut.
- les en-têtes de colonne sont formatés dynamiquement en fonction du paramètre
short
ou du long
paramètre.
Capture d'écran couleur (version courte)
Capture d'écran du texte (version longue)
Grub Version: 2.02~beta2-36ubuntu3.15
┌─────────┤ Use arrow, page, home & end keys. Tab toggle option ├──────────┐
│ Menu No. --------------- Menu Name --------------- │
│ │
│ 0 Ubuntu ↑ │
│ 1 Advanced options for Ubuntu ▮ │
│ 1>0 Ubuntu, with Linux 4.14.31-041431-generic ▒ │
│ 1>1 Ubuntu, with Linux 4.14.31-041431-generic (upstart) ▒ │
│ 1>2 Ubuntu, with Linux 4.14.31-041431-generic (recovery mode) ▒ │
│ 1>3 Ubuntu, with Linux 4.14.30-041430-generic ▒ │
│ 1>4 Ubuntu, with Linux 4.14.30-041430-generic (upstart) ▒ │
│ 1>5 Ubuntu, with Linux 4.14.30-041430-generic (recovery mode) ▒ │
│ 1>6 Ubuntu, with Linux 4.14.27-041427-generic ▒ │
│ 1>7 Ubuntu, with Linux 4.14.27-041427-generic (upstart) ▒ │
│ 1>8 Ubuntu, with Linux 4.14.27-041427-generic (recovery mode) ▒ │
│ 1>9 Ubuntu, with Linux 4.14.24-041424-generic ▒ │
│ 1>10 Ubuntu, with Linux 4.14.24-041424-generic (upstart) ▒ │
│ 1>11 Ubuntu, with Linux 4.14.24-041424-generic (recovery mode) ▒ │
│ 1>12 Ubuntu, with Linux 4.14.23-041423-generic ▒ │
│ 1>13 Ubuntu, with Linux 4.14.23-041423-generic (upstart) ↓ │
│ │
│ │
│ <Display Grub Boot> <Exit> │
│ │
└──────────────────────────────────────────────────────────────────────────┘
grub-menu.sh
script bash
Les versions précédentes grub-display.sh
et grub-display-lite.sh
nécessitaient de nombreuses options de réglage dans le code. grub-menu.sh
n'a qu'une seule option à modifier:
# Default for hide duplicate and triplicate options with (upstart) and (recovery mode)?
HideUpstartRecovery=false
Définissez la valeur sur true
ou false
.
Le format par défaut peut être remplacé lors de l'appel du script à l'aide de:
grub-menu.sh short
ou:
grub-menu.sh long
Le code:
#!/bin/bash
# NAME: grub-menu.sh
# PATH: $HOME/bin
# DESC: Written for AU Q&A: /ubuntu//q/1019213/307523
# DATE: Apr 5, 2018. Modified: May 7, 2018.
# $TERM variable may be missing when called via desktop shortcut
CurrentTERM=$(env | grep TERM)
if [[ $CurrentTERM == "" ]] ; then
notify-send --urgency=critical "$0 cannot be run from GUI without TERM environment variable."
exit 1
fi
AllMenusArr=() # All menu options.
# Default for hide duplicate and triplicate options with (upstart) and (recovery mode)?
HideUpstartRecovery=false
if [[ $1 == short ]] ; then
HideUpstartRecovery=true # override default with first passed parameter "short"
elif [[ $1 == long ]] ; then
HideUpstartRecovery=false # override default with first passed parameter "long"
fi
SkippedMenuEntry=false # Don't change this value, automatically maintained
InSubMenu=false # Within a line beginning with `submenu`?
InMenuEntry=false # Within a line beginning with `menuentry` and ending in `{`?
NextMenuEntryNo=0 # Next grub internal menu entry number to assign
# Major / Minor internal grub submenu numbers, ie `1>0`, `1>1`, `1>2`, etc.
ThisSubMenuMajorNo=0
NextSubMenuMinorNo=0
CurrTag="" # Current grub internal menu number, zero based
CurrText="" # Current grub menu option text, ie "Ubuntu", "Windows...", etc.
SubMenuList="" # Only supports 10 submenus! Numbered 0 to 9. Future use.
while read -r line; do
# Example: " }"
BlackLine="${line//[[:blank:]]/}" # Remove all whitespace
if [[ $BlackLine == "}" ]] ; then
# Add menu option in buffer
if [[ $SkippedMenuEntry == true ]] ; then
NextSubMenuMinorNo=$(( $NextSubMenuMinorNo + 1 ))
SkippedMenuEntry=false
continue
fi
if [[ $InMenuEntry == true ]] ; then
InMenuEntry=false
if [[ $InSubMenu == true ]] ; then
NextSubMenuMinorNo=$(( $NextSubMenuMinorNo + 1 ))
else
NextMenuEntryNo=$(( $NextMenuEntryNo + 1 ))
fi
elif [[ $InSubMenu == true ]] ; then
InSubMenu=false
NextMenuEntryNo=$(( $NextMenuEntryNo + 1 ))
else
continue # Future error message?
fi
# Set maximum CurrText size to 68 characters.
CurrText="${CurrText:0:67}"
AllMenusArr+=($CurrTag "$CurrText")
fi
# Example: "menuentry 'Ubuntu' --class ubuntu --class gnu-linux --class gnu" ...
# "submenu 'Advanced options for Ubuntu' $menuentry_id_option" ...
if [[ $line == submenu* ]] ; then
# line starts with `submenu`
InSubMenu=true
ThisSubMenuMajorNo=$NextMenuEntryNo
NextSubMenuMinorNo=0
SubMenuList=$SubMenuList$ThisSubMenuMajorNo
CurrTag=$NextMenuEntryNo
CurrText="${line#*\'}"
CurrText="${CurrText%%\'*}"
AllMenusArr+=($CurrTag "$CurrText") # ie "1 Advanced options for Ubuntu"
elif [[ $line == menuentry* ]] && [[ $line == *"{"* ]] ; then
# line starts with `menuentry` and ends with `{`
if [[ $HideUpstartRecovery == true ]] ; then
if [[ $line == *"(upstart)"* ]] || [[ $line == *"(recovery mode)"* ]] ; then
SkippedMenuEntry=true
continue
fi
fi
InMenuEntry=true
if [[ $InSubMenu == true ]] ; then
: # In a submenu, increment minor instead of major which is "sticky" now.
CurrTag=$ThisSubMenuMajorNo">"$NextSubMenuMinorNo
else
CurrTag=$NextMenuEntryNo
fi
CurrText="${line#*\'}"
CurrText="${CurrText%%\'*}"
else
continue # Other stuff - Ignore it.
fi
done < /boot/grub/grub.cfg
LongVersion=$(grub-install --version)
ShortVersion=$(echo "${LongVersion:20}")
DefaultItem=0
if [[ $HideUpstartRecovery == true ]] ; then
MenuText="Menu No. ----------- Menu Name -----------"
else
MenuText="Menu No. --------------- Menu Name ---------------"
fi
while true ; do
Choice=$(whiptail \
--title "Use arrow, page, home & end keys. Tab toggle option" \
--backtitle "Grub Version: $ShortVersion" \
--ok-button "Display Grub Boot" \
--cancel-button "Exit" \
--default-item "$DefaultItem" \
--menu "$MenuText" 24 76 16 \
"${AllMenusArr[@]}" \
2>&1 >/dev/tty)
clear
if [[ $Choice == "" ]]; then break ; fi
DefaultItem=$Choice
for (( i=0; i < ${#AllMenusArr[@]}; i=i+2 )) ; do
if [[ "${AllMenusArr[i]}" == $Choice ]] ; then
i=$i+1
MenuEntry="menuentry '"${AllMenusArr[i]}"'"
break
fi
done
TheGameIsAfoot=false
while read -r line ; do
if [[ $line = *"$MenuEntry"* ]]; then TheGameIsAfoot=true ; fi
if [[ $TheGameIsAfoot == true ]]; then
echo $line
if [[ $line = *"}"* ]]; then break ; fi
fi
done < /boot/grub/grub.cfg
read -p "Press <Enter> to continue"
done
exit 0
Versions précédentes (non recommandées)
Ci-dessous se trouve la réponse originale où les numéros des entrées de menu suivaient le format grub 1.
grub-display.sh
affiche les options et les paramètres du menu grub
Sans compter sur des applications tierces, vous pouvez utiliser un script bash pour afficher le grub
menu et les paramètres de démarrage pour une option donnée. Les paramètres de démarrage sont bien plus que les cat /proc/cmdline
valeurs. Ils incluent également les pilotes chargés avant le démarrage de Linux.
grub-display.sh
script bash
Voici la liste complète des programmes que vous pouvez copier et coller:
#!/bin/bash
# NAME: grub-display.sh
# PATH: $HOME/bin
# DESC: Written for AU Q&A: /ubuntu//q/1019213/307523
# DATE: Mar 24, 2018. Modified: Mar 26, 2018.
# $TERM variable may be missing when called via desktop shortcut
CurrentTERM=$(env | grep TERM)
if [[ $CurrentTERM == "" ]] ; then
notify-send --urgency=critical "$0 cannot be run from GUI without TERM environment variable."
exit 1
fi
# Must have the dialog package. On Servers, not installed by default
command -v dialog >/dev/null 2>&1 || { echo >&2 "dialog package required but it is not installed. Aborting."; exit 99; }
# Version without upstart and recovery options displayed
#awk -F\' '/menuentry / { print i++, $2}' /boot/grub/grub.cfg \
# | grep -v upstart | grep -v recovery > ~/.grub-display-menu
# Version with upstart and recovery options displayed
awk -F\' '/menuentry / { print i++, $2}' /boot/grub/grub.cfg \
> ~/.grub-display-menu
MenuArr=()
while read -r line; do
MenuNmbr=${line%% *}
MenuName=${line#* }
MenuArr+=($MenuNmbr "$MenuName")
done < ~/.grub-display-menu
rm ~/.grub-display-menu
LongVersion=$(grub-install --version)
ShortVersion=$(echo "${LongVersion:20}")
DefaultItem=0
while true ; do
Choice=$(dialog \
--title "Use arrow, page, home & end keys. Tab toggle option" \
--backtitle "Grub Version: $ShortVersion" \
--ok-label "Display Grub Boot" \
--cancel-label "Exit" \
--default-item "$DefaultItem" \
--menu "Menu Number ----------- Menu Name ----------" 24 76 16 \
"${MenuArr[@]}" \
>/dev/tty)
clear
if [[ $Choice == "" ]]; then break ; fi
DefaultItem=$Choice
for (( i=0; i < ${#MenuArr[@]}; i=i+2 )) ; do
if [[ "${MenuArr[i]}" == $Choice ]] ; then
i=$i+1
MenuEntry="menuentry '"${MenuArr[i]}"'"
break
fi
done
TheGameIsAfoot=false
while read -r line ; do
if [[ $line = *"$MenuEntry"* ]]; then TheGameIsAfoot=true ; fi
if [[ $TheGameIsAfoot == true ]]; then
echo $line
if [[ $line = *"}"* ]]; then break ; fi
fi
done < /boot/grub/grub.cfg
read -p "Press <Enter> to continue"
done
exit 0
Note aux utilisateurs du serveur Ubuntu
Ce script bash a été conçu pour Ubuntu Desktop. Pour Ubuntu Server et d'autres Linux Distros sur lesquels aucun dialog
package n'est installé par défaut, un script différent appelé grub-display-lite.sh
est inclus ci-dessous. Cette version utilise whiptail
au lieu de dialog
.
Réduction de la taille du menu de 66%
Pour raccourcir la liste des options du menu grub affichée, vous pouvez supprimer les options (upstart)
et (recovery)
. Pour ce faire, décommentez ces lignes:
# Version without upstart and recovery options displayed
awk -F\' '/menuentry / { print i++, $2}' /boot/grub/grub.cfg \
| grep -v upstart | grep -v recovery > ~/.grub-display-menu
Appliquez ensuite des commentaires à ces lignes:
# Version with upstart and recovery options displayed
#awk -F\' '/menuentry / { print i++, $2}' /boot/grub/grub.cfg \
# > ~/.grub-display-menu
Captures d'écran
Voici à quoi il ressemble lorsqu'il est appelé à partir de la ligne de commande. Malheureusement, je n'ai pas pu copier et coller le menu et j'ai dû utiliser Print Screen:
Désactiver la prise en charge de la souris pour le copier-coller
Grub Version: 2.02~beta2-36ubuntu3.15
──────────────────────────────────────────────────────────────────────────────────────────
┌──────────Use arrow, page, home & end keys. Tab toggle option─────────────┐
│ Menu Number ----------- Menu Name ---------- │
│ ┌──────────────────────────────────────────────────────────────────────┐ │
│ │ 0 Ubuntu │ │
│ │ 1 Ubuntu, with Linux 4.14.30-041430-generic │ │
│ │ 2 Ubuntu, with Linux 4.14.30-041430-generic (upstart) │ │
│ │ 3 Ubuntu, with Linux 4.14.30-041430-generic (recovery mode) │ │
│ │ 4 Ubuntu, with Linux 4.14.27-041427-generic │ │
│ │ 5 Ubuntu, with Linux 4.14.27-041427-generic (upstart) │ │
│ │ 6 Ubuntu, with Linux 4.14.27-041427-generic (recovery mode) │ │
│ │ 7 Ubuntu, with Linux 4.14.24-041424-generic │ │
│ │ 8 Ubuntu, with Linux 4.14.24-041424-generic (upstart) │ │
│ │ 9 Ubuntu, with Linux 4.14.24-041424-generic (recovery mode) │ │
│ │ 10 Ubuntu, with Linux 4.14.23-041423-generic │ │
│ │ 11 Ubuntu, with Linux 4.14.23-041423-generic (upstart) │ │
│ │ 12 Ubuntu, with Linux 4.14.23-041423-generic (recovery mode) │ │
│ │ 13 Ubuntu, with Linux 4.14.21-041421-generic │ │
│ │ 14 Ubuntu, with Linux 4.14.21-041421-generic (upstart) │ │
│ │ 15 Ubuntu, with Linux 4.14.21-041421-generic (recovery mode) │ │
│ └────↓(+)──────────────────────────────────────────────────────16%─────┘ │
│ │
├──────────────────────────────────────────────────────────────────────────┤
│ <Display Grub Boot> < Exit > │
└──────────────────────────────────────────────────────────────────────────┘
Lorsque la prise en charge par défaut de la souris est activée, vous ne pouvez pas copier l'écran dans le presse-papiers mais devez l'utiliser Print Screenpour un instantané d'écran graphique. Pour prendre en charge le copier-coller, vous devez désactiver la prise en charge de la souris en recherchant ces lignes:
--default-item "$DefaultItem" \
--no-mouse \
--menu "Menu Number ----------- Menu Name ----------" 24 76 16 \
L'argument --no-mouse
a été inséré ci-dessous --default-item
. Cela signifie que vous perdez la prise en charge de la souris, mais obtenez une meilleure résolution et une meilleure capacité de copie dans le presse-papiers en surlignant le texte et en appuyant sur Ctrl+ C.
Afficher les paramètres de démarrage de grub
Utilisez les touches de navigation pour mettre une option en surbrillance et appuyez sur Enterpour voir les paramètres de démarrage de celle-ci:
menuentry 'Ubuntu, with Linux 4.14.27-041427-generic' --class ubuntu --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-4.14.27-041427-generic-advanced-f3f8e7bc-b337-4194-88b8-3a513f6be55b' {
recordfail
savedefault
load_video
gfxmode $linux_gfx_mode
insmod gzio
if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
insmod part_gpt
insmod ext2
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root f3f8e7bc-b337-4194-88b8-3a513f6be55b
else
search --no-floppy --fs-uuid --set=root f3f8e7bc-b337-4194-88b8-3a513f6be55b
fi
echo 'Loading Linux 4.14.27-041427-generic ...'
linux /boot/vmlinuz-4.14.27-041427-generic root=UUID=f3f8e7bc-b337-4194-88b8-3a513f6be55b ro quiet splash loglevel=0 vga=current udev.log-priority=3 fastboot kaslr acpiphp.disable=1 crashkernel=384M-2G:128M,2G-:256M $vt_handoff
echo 'Loading initial ramdisk ...'
initrd /boot/initrd.img-4.14.27-041427-generic
}
Press <Enter> to continue
Entrée de menu Grub # 94
menuentry 'Windows Boot Manager (on /dev/nvme0n1p2)' --class windows --class os $menuentry_id_option 'osprober-efi-D656-F2A8' {
savedefault
insmod part_gpt
insmod fat
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root D656-F2A8
else
search --no-floppy --fs-uuid --set=root D656-F2A8
fi
chainloader /EFI/Microsoft/Boot/bootmgfw.efi
}
Press <Enter> to continue
Entrée de menu Grub # 96
menuentry 'System setup' $menuentry_id_option 'uefi-firmware' {
fwsetup
}
Press <Enter> to continue
grub-display-lite.sh
pour Ubuntu Server
Ubuntu Server et Lubuntu n'ont pas de dialog
package installé par défaut comme Ubuntu Desktop. Une version différente a été écrite pour ces utilisateurs sur la base du whiptail
package qui est inclus par défaut sur la plupart des distributions Linux.
L'inconvénient de whiptail
est moins de fonctions mais elles ne sont pas utilisées dans ce cas. Un autre inconvénient semble être moins de couleurs, mais cela peut faciliter la lecture pour certaines personnes. Il existe des avantages par whiptail
rapport dialog
à la copie dans le presse-papiers, la prise en charge de la molette de défilement de la souris et probablement un traitement plus rapide.
grub-display-lite.sh
script bash
#!/bin/bash
# NAME: grub-display-lite.sh
# PATH: $HOME/bin
# DESC: Written for AU Q&A: /ubuntu//q/1019213/307523
# DATE: Mar 26, 2018.
# NOTE: "lite" version written for Ubuntu Server and Lubuntu which do
# not have `dialog` installed by default. `whiptail` is used
# instead. Nice consequences are better resolution, mouse scroll
# wheel and copy to clipboard support.
# $TERM variable may be missing when called via desktop shortcut
CurrentTERM=$(env | grep TERM)
if [[ $CurrentTERM == "" ]] ; then
notify-send --urgency=critical "$0 cannot be run from GUI without TERM environment variable."
exit 1
fi
# Version without upstart and recovery options displayed
awk -F\' '/menuentry / { print i++, $2}' /boot/grub/grub.cfg \
| grep -v upstart | grep -v recovery > ~/.grub-display-menu
# Version with upstart and recovery options displayed
#awk -F\' '/menuentry / { print i++, $2}' /boot/grub/grub.cfg \
# > ~/.grub-display-menu
MenuArr=()
while read -r line; do
MenuNmbr=${line%% *}
MenuName=${line#* }
MenuArr+=($MenuNmbr "$MenuName")
done < ~/.grub-display-menu
rm ~/.grub-display-menu
LongVersion=$(grub-install --version)
ShortVersion=$(echo "${LongVersion:20}")
DefaultItem=0
while true ; do
Choice=$(whiptail \
--title "Use arrow, page, home & end keys. Tab toggle option" \
--backtitle "Grub Version: $ShortVersion" \
--ok-button "Display Grub Boot" \
--cancel-button "Exit" \
--default-item "$DefaultItem" \
--menu "Menu Number ----------- Menu Name ----------" 24 76 16 \
"${MenuArr[@]}" \
>/dev/tty)
clear
if [[ $Choice == "" ]]; then break ; fi
DefaultItem=$Choice
for (( i=0; i < ${#MenuArr[@]}; i=i+2 )) ; do
if [[ "${MenuArr[i]}" == $Choice ]] ; then
i=$i+1
MenuEntry="menuentry '"${MenuArr[i]}"'"
break
fi
done
TheGameIsAfoot=false
while read -r line ; do
if [[ $line = *"$MenuEntry"* ]]; then TheGameIsAfoot=true ; fi
if [[ $TheGameIsAfoot == true ]]; then
echo $line
if [[ $line = *"}"* ]]; then break ; fi
fi
done < /boot/grub/grub.cfg
read -p "Press <Enter> to continue"
done
exit 0
Le grub-display-lite.sh
script bash est fondamentalement le même que grub-display.sh
sauf qu'il n'y a pas de message d'erreur s'il dialog
n'est pas installé. Certains whiptail
arguments ont également des noms différents.
grub-display-lite.sh
captures d'écran
L'écran couleur semble être plus facile à lire que celui grub-display
qui utilise le dialog
package:
Voici l'image basée sur du texte qui n'a besoin d'aucune modification pour être copiée dans le presse-papier:
Grub Version: 2.02~beta2-36ubuntu3.15
┌─────────┤ Use arrow, page, home & end keys. Tab toggle option ├──────────┐
│ Menu Number ----------- Menu Name ---------- │
│ │
│ 55 Ubuntu, with Linux 4.13.9-041309-generic ↑ │
│ 58 Ubuntu, with Linux 4.10.0-42-generic ▒ │
│ 61 Ubuntu, with Linux 4.10.0-40-generic ▒ │
│ 64 Ubuntu, with Linux 4.10.0-38-generic ▒ │
│ 67 Ubuntu, with Linux 4.10.0-37-generic ▒ │
│ 70 Ubuntu, with Linux 4.10.0-28-generic ▒ │
│ 73 Ubuntu, with Linux 4.9.77-040977-generic ▒ │
│ 76 Ubuntu, with Linux 4.9.76-040976-generic ▒ │
│ 79 Ubuntu, with Linux 4.4.0-104-generic ▒ │
│ 82 Ubuntu, with Linux 4.4.0-103-generic ▒ │
│ 85 Ubuntu, with Linux 4.4.0-101-generic ▒ │
│ 88 Ubuntu, with Linux 4.4.0-98-generic ▒ │
│ 91 Ubuntu, with Linux 3.16.53-031653-generic ▒ │
│ 94 Windows Boot Manager (on /dev/nvme0n1p2) ▮ │
│ 95 Windows Boot Manager (on /dev/sda1) ▒ │
│ 96 System setup ↓ │
│ │
│ │
│ <Display Grub Boot> <Exit> │
│ │
└──────────────────────────────────────────────────────────────────────────┘
Comme mentionné ci - dessus , vous pouvez réduire la taille du menu grub affiché ici de 66% lors du retrait (upstart)
et des (recovery)
options de menu. C'est le cas ici, mais en conséquence, les lignes de détail deviennent plus étroites et les titres ne s'alignent pas parfaitement. Vous pouvez modifier les en-têtes de colonne en modifiant cette ligne:
--menu "Menu Number ----------- Menu Name ----------" 24 76 16 \
à quelque chose comme ça:
--menu " Menu Number ----------- Menu Name ----------" 24 76 16 \
cat /proc/cmdline
. Pour voir les options que grub utilisera la prochaine fois que vous mettrez à jour l'utilisation du menu grubgrep GRUB_CMDLINE_LINUX /etc/default/grub
. Ce deuxième ensemble de paramètres sera utilisé par apt ou chaque fois qu'ilupdate-grub
sera exécuté. Pour voir toutes les options simplementless /boot/grub/grub.cfg
ou similaires.cat
etgrep
pour la plupart d'entre nous.dialog
peuvent être utiles.