Я пытаюсь создать загрузочный ISO-образ CD UEFI с разбитой файловой системой из виртуальной машины, на которой я снабдил все необходимое.
Объяснить:
- Я использую упаковщик и файл kickstart для установки CentOS 7
- Я использую скрипт-упаковщик для компиляции некоторых бинарных файлов, которые мне нужны в образе.
- Я следовал инструкциям отздесьдля создания сжатого образа файловой системы после того, как все необходимое находится в ОС:
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 \;
- После этого я взял несколько сценариев изздесьдля создания 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?
Обновлять
После некоторого гугления я переключился на 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, более нового dracut, который может обрабатывать мою структуру, и теперь моя единственная проблема при загрузке — это необходимость иметь /etc/fstab
исходную машину, которую, я надеюсь, Google поможет мне решить:D
Обновление 3
Простое игнорирование /etc/fstab
along /dev
и /proc` при создании squashfs помогло — финальный ISO успешно загрузился в режиме UEFI.