ПересборкаALT

Материал из wiki.nntc.nnov.ru
Перейти к навигации Перейти к поиску

Пересборка 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 образа.