Win*_*nix 15 command-line grub2
我想grub从命令行显示菜单。还可以选择一个 grub 引导菜单选项,然后按下Enter以查看加载了哪些预内核驱动程序以及加载内核时传递的引导参数。
从命令行执行此操作的原因:
grub菜单需要时间。grub菜单照片并将图像发布在网站上是很尴尬的。当 Ubuntu 启动并运行时,更容易抓取屏幕截图。edit菜单选项e并拍照通常很困难,因为屏幕难以阅读。使用此功能,您可以复制和粘贴。apt list --installed | grep linux-image或更容易ls /boot/vml*。grub-reboot和grub-set-default命令。如何从命令行绘制 grub 菜单,查看内部 grub 菜单条目编号并显示给定选项的引导参数?
Win*_*nix 17
开发脚本:用于将 Ubuntu 克隆到新分区以测试 18.04 LTS 升级的 Bash 脚本我发现你得到了一些长得可笑的菜单选项,导致菜单出现恶意:
4>8 Ubuntu, with Linux 4.14.30-041430-generic (recovery mode) (on /dev/nvme0n1p8)
Run Code Online (Sandbox Code Playgroud)
今天通过截断超过 68 个字符的行来解决这个问题。
此更新引入grub-menu.sh了比以前的答案(仍可在下面找到)更好的版本。新的 grub 菜单具有以下特点:
0, 1, 1>0, 1>1... 2,3(upstart)和(recover mode)子菜单选项的默认短版本。short或long覆盖默认值传递。short或long设置动态格式化的列标题。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> ?
? ?
????????????????????????????????????????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)
grub-menu.sh bash 脚本以前的版本grub-display.sh,并grub-display-lite.sh在代码中所需的多种调节选项。grub-menu.sh只有一个选项可以调整:
4>8 Ubuntu, with Linux 4.14.30-041430-generic (recovery mode) (on /dev/nvme0n1p8)
Run Code Online (Sandbox Code Playgroud)
将值设置为true或false。
使用以下方法调用脚本时可以覆盖默认格式:
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> ?
? ?
????????????????????????????????????????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)
或者:
# Default for hide duplicate and triplicate options with (upstart) and (recovery mode)?
HideUpstartRecovery=false
Run Code Online (Sandbox Code Playgroud)
grub-menu.sh short
Run Code Online (Sandbox Code Playgroud)
以下是菜单项编号遵循 grub 1 格式的原始答案。
grub-display.sh 显示 grub 菜单选项和参数在不依赖第三方应用程序的情况下,您可以使用 bash 脚本来显示grub任何给定选项的菜单和引导参数。引导参数不仅仅是cat /proc/cmdline值。它们还包括在引导 Linux 之前加载的驱动程序。
grub-display.sh bash 脚本这是您可以复制和粘贴的完整程序列表:
grub-menu.sh long
Run Code Online (Sandbox Code Playgroud)
这个 bash 脚本是为 Ubuntu 桌面设计的。对于dialog默认情况下没有安装软件包的Ubuntu Server 和其他 Linux 发行版,grub-display-lite.sh下面包含一个不同的脚本。该版本使用whiptail而不是dialog.
要缩短显示的 grub 菜单选项列表,您可以删除(upstart)和(recovery)选项。为此,取消注释这些行:
#!/bin/bash
# NAME: grub-menu.sh
# PATH: $HOME/bin
# DESC: Written for AU Q&A: https://askubuntu.com/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
Run Code Online (Sandbox Code Playgroud)
然后对这些行应用注释:
#!/bin/bash
# NAME: grub-display.sh
# PATH: $HOME/bin
# DESC: Written for AU Q&A: https://askubuntu.com/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
Run Code Online (Sandbox Code Playgroud)
这是从命令行调用时的样子。不幸的是,我无法复制和粘贴菜单,不得不使用Print Screen:
# 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
Run Code Online (Sandbox Code Playgroud)
启用默认鼠标支持后,您无法将屏幕复制到剪贴板,但必须Print Screen用于图形屏幕快照。为了支持复制和粘贴,您需要通过搜索以下行来禁用鼠标支持:
# Version with upstart and recovery options displayed
#awk -F\' '/menuentry / { print i++, $2}' /boot/grub/grub.cfg \
# > ~/.grub-display-menu
Run Code Online (Sandbox Code Playgroud)
该参数--no-mouse已插入下面--default-item。这意味着您失去了鼠标支持,但通过突出显示文本并按Ctrl+获得更好的分辨率和复制到剪贴板的能力C。
使用导航键突出显示一个选项,然后按下Enter以查看其启动参数:
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 > ?
????????????????????????????????????????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)
--default-item "$DefaultItem" \
--no-mouse \
--menu "Menu Number ----------- Menu Name ----------" 24 76 16 \
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
grub-display-lite.sh 对于 Ubuntu 服务器Ubuntu Server 和 Lubuntu 没有dialog像 Ubuntu Desktop 那样默认安装软件包。基于whiptail大多数 Linux 发行版中默认包含的包,为这些用户编写了不同的版本。
的缺点whiptail是功能较少,但在这种情况下不使用它们。另一个缺点似乎是颜色较少,但这可以使某些人更容易阅读。有优势,whiptail在dialog诸如复制到剪贴板,鼠标滚轮的支持和可能更快的处理。
grub-display-lite.sh bash 脚本#!/bin/bash
# NAME: grub-display-lite.sh
# PATH: $HOME/bin
# DESC: Written for AU Q&A: https://askubuntu.com/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