ISOから圧縮されたファイルシステムを起動する

ISOから圧縮されたファイルシステムを起動する

必要なものをプロビジョニングした仮想マシンから圧縮されたファイルシステムを使用して、UEFI ブート可能な CD ISO を作成しようとしています。

説明する:

  1. CentOS 7をインストールするには、packerとキックスタートファイルを使用します
  2. 私はパッカープロビジョニングスクリプトを使用して、イメージに必要なバイナリをコンパイルします。
  3. 私は以下の指示に従いましたここ必要なものがすべて OS に揃った後、圧縮されたファイルシステム イメージを作成します。
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 構成ファイルの問題なのでしょうか?

アップデート

グーグルで検索した後、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 には、Live CD モードのみをサポートする古い dracut が付属しているようです (The filesystem structure is traditionally expected to be:の下を参照Booting live images、私の構造はそれに適合していませんでした)。そこで、新しい dracut である CentOS 8 からやり直しました。これは私の構造を処理できます。起動時に発生する唯一の問題は、/etc/fstab元のマシンからの があることです。Google が解決してくれることを願っています:D

アップデート3

squashfs を作成するときに/etc/fstabalongと /proc`を無視するだけで問題は解決しました。最終的な ISO は UEFI モードで正常に起動します。/dev

関連情報