Приведенные ниже команды являются более общими, чем только для версии ядра 3.13.0-35.
1. Смонтируйте раздел efi и скопируйте туда файлы ядра
$ mount /dev/sda3 /boot/efi
$ mkdir -pv /boot/efi/EFI/ubuntu/
$ cp -uv /boot/vmlinuz-* /boot/initrd.img-* /boot/efi/EFI/ubuntu/
'/boot/vmlinuz-3.13.0-35-generic' -> '/boot/efi/EFI/ubuntu/vmlinuz-3.13.0-35-generic'
'/boot/initrd.img-3.13.0-35-generic' -> '/boot/efi/EFI/ubuntu/initrd.img-3.13.0-35-generic'
2. Измените имя файла ядра
Сократите имя файла ядра, удалив его, -generic
поскольку, как представляется, существует ограничение длины пути в 39 символов и переименование файла (-ов) ядра для завершения .efi
, это обеспечивает совместимость с большинством систем.
$ for f in /boot/efi/EFI/ubuntu/vmlinuz-*-generic; do mv -uv -- "$f" "${f//-generic/}.efi"; done
'/boot/efi/EFI/ubuntu/vmlinuz-3.13.0-35-generic' -> '/boot/efi/EFI/ubuntu/vmlinuz-3.13.0-35-generic.efi'`
Вышеуказанное сокращение имени файла имени ядра недостаточно для dpkg
установленного основного ядра , потому что, например, /EFI/ubuntu/vmlinuz-3.16.0-031600rc6.efi
без -generic
по-прежнему имеет длину 40 символов.
3. Добавить новую запись в меню загрузки EFI
Замените 3.13.0-35
в этом примере вашу конкретную версию ядра
$ kv=3.13.0-35;efibootmgr -c -p 3 -L $kv -l \EFI\ubuntu\vmlinuz-$kv.efi -u root=/dev/sda1 initrd=\\EFI\\ubuntu\\initrd.img-$kv-generic ro rootfstype=ext4 debug ignore_loglevel libata.force=dump_id crashkernel=384M-:128M
Этот новый пункт меню загрузки станет вашим новым выбором по умолчанию.
Вы , возможно , не нужны дополнительные параметры отладки debug
, ignore_loglevel
, libata.force=dump_id
и crashkernel=384M-:128M
. Initrd
должен присутствовать, иначе загрузка зависает на « Switched to clocksource tsc. », потому что корневое устройство sda1 не может быть открыто.
-l
и-u
в двойные кавычки (или избежать обратной косой черты вручную). Вы можете проверить, является ли это проблемой, выполнивefibootmgr -v
после добавления новой записи в меню загрузки EFI. Кроме того, в случае, если на вашей машине более одного диска (скажем, SSD и HDD), вам нужно указать один, по-d
умолчанию/dev/sda
(см.man efibootmgr
)Согласно вики Debian , это можно сделать за несколько простых шагов, которые выдержат обновление ядра .
Примечание: это предполагает, что у вас есть раздел EFI, смонтированный в
/boot/efi
.Создайте
/etc/kernel/postinst.d/zz-update-efistub
со следующим содержанием:Это хук, который будет запускаться при обновлении ядра, чтобы скопировать последний образ ядра и initrd в соответствующее место. Затем сделайте его исполняемым и запустите:
Добавьте загрузочную запись:
Не забудьте изменить
-d
и-p
аргументы , в зависимости от того, где системный раздел EFI является. В моем случае это / dev / sdb1, но для вас это может быть иначе. Возможно, вам также придется изменитьroot=
значение в командной строке ядра на ваш корневой раздел.(Вы можете изменить метку на что угодно, изменив
-L
параметр.)Загрузочная запись, которую вы только что добавили, станет записью по умолчанию. И он не сломается после обновления ядра, так как ловушка будет проверена
vmlinuz
иinitrd.img
всегда обновляется.источник