从 ISO 启动压缩的文件系统

从 ISO 启动压缩的文件系统

我正在尝试从虚拟机中创建带有压缩文件系统的 UEFI 可启动 CD ISO,并为它配置了我需要的东西。

解释:

  1. 我使用打包程序和 kickstart 文件来安装 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

现在我尝试在启用 UEFI 的 VirtualBox 中启动该 ISO,但失败了

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 开始,这是一个较新的 dracut,它可以处理我拥有的结构,现在我启动时唯一的问题是/etc/fstab从原始机器获取,我希望 Google 能帮助我解决这个问题:D

更新 3

在制作 squashfs 时只需忽略/etc/fstabalong和 /proc` 就可以了 - 最终的 ISO 在 UEFI 模式下成功启动。/dev

相关内容