如何在命令行中列出 GRUB 的“菜单项”?

mad*_*eon 39 command-line grub2

有没有办法检索 GRUB 的“menuentries”标题列表?

我需要一个grub-set-default可以接受的格式的结果。例如。

"Ubuntu"
"Memory test (memtest86+)"
etc.
Run Code Online (Sandbox Code Playgroud)

A.B*_*.B. 50

使用 awk

awk -F\' '/menuentry / {print $2}' /boot/grub/grub.cfg 
Run Code Online (Sandbox Code Playgroud)

为您提供了所有菜单项的完整列表grub.cfg


Win*_*nix 14

彩色屏幕截图(短版)

使用鼠标滚轮,HomeEndPgUpPgDn??键导航菜单。

grub-menu.sh

文字截图(长版)

bash 脚本使用whiptail而不是dialog显示菜单。一个优点是您可以将终端图像作为文本复制到剪贴板,然后将其作为 文本粘贴到本网站中。其他优势包括:

  • 鼠标滚轮支持
  • 更快的性能
  • dialog默认情况下,Ubuntu Server 或 Lubuntu 中未安装。whiptail默认包括在内。

这是一个文本屏幕截图:

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)

突出显示条目并按 Enter

使用导航键突出显示一个选项,然后按下Enter以查看grub引导grub内核时加载的预内核驱动程序和传递给内核的引导参数:

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-menu.sh bash 脚本

grub-menu.sh 只有一个选项可以调整:

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)

将该值设置为true(隐藏额外条目)或false(列出所有条目)。

使用以下方法调用脚本时可以覆盖默认格式:

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)

或者:

# 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)


Luc*_*tts 11

正是这让我烦恼了一年多 - 所以我做了一个快速而肮脏的脚本来做到这一点。希望这对其他人有帮助?

这将名称堆叠在推送/弹出队列中,但不是菜单索引,因此它可能会更好,但我已经尽可能地打扰了。

gawk  'BEGIN {                                                                                                                       
  l=0                                                                                                                                
  menuindex= 0                                                                                                                       
  stack[t=0] = 0                                                                                                                     
}                                                                                                                                    

function push(x) { stack[t++] = x }                                                                                                  

function pop() { if (t > 0) { return stack[--t] } else { return "" }  }                                                              

{                                                                                                                                    

if( $0 ~ /.*menu.*{.*/ )                                                                                                             
{                                                                                                                                    
  push( $0 )                                                                                                                         
  l++;                                                                                                                               

} else if( $0 ~ /.*{.*/ )                                                                                                            
{                                                                                                                                    
  push( $0 )                                                                                                                         

} else if( $0 ~ /.*}.*/ )                                                                                                            
{                                                                                                                                    
  X = pop()                                                                                                                          
  if( X ~ /.*menu.*{.*/ )                                                                                                            
  {                                                                                                                                  
     l--;                                                                                                                            
     match( X, /^[^'\'']*'\''([^'\'']*)'\''.*$/, arr )                                                                               

     if( l == 0 )                                                                                                                    
     {                                                                                                                               
       print menuindex ": " arr[1]                                                                                                   
       menuindex++                                                                                                                   
       submenu=0                                                                                                                     
     } else                                                                                                                          
     {                                                                                                                               
       print "  " (menuindex-1) ">" submenu " " arr[1]                                                                               
       submenu++                                                                                                                     
     }                                                                                                                               
  }                                                                                                                                  
}                                                                                                                                    

}' /boot/grub/grub.cfg
Run Code Online (Sandbox Code Playgroud)

在这里你可以看到我的盒子里的屏幕截图显示它正在运行 在此处输入图片说明

正如我在 2019/8 年的评论中所要求的那样,我在上面提到了“临时启动”。这个想法最初是我的脚本开始的,临时启动方法来自另一篇文章,它是这样的

  1. 将 GRUB_DEFAULT 设置为 GRUB_DEFAULT=saved # vi /etc/default/grub
  2. 更新 /boot 中的 grub 配置 # sudo update-grub
  3. 将默认操作系统设置为加载(每次重启机器时都会加载) # sudo grub-set-default 0
  4. 当需要加载其他操作系统时(数字是操作系统的菜单编号,如 /boot/grub/grub.cfg,这将在下次重新启动时仅加载一次其他操作系统 - 手动启动重新启动): # sudo grub-reboot 4

参考:https : //ubuntuforums.org/showthread.php? t =1310463


Dan*_*Man 8

我刚刚发现你可以tab在像grub-rebootorgrub-set-default这样的命令上使用自动完成(按两次),它会给你一个可用启动菜单条目的列表。然后你可以直接复制你想要的标题,你不需要使用数字。

不幸的是,由于某种原因,我的 Windows 7 安装没有以这种方式显示。


小智 6

这应该是正确的“字符串”...

awk -F\' '/^menuentry / {print $2}' /boot/grub/grub.cfg|cat -n|awk '{print $1-1,$1="",$0}'
Run Code Online (Sandbox Code Playgroud)

最后一个管道删除每行开头的空格,并根据 grub 编号条目更正编号顺序。示例输出:

0   Ubuntu
1   Memory test (memtest86+)
2   Memory test (memtest86+, serial console 115200)
3   Windows 10 (su /dev/sdc1)
Run Code Online (Sandbox Code Playgroud)

如果您想查看所有条目,以及高级条目,您可以使用

awk -F\' '/(^|| )nuentry / {print $2}' /boot/grub/grub.cfg|cat -n|awk '{print $1-1,$1="",$0}'
Run Code Online (Sandbox Code Playgroud)

但数字序列不适合与 grub-set-default 一起使用。

  • 这仅显示顶级菜单。**高级选项** 子菜单丢失。 (6认同)

Max*_*Max 6

另一个处理子菜单的 awk one-liner:

 awk -F\' '$1=="menuentry " || $1=="submenu " {print i++ " : " $2}; /\tmenuentry / {print "\t" i-1">"j++ " : " $2};' /boot/grub/grub.cfg
Run Code Online (Sandbox Code Playgroud)

这可能是错误的想法,因为 \t 用于标识子菜单条目。