- Вопрос или проблема
- Снова, это должно быть в разделе EFI:
- Ответ или решение
- Замена GRUB на загрузчик systemd-boot в Ubuntu 20.04
- Шаг 1: Подготовка
- Шаг 2: Переход в EFI-раздел
- Шаг 3: Настройка конфигурационного файла загрузчика
- Шаг 4: Создание скрипта для обновления systemd-boot
- Шаг 5: Установка systemd-boot
- Шаг 6: Проверка и настройка загрузчика
- Шаг 7: Удаление GRUB
- Заключение
Вопрос или проблема
ubuntu@ubuntu:~$ lsblk -po NAME,SIZE,TYPE,FSTYPE,PARTLABEL
NAME SIZE TYPE FSTYPE PARTLABEL
/dev/loop0 1.9G loop squashfs
/dev/loop1 27.1M loop squashfs
/dev/loop2 55M loop squashfs
/dev/loop3 240.8M loop squashfs
/dev/loop4 62.1M loop squashfs
/dev/loop5 49.8M loop squashfs
/dev/sda 465.8G disk
├─/dev/sda1 292M part vfat CLR_BOOT
├─/dev/sda2 512M part swap CLR_SWAP
├─/dev/sda3 108.6G part ext4 CLR_ROOT
├─/dev/sda4 16M part Microsoft reserved partition
├─/dev/sda5 79G part ntfs Basic data partition
└─/dev/sda6 277.4G part ntfs Basic data partition
/dev/sdb 30.2G disk iso9660
├─/dev/sdb1 2.5G part iso9660
├─/dev/sdb2 3.9M part vfat
└─/dev/sdb3 27.7G part ext4
/dev/sr0 1024M rom
ubuntu@ubuntu:~$
После того как вы следовали этому руководству:
# Всё в этом руководстве должно выполняться от имени root:
sudo -i
# Теперь переместитесь в корень EFI раздела.
cd /boot/efi
# Конфигурационные файлы будут размещены здесь:
mkdir -p loader/entries
# А ядра будут размещены здесь:
mkdir ubuntu
Поместите следующее в /boot/efi/loader/loader.conf
(измените значение таймаута по своему усмотрению)
default ubuntu
timeout 1
editor 0
Поместите следующее в /etc/kernel/postinst.d/zz-update-systemd-boot
Убедитесь, что изменили CHANGEMEs.
#!/bin/bash
#
# Это простой хук ядра для заполнения записей systemd-boot
# каждый раз, когда ядра добавляются или удаляются.
#
# UUID вашего диска.
UUID="CHANGEME"
# Слаг LUKS тома, который вы хотите использовать, что приведет к
# монтированию раздела в /dev/mapper/CHANGEME.
VOLUME="CHANGEME"
# Любые параметры корня, которые вы хотите установить.
ROOTFLAGS="CHANGEME"
# Наши ядра.
KERNELS=()
FIND="find /boot -maxdepth 1 -name 'vmlinuz-*' -type f -print0 | sort -rz"
while IFS= read -r -u3 -d $'\0' LINE; do
KERNEL=$(basename "${LINE}")
KERNELS+=("${KERNEL:8}")
done 3< <(eval "${FIND}")
# Должно быть как минимум одно ядро.
if [ ${#KERNELS[@]} -lt 1 ]; then
echo -e "\e[2msystemd-boot\e[0m \e[1;31mЯдра не найдены.\e[0m"
exit 1
fi
# Выполните ядерную очистку, чтобы гарантировать, что всё всегда в идеальном
# синхронизированном состоянии.
rm /boot/efi/loader/entries/*.conf
rm -rf /boot/efi/ubuntu
mkdir /boot/efi/ubuntu
# Копируйте последние файлы ядра в постоянное место, чтобы мы могли продолжать
# использовать ту же конфигурацию загрузчика.
LATEST="${KERNELS[@]:0:1}"
echo -e "\e[2msystemd-boot\e[0m \e[1;32m${LATEST}\e[0m"
for FILE in config initrd.img System.map vmlinuz; do
cp "/boot/${FILE}-${LATEST}" "/boot/efi/ubuntu/${FILE}"
cat << EOF > /boot/efi/loader/entries/ubuntu.conf
title Ubuntu GNOME
linux /ubuntu/vmlinuz
initrd /ubuntu/initrd.img
options cryptdevice=UUID=${UUID}:${VOLUME} root=/dev/mapper/${VOLUME} ro rootflags=${ROOTFLAGS}
EOF
done
# Копируйте любые устаревшие ядра, но сохраняйте их версии, чтобы предотвратить коллизии.
if [ ${#KERNELS[@]} -gt 1 ]; then
LEGACY=("${KERNELS[@]:1}")
for VERSION in "${LEGACY[@]}"; do
echo -e "\e[2msystemd-boot\e[0m \e[1;32m${VERSION}\e[0m"
for FILE in config initrd.img System.map vmlinuz; do
cp "/boot/${FILE}-${VERSION}" "/boot/efi/ubuntu/${FILE}-${VERSION}"
cat << EOF > /boot/efi/loader/entries/ubuntu-${VERSION}.conf
title Ubuntu GNOME ${VERSION}
linux /ubuntu/vmlinuz-${VERSION}
initrd /ubuntu/initrd.img-${VERSION}
options cryptdevice=UUID=${UUID}:${VOLUME} root=/dev/mapper/${VOLUME} ro rootflags=${ROOTFLAGS}
EOF
done
done
fi
# Успешно!
exit 0
Если ваша настройка проста, вы можете обойтись без ROOTFLAGS и VOLUME, и соответствующая строка в скрипте может быть следующей: options root=UUID=${UUID} ro
Позаботьтесь о разрешениях:
chown root: /etc/kernel/postinst.d/zz-update-systemd-boot
chmod 0755 /etc/kernel/postinst.d/zz-update-systemd-boot
cd /etc/kernel/postrm.d/ && ln -s ../postinst.d/zz-update-systemd-boot zz-update-systemd-boot
[ -d "/etc/initramfs/post-update.d" ] || mkdir -p /etc/initramfs/post-update.d
cd /etc/initramfs/post-update.d/ && ln -s ../../kernel/postinst.d/zz-update-systemd-boot zz-update-systemd-boot
Ваш /boot/efi/loader/entries/ubuntu.conf
должен выглядеть примерно так (очевидно, вам нужно изменить UUID):
title Ubuntu GNOME
linux /ubuntu/vmlinuz
initrd /ubuntu/initrd.img
options root=UUID=81c4bc1c-1a7e-4822-acae-220bbe572240 ro
чтобы увидеть UUID
ubuntu@ubuntu:~$ lsblk -f NAME FSTYPE LABEL UUID FSAVAIL FSUSE% MOUNTPOINT loop0 squashfs 0 100% /rofs loop1 squashfs 0 100% /snap/snapd/7264 loop2 squashfs 0 100% /snap/core18/1705 loop3 squashfs 0 100% /snap/gnome-3-34-1804/24 loop4 squashfs 0 100% /snap/gtk-common-themes/1 loop5 squashfs 0 100% /snap/snap-store/433 sda ├─sda1 vfat 1A74-A270 113.2M 61% /media/ubuntu/1A74-A270 ├─sda2 swap 10842320-1286-413f-bf08-3e0ca76bcf2f [SWAP] ├─sda3 ext4 81c4bc1c-1a7e-4822-acae-220bbe572240 87.6G 13% /media/ubuntu/81c4bc1c-1a ├─sda4 ├─sda5 ntfs 80D47B63D47B59FC └─sda6 ntfs router_data 4416017316016770 sdb iso9660 Ubuntu 20.04 LTS amd64 2020-04-23-07-51-42-00 ├─sdb1 iso9660 Ubuntu 20.04 LTS amd64 2020-04-23-07-51-42-00 0 100% /cdrom ├─sdb2 vfat 1AC3-20ED └─sdb3 ext4 writable b8474e17-164a-4fb3-94ff-d4e68f2e1548 25.7G 0% /var/crash sr0
Посмотрите на ваше текущее ядро и переустановите его, чтобы активировать хуки, которые вы только что создали: sudo apt install --reinstall linux-image-5.13.0-22-generic
.
На самом деле установите systemd-boot
Для большинства людей установка состоит из одной команды:
Снова, это должно быть в разделе EFI:
bootctl install --path=/boot/efi
Чтобы подтвердить загрузчики, установленные в системе — и их порядок — выполните:
efibootmgr
reboot
как только всё будет хорошо, вы можете удалить grub из вашей системы
# Удалите пакеты.
apt-get purge grub*
# Удалите любые устаревшие зависимости.
apt-get autoremove --purge
Для Ubuntu 24.04:
apt install systemd-boot
bootctl install
# генерировать /boot/efi/loader/entries
for x in /boot/vmlinuz-*; do
p=$(dpkg -S $x|grep -oP '^linux-image-[^:]*')
echo "Добавление $p"
dpkg-reconfigure $p
done
На этом этапе вы можете перезагрузиться, и всё должно заработать.
Потенциальные проблемы:
-
systemd-bootx64.efi не подписан для Secure Boot – если у вас включен Secure Boot на вашем оборудовании, вам нужно будет либо отключить его, либо подписать systemd-bootx64.efi самостоятельно и добавить ваш ключ подписи в BIOS.
-
systemd-boot по умолчанию не показывает меню загрузки. Если вы хотите увидеть меню загрузки, увеличьте таймаут в
/boot/efi/loader/loader.conf
. Таймаут по умолчанию составляет 0 секунд. -
Если
systemd-boot
не запускается при перезагрузке, попробуйте загрузить его вручную из вашего меню загрузки BIOS. Если он работает нормально из BIOS, но не установлен по умолчанию, выполнитеefibootmgr
и проверьте, чтоBootOrder
имеетSYSTEMD-BOOTX64.EFI
в начале, что-то вроде:BootCurrent: 0007 Timeout: 0 seconds BootOrder: 0007,0003,0000,0001,0006 ... Boot0007* Linux Boot Manager HD(1,GPT,8fbe...,0x800,0x100000)/File(\EFI\SYSTEMD\SYSTEMD-BOOTX64.EFI)
Это должно было быть настроено автоматически, когда вы впервые установили systemd-boot. Если
BootOrder
не имеетSYSTEMD-BOOTX64.EFI
в первой записи, исправьте это с помощьюefibootmgr --bootorder xxxx, yyyy, zzzz
, заменив xxxx и др. по мере необходимости.Если он всё ещё не загружается по умолчанию, проверьте настройки BIOS. Некоторые системы игнорируют переменные загрузки EFI при определенных условиях (например, BIOS HP, если установлен на загрузку с диска, будет игнорировать переменные загрузки EFI и всегда запускать
BOOTX64.EFI
с этого диска).
Ответ или решение
Замена GRUB на загрузчик systemd-boot в Ubuntu 20.04
Загрузка операционной системы — это важнейшая часть её работы, и выбор загрузчика также играет значительную роль в системе. В этой статье мы рассмотрим, как заменить GRUB на systemd-boot в Ubuntu 20.04, предоставляя детальные шаги и рекомендации.
Шаг 1: Подготовка
Перед тем как начать, убедитесь, что у вас есть доступ к root
или возможность использовать sudo
. Также важно знать UUID вашего корневого раздела, и выполнить следующие команды для подготовки системы:
sudo -i # Вход в режим суперпользователя
Шаг 2: Переход в EFI-раздел
Сначала нам нужно переместиться в ваш EFI-раздел, чтобы установить там загрузчик:
cd /boot/efi
Здесь мы создадим необходимые директории:
mkdir -p loader/entries
mkdir ubuntu
Шаг 3: Настройка конфигурационного файла загрузчика
Создайте файл конфигурации загрузчика:
echo -e "default ubuntu\n\ntimeout 1\neditor 0" > /boot/efi/loader/loader.conf
Шаг 4: Создание скрипта для обновления systemd-boot
Создайте скрипт, который будет автоматически обновлять записи systemd-boot при изменении ядра. Создайте файл /etc/kernel/postinst.d/zz-update-systemd-boot
с помощью:
nano /etc/kernel/postinst.d/zz-update-systemd-boot
Вставьте следующий код (не забудьте изменить CHANGEME
на ваши значения):
#!/bin/bash
# Скрипт для обновления записей systemd-boot при установке новых ядер
# UUID вашего диска
UUID="CHANGEME"
# LUKS volume, если используется
VOLUME="CHANGEME"
# Опции rootflags, если применимо
ROOTFLAGS="CHANGEME"
KERNELS=()
FIND="find /boot -maxdepth 1 -name 'vmlinuz-*' -type f -print0 | sort -rz"
while IFS= read -r -u3 -d $'\0' LINE; do
KERNEL=$(basename "${LINE}")
KERNELS+=("${KERNEL:8}")
done 3< <(eval "${FIND}")
# Проверяем наличие ядер
if [ ${#KERNELS[@]} -lt 1 ]; then
echo -e "\e[2msystemd-boot\e[0m \e[1;31mNo kernels found.\e[0m"
exit 1
fi
# Очистка старых записей
rm /boot/efi/loader/entries/*.conf
mkdir /boot/efi/ubuntu
LATEST="${KERNELS[@]:0:1}"
for FILE in config initrd.img System.map vmlinuz; do
cp "/boot/${FILE}-${LATEST}" "/boot/efi/ubuntu/${FILE}"
echo -e "title Ubuntu GNOME\nlinux /ubuntu/vmlinuz\ninitrd /ubuntu/initrd.img\noptions root=UUID=${UUID} ro\n" > /boot/efi/loader/entries/ubuntu.conf
done
# Вывод результата
echo "Success!"
exit 0
Сохраните файл и задайте правильные права:
chown root: /etc/kernel/postinst.d/zz-update-systemd-boot
chmod 0755 /etc/kernel/postinst.d/zz-update-systemd-boot
Шаг 5: Установка systemd-boot
Теперь установим systemd-boot:
bootctl install --path=/boot/efi
Шаг 6: Проверка и настройка загрузчика
Проверьте порядок загрузки с помощью:
efibootmgr
Убедитесь, что SYSTEMD-BOOTX64.EFI
находится в верхней части списка. В случае необходимости измените порядок с помощью:
efibootmgr --bootorder xxxx, yyyy, zzzz # где xxxx, yyyy и zzzz - идентификаторы запусков
Шаг 7: Удаление GRUB
После успешного тестирования новой конфигурации можно удалить GRUB:
apt-get purge grub*
apt-get autoremove --purge
Заключение
Теперь вы успешно заменили GRUB на systemd-boot в Ubuntu 20.04. Этот новый загрузчик обладает простотой, высокой скоростью загрузки и гибким управлением параметрами ядра. Не забывайте поддерживать систему в актуальном состоянии, а также периодически проверять конфигурации для предотвращения потенциальных проблем с загрузкой.