在 Debian 8 上尝试通过 ID 启动自定义内核时,GRUB_DEFAULT 似乎无效

在 Debian 8 上尝试通过 ID 启动自定义内核时,GRUB_DEFAULT 似乎无效

我在 Debian 8 机器上构建了一个自定义内核,我想将其设置为默认内核。这看似是一个很简单的任务,但我无论如何都无法让它工作。

我使用官方源代码(通过 git)构建了内核,而不是使用供应商为 Debian 提供的 tarball。构建完成后,我使用以下命令安装了内核和模块:

$ sudo make modules_install install

这会在 grub 中安装一个新的菜单项,如果您在启动时手动选择它,它确实会起作用。所以这很好。

现在,为了让它默认启动,我必须编辑/etc/default/grub并更改GRUB_DEFAULT。文件顶​​部是一条注释,将用户指向一个信息页面,内容如下:

'GRUB_DEFAULT'
     The default menu entry.  This may be a number, in which case it
     identifies the Nth entry in the generated menu counted from zero,
     or the title of a menu entry, or the special string 'saved'.  Using
     the id may be useful if you want to set a menu entry as the default
     even though there may be a variable number of entries before it.

     For example, if you have:

     menuentry 'Example GNU/Linux distribution' --class gnu-linux --id example-gnu-linux {
        ...
     }

     then you can make this the default using:

          GRUB_DEFAULT=example-gnu-linux

     Previously it was documented the way to use entry title.  While
     this still works it's not recommended since titles often contain
     unstable device names and may be translated

     If you set this to 'saved', then the default menu entry will be
     that saved by 'GRUB_SAVEDEFAULT' or 'grub-set-default'.  This
     relies on the environment block, which may not be available in all
     situations (*note Environment block::).

     The default is '0'.

首先,从文章中看不出“id”是否与“title”相同。除此之外,看起来我应该--id在生成的 grub 配置中使用后面的字符串。

因此,make install将以下内容插入/boot/grub/grub.cfg

    menuentry 'Debian GNU/Linux, with Linux 3.16.36krunsystickless+' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.16.36krunsystickless+-advanced-197f20c1-1808-41b5-831f-b85a40358757' {
        load_video                                                              
        insmod gzio                                                             
        if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi      
        insmod part_msdos                                                       
        insmod ext2                                                             
        set root='hd0,msdos1'                                                   
        if [ x$feature_platform_search_hint = xy ]; then                        
          search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1  197f20c1-1808-41b5
-831f-b85a40358757
        else                                                                    
          search --no-floppy --fs-uuid --set=root 197f20c1-1808-41b5-831f-b85a40358757
        fi                                                                      
        echo    'Loading Linux 3.16.36krunsystickless+ ...'                     
        linux   /boot/vmlinuz-3.16.36krunsystickless+ root=UUID=197f20c1-1808-41b5-831f-b85a40358757 ro  quiet console=ttyS0,115200n8 intel_psta
te=disable
        echo    'Loading initial ramdisk ...'                                   
        initrd  /boot/initrd.img-3.16.36krunsystickless+                        
    }

其中,先前在文件中$menuentry_id_option设置:

if [ x"${feature_menuentry_id}" = xy ]; then                                    
  menuentry_id_option="--id"                                                    
else                                                                            
  menuentry_id_option=""                                                        
fi

因此,我大概应该GRUB_DEFAULT开始/etc/grub/default

gnulinux-3.16.36krunsystickless+-advanced-197f20c1-1808-41b5-831f-b85a40358757

然后运行:

$ sudo update-grub
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-3.16.36softdevnohzfullall
Found initrd image: /boot/initrd.img-3.16.36softdevnohzfullall
Found linux image: /boot/vmlinuz-3.16.36krunsystickless+
Found initrd image: /boot/initrd.img-3.16.36krunsystickless+
Found linux image: /boot/vmlinuz-3.16.36krunsystickless+.old
Found initrd image: /boot/initrd.img-3.16.36krunsystickless+
Found linux image: /boot/vmlinuz-3.16.0-4-amd64
Found initrd image: /boot/initrd.img-3.16.0-4-amd64
done

最后重新启动之前。

但这似乎不起作用。相反,启动的是与之前相同的内核。有人知道为什么吗?

我还尝试过其他方法:

  • 数字索引GRUB_DEFAULTS——似乎没有效果。
  • 转义内核 ID 中的加号。
  • grub-set-default

我现在要去调查一下feature_menuentry_id,但我感觉这只是一个转移注意力的借口。如果有人能在此期间让我摆脱痛苦,我将不胜感激。

谢谢

答案1

最后我设法使用以下行启动我的内核/etc/default/grub

GRUB_DEFAULT=gnulinux-advanced-197f20c1-1808-41b5-831f-b85a40‌​358757>gnulinux-3.16‌​.36krunsystickless+-‌​advanced-197f20c1-18‌​08-41b5-831f-b85a403‌​58757

文档具有误导性。GRUB_DEFAULT如果涉及子菜单,则不能简单地将 ID 放入其中。您必须考虑使用(可能有很多)ID 来导航 grub 菜单。>上面的内容(顺便说一句,我在文档中没有找到)表示“进入此子菜单”。

我希望这可以帮助其他被同样问题困扰的人。

干杯

相关内容