Назад | Перейти на главную страницу

GRUB_DEFAULT кажется неэффективным при попытке загрузить собственное ядро ​​по идентификатору в Debian 8

Я создал собственное ядро ​​на машине Debian 8 и хочу установить его по умолчанию. Казалось бы, простая задача, но я не могу заставить ее работать на всю жизнь.

Я построил свое ядро, используя официальный исходный код (через git), а не тарбол поставщика, предоставленный моим debian. После сборки я установил ядро ​​и модули:

$ 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

Перед окончательной перезагрузкой.

Но это, похоже, не работает. Вместо этого загружается то же ядро, что и раньше. Кто-нибудь знает почему?

Другие вещи, которые я пробовал:

Я собираюсь изучить feature_menuentry_id сейчас, но я чувствую, что это будет отвлекающий маневр. Если кто-нибудь пока сможет избавить меня от страданий, я буду очень признателен.

Спасибо

В конце концов мне удалось загрузить ядро ​​со следующей строчкой в /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 если есть подменю. Вы должны думать о навигации по меню grub, используя (потенциально много) идентификаторов. В > выше (которого я не нашел в документации, кстати) означает «перейти в это подменю».

Надеюсь, это поможет другим запутаться в этой же проблеме.

Ура