ISO에서 압축된 파일 시스템 부팅

ISO에서 압축된 파일 시스템 부팅

필요한 항목을 프로비저닝한 가상 머신의 압축된 파일 시스템을 사용하여 UEFI 부팅 가능 CD ISO를 생성하려고 합니다.

설명하기:

  1. CentOS 7을 설치하기 위해 packer와 kickstart 파일을 사용합니다.
  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/fstab따라 /dev및 /proc`을 무시하면 성공했습니다. 최종 ISO는 UEFI 모드에서 성공적으로 부팅됩니다.

관련 정보