Zaktualizowano 7 maja 2018 r
Opracowywanie skryptu: Skrypt Bash do klonowania Ubuntu na nowej partycji w celu przetestowania aktualizacji 18.04 LTS Odkryłem, że masz kilka śmiesznie długich opcji menu, które powodują złośliwe menu:
4>8 Ubuntu, with Linux 4.14.30-041430-generic (recovery mode) (on /dev/nvme0n1p8)
Zostało to naprawione dzisiaj przez obcięcie linii dłuższych niż 68 znaków.
Zaktualizowano 5 kwietnia 2018 r
Ta aktualizacja wprowadza grub-menu.sh
znacznie lepszą wersję do poprzedniej odpowiedzi (wciąż dostępnej poniżej). Nowe funkcje menu grub:
- Wyświetla numery pozycji menu GRUB 2. czyli
0
, 1
, 1>0
, 1>1
... 2
,3
- Można ustawić domyślną krótką wersję bez opcji
(upstart)
i (recover mode)
podmenu.
- Parametr 1 można przekazać jako
short
lub w long
celu zastąpienia wartości domyślnej.
- nagłówki kolumn dynamicznie formatowane na podstawie
short
lub long
ustawienia.
Kolorowy zrzut ekranu (krótka wersja)
Tekstowy zrzut ekranu (długa wersja)
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
skrypt bash
Poprzednie wersje grub-display.sh
i grub-display-lite.sh
wymaga wiele opcji Podkręcanie w kodzie. grub-menu.sh
ma tylko jedną opcję dostosowania:
# Default for hide duplicate and triplicate options with (upstart) and (recovery mode)?
HideUpstartRecovery=false
Ustaw wartość na true
lub false
.
Domyślny format można zastąpić podczas wywoływania skryptu za pomocą:
grub-menu.sh short
lub:
grub-menu.sh long
Kod:
#!/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
Poprzednie wersje (niezalecane)
Poniżej znajduje się oryginalna odpowiedź, w której numery pozycji menu były zgodne z formatem grub 1.
grub-display.sh
wyświetla opcje i parametry menu grub
Bez polegania na aplikacjach innych firm można użyć skryptu bash do wyświetlenia grub
menu i parametrów rozruchowych dla dowolnej opcji. Parametry rozruchowe to coś więcej niż tylko cat /proc/cmdline
wartości. Obejmują także sterowniki załadowane przed uruchomieniem systemu Linux.
grub-display.sh
skrypt bash
Oto pełna lista programów, którą możesz skopiować i wkleić:
#!/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
Uwaga dla użytkowników Ubuntu Server
Ten skrypt bash został zaprojektowany dla Ubuntu Desktop. W przypadku Ubuntu Server i innych dystrybucji Linuksa, które nie mają dialog
domyślnie zainstalowanego pakietu, grub-display-lite.sh
poniżej podano inny skrypt o nazwie . Ta wersja używa whiptail
zamiast dialog
.
Zmniejszenie rozmiaru menu o 66%
Aby skrócić wyświetloną listę opcji menu grub, możesz usunąć opcje (upstart)
i (recovery)
. Aby to zrobić, odkomentuj następujące linie:
# 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
Następnie zastosuj komentarze do tych wierszy:
# Version with upstart and recovery options displayed
#awk -F\' '/menuentry / { print i++, $2}' /boot/grub/grub.cfg \
# > ~/.grub-display-menu
Zrzuty ekranu
Oto jak wygląda po wywołaniu z wiersza poleceń. Niestety nie byłem w stanie skopiować i wkleić menu i musiałem użyć Print Screen:
Wyłącz obsługę myszy dla kopiowania i wklejania
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 > │
└──────────────────────────────────────────────────────────────────────────┘
Gdy domyślna obsługa myszy jest włączona, nie można skopiować ekranu do schowka, ale należy go użyć Print Screenw przypadku graficznej migawki ekranu. Aby obsługiwać kopiowanie i wklejanie, wyłącz obsługę myszy, wyszukując następujące wiersze:
--default-item "$DefaultItem" \
--no-mouse \
--menu "Menu Number ----------- Menu Name ----------" 24 76 16 \
Argument --no-mouse
został wstawiony poniżej --default-item
. Oznacza to, że tracisz obsługę myszy, ale zyskujesz lepszą rozdzielczość i możliwość kopiowania do schowka, zaznaczając tekst i naciskając Ctrl+ C.
Wyświetl parametry rozruchowe grub
Użyj klawiszy nawigacyjnych, aby podświetlić opcję i naciśnij, Enteraby wyświetlić parametry rozruchu:
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
Pozycja 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
Pozycja menu Grub # 96
menuentry 'System setup' $menuentry_id_option 'uefi-firmware' {
fwsetup
}
Press <Enter> to continue
grub-display-lite.sh
dla Ubuntu Server
Ubuntu Server i Lubuntu nie mają dialog
domyślnie zainstalowanego pakietu, tak jak Ubuntu Desktop. Dla tych użytkowników została napisana inna wersja na podstawie whiptail
pakietu, który jest domyślnie dołączany do większości dystrybucji Linuksa.
Wadą whiptail
jest mniej funkcji, ale w tym przypadku nie są one używane. Kolejną wadą wydaje się być mniej kolorów, ale może to ułatwić niektórym osobom czytanie. Są zalety whiptail
ponad dialog
takie jak kopiowanie do schowka, wsparcia kółkiem myszy i prawdopodobnie szybsze przetwarzanie.
grub-display-lite.sh
skrypt 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
grub-display-lite.sh
Skrypt bash jest w zasadzie taka sama jak grub-display.sh
z wyjątkiem nie ma komunikatu o błędzie, jeśli dialog
nie jest zainstalowany. Również niektóre whiptail
argumenty mają różne nazwy.
grub-display-lite.sh
zrzuty ekranu
Kolorowy ekran wydaje się łatwiejszy do odczytania niż ten, grub-display
który używa dialog
pakietu:
Oto obraz tekstowy, który nie wymaga modyfikacji, aby skopiować do schowka:
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> │
│ │
└──────────────────────────────────────────────────────────────────────────┘
Jak wspomniano powyżej, możesz zmniejszyć rozmiar wyświetlanego tutaj menu grub o 66% podczas usuwania (upstart)
i (recovery)
opcji menu. Tak jest w tym przypadku, ale w konsekwencji linie szczegółów stają się węższe, a nagłówki nie układają się idealnie. Możesz poprawić nagłówki kolumn, zmieniając ten wiersz:
--menu "Menu Number ----------- Menu Name ----------" 24 76 16 \
do czegoś takiego:
--menu " Menu Number ----------- Menu Name ----------" 24 76 16 \
cat /proc/cmdline
. Aby zobaczyć opcje, którą grub użyje przy następnej aktualizacji użyj menu grubgrep GRUB_CMDLINE_LINUX /etc/default/grub
. Drugi zestaw ustawień będzie używany przez apt lub za każdym razem, gdyupdate-grub
zostanie uruchomiony. Aby zobaczyć wszystkie opcje po prostuless /boot/grub/grub.cfg
lub podobnie.cat
igrep
dla większości z nas.dialog
może być pomocne.