ПересборкаALT
Содержание
Пересборка ALT
На примере пересборки спасательного диска Rescue
Подготовка
Текущая статья тестировалась и отлаживалась на дистрибутиве Альт стартеркит MATE
Для пересборки потребуется обновить систему
su -
apt-get update
apt-get dist-upgrade
update-kernel
затем установить ряд инструментов
apt-get install -y xorriso squashfs-tools cdrkit-utils genisoimage
Распаковка
Работать будем под суперпользователем в каталоге /opt
Переходим в каталог
cd /opt
создаём рабочий каталог
mkdir maker
переходим в него
cd maker
скачиваем исходный образ в файл с именем alt-rescue-x86_64.iso
wget http://nightly.altlinux.org/sisyphus/tested/regular-rescue-latest-x86_64.iso -O alt-rescue-x86_64.iso
создаём каталог для распаковки iso образа
mkdir iso_contents
распаковываем образ
xorriso -osirrox on -indev alt-rescue-x86_64.iso -extract / iso_contents
распаковываем squashfs из образа
unsquashfs iso_contents/rescue
Модификация
Если распаковка выполнена верно, то в каталоге
/opt/maker/squashfs-root
должна быть доступна файловая система, которую мы достали из squashfs.
Эта файловая система теперь доступна для модификации.
Например, в неё можно выполнить chroot, доустановить или удалить программное обеспечение через apt-get, положить кастомные скрипты и т.д.
Словом, с этой файловой системой можно делать всё, что можно делать с любой корневой файловой системой GNU/Linux.
Для примера создадим скрипт кастомизации и сделаем его исполняемым
cat << 'EOF' > /opt/maker/squashfs-root/bin/hello-world.sh #!/bin/bash echo "Hello, World" EOF
chmod +x /opt/maker/squashfs-root/bin/hello-world.sh
Запаковка
Запаковка выполняется в обратном порядке.
Сначала собирается squashfs из модифицированной файловой системы, затем собирается iso образ.
Выполнять команды необходимо, стоя в каталоге
/opt/maker
Переходим в него
cd /opt/maker
Собираем squashfs.
Сначала удаляем предыдущий squashfs (нам же на его место нужно собрать новый)
rm -f iso_contents/rescue
затем создаём новый
mksquashfs squashfs-root/ iso_contents/rescue
Далее нужно скопировать файлы загрузчика из squashfs внутрь содержимого будущего iso образа
cp -r squashfs-root/usr/lib/syslinux/* iso_contents/syslinux/
Затем нужно оторвать 512 байт от исходного образа и положить туда же
dd if=alt-rescue-x86_64.iso of=iso_contents/syslinux/isohdpfx.bin bs=512 count=1
Затем можно собрать новый образ командой
cd iso_contents/ xorriso -follow param \ -as mkisofs \ -J -l -r \ -b syslinux/isolinux.bin \ -c boot/grub/boot.cat \ -no-emul-boot \ -boot-load-size 4 \ -boot-info-table \ -isohybrid-mbr syslinux/isohdpfx.bin \ -partition_offset 16 \ -iso-level 3 -full-iso9660-filenames -sysid "LINUX" \ -volid "AltRerscue10" -volset "ALT" -publisher "VASYA LTD" \ -appid "AltRerscue10 X86_64 2023-12-05" -copyright "LICENSE_ALL_HTML"\ -eltorito-alt-boot \ -e EFI/.efiboot.img \ -no-emul-boot \ -isohybrid-gpt-basdat -o ../rescue.iso . cd ..
результат будет находиться в файле
/opt/maker/rescue.iso
Данный результат будет гибридным, вполне загружающимся и в режиме EFI и в режиме Legacy, однако по функционалу он будет немного отличаться от исходного образа. И дело даже не в том, что мы добавили туда скрипт hello-world.sh.
Собранный таким образом iso образ на одном из этапов загрузки не найдёт диск, с которого ему необходимо загрузить squashfs и выдаст диалог выбора. Посредством этого диалога можно будет выбрать нужный squashfs и загрузить систему.
Такой подход не устроит многих перфекционистов, поэтому, если хочется сделать как положено, то читаем следующий раздел.
Проблема
Проблема выше описанной ситуации заключается в том, что при сборке iso образа утилита
xorriso
в качестве uuid-а для диска генерирует новую строку со штампом текущего времени. А в конфигурациях загрузчика в качестве определения диска используется uuid, да при том ещё и старый.
А, поскольку, uuid при сборке iso генерируется на базе штампа системного времени, понятное дело, что не получится модифицировать конфиги загрузчиков до пересборки диска. Ну или получится, но нужно будет подгадывать "ту самую минуту того самого часа" и вот это вот всё... Не надо нам такое...
Различные попытки "подсунуть" этой утилите строковую константу для установки этого uuid-а закончились неудачей.
Поэтому вопрос решаем кардинально -- объясняем загрузчику, что грузить squashfs нужно не по uuid-у диска, а по его имени.
Решение
В предыдущем разделе не просто так про конфигурации загрузчика сказано во множественном числе. Оказывается, их целых две.
Диск же гибридный. Следовательно, есть отдельные конфигурации загрузчика для режима EFI для режима Legacy.
Поэтому для переключения загрузки с uuid-ов на имена дисков необходимо ПЕРЕД СБОРКОЙ iso образа отредактировать два конфигурационных файла:
iso_contents/boot/grub/grub.cfg
и
iso_contents/syslinux/isolinux.cfg
Например в файле
iso_contents/syslinux/isolinux.cfg
необходимо в конфигурациях пунктов меню типа этой
label rescue menu label ^Rescue LiveCD kernel /boot/vmlinuz append initrd=/boot/initrd.img fastboot live root=bootchain bootchain=fg,altboot automatic=method:disk,uuid:2023-11-15-06-14-46-00 stagename=rescue ramdisk_size=724705 no>
заменить секцию
automatic=method:disk,uuid:2023-11-15-06-14-46-00
на
automatic=method:cdrom
Так нужно сделать для всех секций, загрузка которых важна после сборки диска. Лишние секции, при необходимости, можно убрать. Также можно кастомизировать их названия
То же самое нужно будет сделать и для секций типа
menuentry $"Rescue LiveCD" --id 'rescue' { savedefault echo $"Loading Linux vmlinuz$KFLAVOUR ..." linux /boot/vmlinuz$KFLAVOUR changedisk fastboot live root=bootchain bootchain=fg,altboot automatic=method:disk,uuid:2023-11-15-06-14-46-00 stagename=rescue ramdisk_size=> echo $"Loading initial ramdisk ..." initrd /boot/initrd$KFLAVOUR.img }
в файле
iso_contents/boot/grub/grub.cfg
После чего повторить процедуру сборки iso образа.