필요한 항목을 프로비저닝한 가상 머신의 압축된 파일 시스템을 사용하여 UEFI 부팅 가능 CD ISO를 생성하려고 합니다.
설명하기:
- CentOS 7을 설치하기 위해 packer와 kickstart 파일을 사용합니다.
- 패커 프로비저닝 스크립트를 사용하여 이미지에 필요한 일부 바이너리 항목을 컴파일합니다.
- 나는 선생님의 지시를 따랐다.여기필요한 모든 것이 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 \;
- 그 후 나는 다음에서 몇 가지 스크립트를 가져왔습니다.여기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 모드에서 성공적으로 부팅됩니다.