Вопрос или проблема
Я экспериментирую с созданием “кастомной” специализированной 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 и установили необходимые пакеты. Основные шаги:
-
Установите необходимые инструменты: Прежде всего, убедитесь, что у вас установлены необходимые пакеты на вашей хост-системе для сборки образа ISO. Эти пакеты включают
genisoimage
,grub-pc-bin
, иgrub-efi-amd64-bin
. Их можно установить с помощью следующей команды:sudo apt-get install genisoimage grub-pc-bin grub-efi-amd64-bin
-
Создайте структуру каталогов для ISO: Создайте директорию, куда вы будете помещать ваш rootfs и другие файлы.
mkdir -p iso/boot/grub
-
Скопируйте rootfs в образ: Скопируйте содержимое вашего
rootfs
в директориюiso
.sudo cp -r rootfs/* iso/
-
Создайте конфигурационный файл 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
соответствуют вашему корневому файловой системе. -
Копирование ядра и initrd: Скопируйте бинарные файлы вашего ядра и initrd в папку
iso/
.sudo cp $ROOT_DIR/boot/vmlinuz*" iso/vmlinuz sudo cp $ROOT_DIR/boot/initrd.img*" iso/initrd.img
-
Создание загрузочного 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
-
Добавление дополнительных файлов (по желанию): Вы можете добавить дополнительные файлы в вашу
iso
папку перед созданием ISO. Эти файлы будут включены в финальный образ ISO. -
Проверка ISO-образа: После создания образа ISO, вы можете протестировать его с помощью эмулятора, такого как QEMU:
qemu-system-x86_64 -enable-kvm -boot d -cdrom custom-distro.iso
-
Загрузка с USB (опционально): Если вы хотите записать ISO на USB-накопитель, вы можете использовать
dd
, следуя этим инструкциям, убедившись, что вы выбрали правильный целевой диск:sudo dd if=custom-distro.iso of=/dev/sdX bs=4M
Примечание: Замените
/dev/sdX
на ваш фактический идентификатор USB-накопителя.
Следуя этим шагам, вы сможете создать загрузочный ISO-образ с пользовательским rootfs
, который будет работать только в режиме UEFI с помощью загрузчика GRUB. Убедитесь, что вы тщательно тестируете образ, чтобы гарантировать стабильную работу вашего специфического программного обеспечения.