Как преобразовать rootfs debootstrap в загрузочный пользовательский EFI ISO с GRUB?

Вопрос или проблема

Я экспериментирую с созданием “кастомной” специализированной Linux-дистрибуции на основе Debian (в стиле Clonezilla или даже GPartedOS). В моем случае это Python-скрипт, который запускается при загрузке. Сейчас это простое приложение “Hello, World!”, которое обновляет экран с отображением количества секунд, в течение которых работает скрипт (просто для теста).

Я создал скрипт для генерации rootfs, а также для компиляции и установки Python 3.11 в него:

# Скрипт сборки образа для загрузки
# Создает небольшой, специализированный загрузочный (только UEFI) x64 ISO на основе Debian.
# Этот скрипт в настоящее время поддерживает запуск только на хостах Debian!!!

set -e

ROOT_DIR="rootfs"

# Выполнение debootstrap для создания rootfs, если он не существует
[ ! -d $ROOT_DIR ] && sudo debootstrap --arch=amd64 buster $ROOT_DIR

set +e # если этого здесь нет, любая будущая ошибка приведет к остановке скрипта, и временные директории не будут размонтированы, что означает, что хост-система будет медленно выходить из строя до перезагрузки.

# Вход в CHROOT и изменение rootfs

cat << EOF | sudo chroot $ROOT_DIR
set -e
export DEBIAN_FRONTEND=noninteractive
debconf-set-selections <<< "grub-efi-amd64 grub2/update_nvram boolean false"
mount none -t proc /proc
mount none -t sysfs /sys
mount none -t devpts /dev/pts
export HOME=/root
export LC_ALL=C
export PS1="\e[01;31m(debootstrap):\W \$ \e[00m"

apt-get update
apt-get install dialog dbus -y
dbus-uuidgen > /var/lib/dbus/machine-id
apt-get install linux-image-amd64 live-boot linux-headers-amd64 grub-efi -y
# apt-get install python3
apt-get clean -y
EOF

PYTHON_INSTALL_SCRIPT=$( cat build-python.sh )

cat build-python.sh | sudo chroot $ROOT_DIR

cat << EOF | sudo chroot $ROOT_DIR
# Очистка перед выходом
rm /var/lib/dbus/machine-id && rm -rf /tmp/*
umount /proc /sys /dev/pts
EOF

Моя цель – превратить это в загрузочный ISO-образ только с UEFI и GRUB, поскольку этот образ будет содержать инструменты, несовместимые с системами BIOS/CSM. Как мне превратить это в загрузочный ISO-образ GRUB (возможно, мне нужно, чтобы финальный ISO-образ содержал некоторые дополнительные файлы, поэтому ISO будет создан из каталога).

Ответ или решение

Чтобы превратить созданный debootstrap rootfs в загрузочный образ ISO с поддержкой UEFI и GRUB, выполните следующие шаги. Данная инструкция предполагает, что вы уже создали rootfs и установили необходимые пакеты. Основные шаги:

  1. Установите необходимые инструменты: Прежде всего, убедитесь, что у вас установлены необходимые пакеты на вашей хост-системе для сборки образа ISO. Эти пакеты включают genisoimage, grub-pc-bin, и grub-efi-amd64-bin. Их можно установить с помощью следующей команды:

    sudo apt-get install genisoimage grub-pc-bin grub-efi-amd64-bin
  2. Создайте структуру каталогов для ISO: Создайте директорию, куда вы будете помещать ваш rootfs и другие файлы.

    mkdir -p iso/boot/grub
  3. Скопируйте rootfs в образ: Скопируйте содержимое вашего rootfs в директорию iso.

    sudo cp -r rootfs/* iso/
  4. Создайте конфигурационный файл GRUB: Создайте файл grub.cfg в каталоге iso/boot/grub/ с содержимым:

    set timeout=5
    set default=0
    
    menuentry "My Custom Distro" {
        linux /vmlinuz root=/dev/sr0 quiet
        initrd /initrd.img
    }

    Убедитесь, что пути к vmlinuz и initrd.img соответствуют вашему корневому файловой системе.

  5. Копирование ядра и initrd: Скопируйте бинарные файлы вашего ядра и initrd в папку iso/.

    sudo cp $ROOT_DIR/boot/vmlinuz*" iso/vmlinuz
    sudo cp $ROOT_DIR/boot/initrd.img*" iso/initrd.img
  6. Создание загрузочного ISO-образа: Используйте genisoimage для создания загрузочного образа ISO. Включите поддержку загрузки через UEFI с помощью GRUB:

    sudo genisoimage -o custom-distro.iso -b boot/grub/i386-efi/core.efi \
        -c boot/grub/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table iso
  7. Добавление дополнительных файлов (по желанию): Вы можете добавить дополнительные файлы в вашу iso папку перед созданием ISO. Эти файлы будут включены в финальный образ ISO.

  8. Проверка ISO-образа: После создания образа ISO, вы можете протестировать его с помощью эмулятора, такого как QEMU:

    qemu-system-x86_64 -enable-kvm -boot d -cdrom custom-distro.iso
  9. Загрузка с USB (опционально): Если вы хотите записать ISO на USB-накопитель, вы можете использовать dd, следуя этим инструкциям, убедившись, что вы выбрали правильный целевой диск:

    sudo dd if=custom-distro.iso of=/dev/sdX bs=4M

    Примечание: Замените /dev/sdX на ваш фактический идентификатор USB-накопителя.

Следуя этим шагам, вы сможете создать загрузочный ISO-образ с пользовательским rootfs, который будет работать только в режиме UEFI с помощью загрузчика GRUB. Убедитесь, что вы тщательно тестируете образ, чтобы гарантировать стабильную работу вашего специфического программного обеспечения.

Оцените материал
Добавить комментарий

Капча загружается...