Назад | Перейти на главную страницу

Загрузка сжатой файловой системы из ISO

Я пытаюсь создать ISO-образ загрузочного компакт-диска UEFI с раздавленной файловой системой с виртуальной машины, которую я снабдил всем необходимым.

Объяснять:

  1. Я использую упаковщик и файл кикстарта для установки CentOS 7
  2. Я использую сценарий подготовки упаковщика для компиляции некоторых двоичных файлов, которые мне нужны на изображении
  3. Я следовал инструкциям из Вот чтобы создать сжатый образ файловой системы после того, как все, что мне нужно, находится в ОС:
mkdir -p /mnt/squashfs /squashfs
mount -o bind / /mnt/squashfs

mksquashfs /mnt/squashfs /squashfs/filesystem.squashfs -comp gzip -no-exports -xattrs -noappend -no-recovery -e /mnt/squashfs/squashfs/filesystem.squashfs
find /boot -name 'vmlinuz-*' -type f -exec cp {} /squashfs/vmlinuz \;
find /boot -name 'init*' -type f -exec cp {} /squashfs/initrd.img \;
  1. После этого я взял несколько скриптов из Вот для создания ISO:
yum -y install xorriso dosfstools grub2-efi-modules mtools

mkdir -p /iso /iso_src/ /iso_src/live
find /boot -name 'vmlinuz-*' -type f -exec cp {} /iso_src/vmlinuz \;
find /boot -name 'init*' -type f -exec cp {} /iso_src/initrd.img \;
cp /squashfs/filesystem.squashfs /iso_src/live/
touch /iso_src/LINUX_CUSTOM

cat <<'EOF' >grub.cfg

search --set=root --file /LINUX_CUSTOM

insmod all_video

set default="0"
set timeout=30

menuentry "Custom Linux" {
    linux /vmlinuz boot=live toram=filesystem.squashfs quiet nomodeset
    initrd /initrd.img
}
EOF

grub2-mkstandalone \
    --format=x86_64-efi \
    --output=bootx64.efi \
    --locales="" \
    --fonts="" \
    "boot/grub/grub.cfg=grub.cfg"

 (dd if=/dev/zero of=efiboot.img bs=1M count=10 && \
    mkfs.vfat efiboot.img && \
    mmd -i efiboot.img efi efi/boot && \
    mcopy -i efiboot.img ./bootx64.efi ::efi/boot/
)

xorriso \
    -as mkisofs \
    -iso-level 3 \
    -full-iso9660-filenames \
    -volid "LINUX_CUSTOM" \
    -eltorito-alt-boot \
        -e EFI/efiboot.img \
        -no-emul-boot \
    -append_partition 2 0xef efiboot.img \
    -output "/iso/image.iso" \
    -graft-points \
        "/iso_src" \
        /EFI/efiboot.img=efiboot.img

Теперь я пытаюсь загрузить этот ISO в VirtualBox с включенным UEFI, но он не работает с

Failed to switch root: Specified switch root path '/sysroot' does not seem to be an OS tree

Насколько я понимаю, мой squashfs не смонтирован? Я новичок в этом, поэтому у меня есть частичное представление обо всех шагах, и мне кажется, что я чего-то упускаю, поскольку единственное, что сообщает grub, что вместо машины, с которой я сделал изображение (где было фактическое блочное устройство) теперь мне нужно, чтобы моя файловая система происходила из файла squashfs, это toram вещь.

Может ли кто-нибудь предоставить указатели / примеры того, как решить эту проблему и заставить эту систему загружаться? Я много читал о dracut но не мог понять, как его использовать в таком сценарии? Или это просто проблема с файлом конфигурации grub?

Обновить

После некоторого поиска в Google я переключился на dracut, теперь в моем сценарии подготовки я использую dracut для генерации initrd следующим образом:

dracut -a dmsquash-live -N -m "kernel-modules base" --filesystems "squashfs" /dracut/initrd.dracut.img

и используйте следующую загрузочную запись grub (initrd.img здесь - это initrd.dracut.img, созданный ранее):

menuentry "Custom Linux" {
    linux /vmlinuz root=live:/dev/sr0 rd.live.debug=1
    initrd /initrd.img
}

это, кажется, идет дальше, но не удается Warning: /dev/mapper/live-rw does not exist

Обновление 2

Похоже, что CentOS 7 поставляется с более старой версией dracut, которая поддерживает только режим Live CD (см. The filesystem structure is traditionally expected to be: под Booting live images, которой моя структура не соответствовала). Итак, я начал с CentOS 8, более нового дракута, который может обрабатывать мою структуру, и теперь моя единственная проблема при загрузке - это наличие /etc/fstab с оригинальной машины, и я надеюсь, что Google поможет мне решить: D

Обновление 3

Просто игнорируя /etc/fstab вместе /dev и / proc` при создании squashfs сделали свое дело - окончательный ISO успешно загружается в режиме UEFI.