설치에 사용할 수 있도록 FreeBSD ISO의 압축을 풀고 다시 패키지하는 스크립트를 작성하려고 합니다. 목표는 무인 설치입니다.
다음 스크립트를 작성했지만 작동하지 않습니다. 원래 ISO는 UEFI 모드의 VirtualBox에서 부팅되지만 새로 생성된 ISO는 그렇지 않습니다.
#!/bin/sh
inst_cfg="$1"
src_iso="$2"
dst_iso="$3"
iso_mnt=$(mktemp -d /tmp/freebsd-mnt-XXXXXX)
iso_wrk=$(mktemp -d /tmp/freebsd-wrk-XXXXXX)
vol_id=$(isoinfo -d -i "${src_iso}" | sed -n -e 's/^Volume id: \(.*\)$/\1/p')
md_name=$(mdconfig -a -t vnode -f "${src_iso}")
mount -t cd9660 "/dev/${md_name}" "${iso_mnt}"
cp -a -v "${iso_mnt}/" "${iso_wrk}"
cp "${inst_cfg}" "${iso_wrk}/etc/installerconfig"
mkisofs -J -R -no-emul-boot -V "${vol_id}" -b boot/cdboot -o "${dst_iso}" "${iso_wrk}"
umount "${iso_mnt}" # cd9660
mdconfig -d -u "${md_name}"
rm -rf "${iso_mnt}"
rm -rf "${iso_wrk}"
생성된 파일 시스템이 좋아 보입니다. 원본 ISO와 사용자 정의 ISO의 파일을 비교했는데 유일한 차이점은 installerconfig
추가된 파일입니다. boot.catalog
(추가된 것은 이해 mkisofs
하지만 왜 그렇습니까? 이것이 문제가 될 수 있습니까?)
, , mkisofs
등 다양한 옵션 조합을 시도했지만 별 차이가 없습니다.-R -U
-L -D -R
-J -R
또한,FreeBSD 매뉴얼흥미로운 점은 다음 댓글입니다.
따라서 /tmp/myboot가 /tmp/myboot/boot/cdboot에 있는 부팅 이미지로 부팅 가능한 FreeBSD 시스템을 호스팅하는 경우 이 명령은 /tmp/bootable.iso를 생성합니다:
mkisofs -R -no-emul-boot -b boot/cdboot -o /tmp/bootable.iso /tmp/myboot
이것은 실제로아니요UEFI 모드의 VirtualBox에서 부팅되는 ISO를 생성합니다.
무엇이 잘못되고 있는지 아는 사람이 있나요?
답변1
문제는 파일 시스템 내용이 아니라 부트 레코드와 파티션에 있습니다.
$ xorriso -indev FreeBSD-12.0-RELEASE-amd64-bootonly.iso -report_el_torito plain -report_system_area plain
...
libisofs: WARNING : Found hidden El-Torito image. Its size could not be figured out, so image modify or boot image patching may lead to bad results.
libisofs: NOTE : Found hidden El-Torito image for EFI.
libisofs: NOTE : EFI image start and size: 20 * 2048 , 1600 * 512
...
Boot record : El Torito , MBR protective-msdos-label cyl-align-off GPT
...
El Torito catalog : 19 1
El Torito images : N Pltf B Emul Ld_seg Hdpt Ldsiz LBA
El Torito boot img : 1 BIOS y none 0x0000 0x00 4 420
El Torito boot img : 2 UEFI y none 0x0000 0x00 1600 20
El Torito img blks : 1 1204
El Torito img blks : 2 400
System area options: 0x00000201
System area summary: MBR protective-msdos-label cyl-align-off GPT
ISO image size/512 : 675508
Partition offset : 0
MBR heads per cyl : 0
MBR secs per head : 0
MBR partition table: N Status Type Start Blocks
MBR partition : 1 0x00 0xee 1 676107
GPT : N Info
GPT backup problems: Not a GPT 1.0 header of 92 bytes for 128 bytes per entry
GPT disk GUID : 7ce0bf52def9e8118c360cc47ad8b808
GPT entry array : 2 2 separated
GPT lba range : 3 676105 676107
GPT partition name : 1
GPT partition GUID : 1 6de0bf52def9e8118c360cc47ad8b808
GPT type GUID : 1 28732ac11ff8d211ba4b00a0c93ec93b
GPT partition flags: 1 0x0000000000000000
GPT start and size : 1 80 1600
GPT partition name : 2
GPT partition GUID : 2 73e0bf52def9e8118c360cc47ad8b808
GPT type GUID : 2 9d6bbd83417fdc11be0b001560b84f0f
GPT partition flags: 2 0x0000000000000000
GPT start and size : 2 3 29
BIOS 부팅 이미지나 EFI 시스템 파티션은 ISO의 파일이 아니라 이름이 지정되지 않은 블록 영역입니다.
고정 성장 세션이나 추가 세션을 사용하지 않는 경우
cp FreeBSD-12.0-RELEASE-amd64-bootonly.iso new.iso
xorriso -boot_image any keep \
-dev new.iso \
-map /path/to/your_installerconfig /etc/installerconfig
[other -map commands for files or directory trees ...]
그런 다음 이러한 영역을 추출해야 합니다.
dd if=FreeBSD-12.0-RELEASE-amd64-bootonly.iso bs=512 skip=80 count=1600 \
of=efi_part.img
dd if=FreeBSD-12.0-RELEASE-amd64-bootonly.iso bs=512 skip=1680 count=4816 \
of=bios_boot.img
(El Torito는 2048 블록으로 LBA를 제공하지만 크기는 512 블록입니다. 4 * 420 = 1680입니다. 1204 2048 바이트 블록의 BIOS 이미지 크기는 420보다 높은 가장 낮은 파일 시스템 개체 LBA로 추정됩니다. 아마도 더 작지만 무엇이든 가능합니다. 너무 크면 아프지 않습니다).
그런 다음 USB 디스크에서 BIOS를 부팅하는 MBR 코드가 있습니다.
dd if=FreeBSD-12.0-RELEASE-amd64-bootonly.iso bs=1 count=446 \
of=mbr_code.img
BIOS를 통해 부팅할 계획이 없다면 bios_boot.img 및 mbr_code.img가 필요하지 않습니다.
압축을 푼 주요 계산 트리 $HOME/files_for_iso 및 추출된 이미지 파일에서 새 ISO를 빌드합니다.
xorriso -as mkisofs \
-o new.iso \
-d -l -r \
-V "12_0_RELEASE_AMD64_BO" \
-G mbr_code.img \
-b /bios_boot.img \
-no-emul-boot -boot-load-size 4 \
-eltorito-alt-boot \
-append_partition 2 0xef efi_part.img \
-e '--interval:appended_partition_2:all::' \
-no-emul-boot \
bios_boot.img $HOME/files_for_iso
이는 GPT를 생성하지 않지만 0x83(ISO 파일 시스템용) 및 0xef(EFI 시스템 파티션용) 유형의 두 파티션을 포함하는 MBR 파티션 테이블을 생성합니다.
(USB 스틱에서 부팅할 때 BIOS를 테스트해야 합니까? 많은 MBR에는 부팅 프로세스의 다음 단계를 찾기 위해 패치 정보가 필요합니다.)
답변2
iso를 풀고 패키징하는 것보다 표준 이미지 위에 또 다른 cd9660 세션을 생성하여 추가 파일을 추가하는 것이 훨씬 쉽습니다.
cp FreeBSD-12.0-RELEASE-amd64-bootonly.iso new.iso
volid=$(isoinfo -d -i new.iso | awk '/Volume id/{print$3}')
growisofs -M new.iso -d -l -r -V "$volid" -graft-points \
/etc/installerconfig=/path/to/your_installerconfig \
[other files ...]
이는 이전 세션의 부팅 이미지를 "상속"해야 하며, 동일한 경로를 가진 새 파일은 디스크에 이미 있는 파일을 덮어씁니다(그러나 최신 파일인 경우에만 표준 mkisofs
/ 사용 genisoimage
).
새 세션의 볼륨 ID가 이전 세션과 동일하게 설정되지 않는 한(위에 설명된 대로) FreeBSD 설치 프로그램은 자동으로 CD를 마운트하지 않고 mountroot>
.
qemu를 사용하여 위의 내용을 테스트했습니다.OVMFUEFI 펌웨어여기, 다음 명령줄을 사용합니다.
qemu-system-x86_64 -enable-kvm -m 2G -serial none \
-bios ovmf-x64/OVMF-pure-efi.fd -cdrom new.iso
UEFI 부팅 가능 CD를 처음부터 새로 만들어야 하는 경우 FreeBSD에서 자세한 정보를 찾을 수 있습니다.위키피디아("UEFI에서 CD/DVD 부팅" 아래) 및여기.
FreeBSD가 손상된 성장 파일
버그로 인해 growisofs
장치 대신 일반 파일과 함께 사용할 때 FreeBSD에서 충돌이 발생합니다. 이를 방지하려면 다음 차이점을 적용해야 growisofs.c
합니다 patch -l
.
--- growisofs.c~ 2018-12-14 07:32:38.814189935 +0200
+++ growisofs.c 2018-12-14 07:32:43.602431986 +0200
@@ -3471,7 +3471,8 @@
CLOSEONEXEC(in_fd);
CLOSEONEXEC(out_fd);
#if !(defined(__APPLE__) && defined(__MACH__))
- CLOSEONEXEC(ioctl_fd);
+ if(ioctl_handle != INVALID_HANDLE)
+ CLOSEONEXEC(ioctl_fd);
#endif
#undef CLOSEONEXEC
답변3
부팅 가능한 ISO 생성에 관한 많은 문서의 문제점은 기본적으로 비 UEFI 부팅으로 설정되는 경향이 있다는 것입니다.
다음은 CD/DVD 미디어에서 UEFI 부팅에 대한 정보가 포함된 좋은 참고 자료입니다.https://dev.lovelyhq.com/libburnia/libisofs/raw/master/doc/boot_sectors.txt
따라서 이전에 BIOS에서 사용한 것처럼 UEFI에서 별도의 El Torito 부팅 이미지를 사용하려면 부팅 이미지에 올바른 부팅 이미지가 포함되어 있는지 확인해야 합니다.플랫폼 IDUEFI용 바이트. x86 BIOS의 경우 플랫폼 ID는 0입니다. PowerPC는 1을 사용하고, 값 2는 Mac을 지정하며, UEFI는 0xef 값(10진수 239)을 지정합니다.
그래서 제 생각에는 당신은일부플랫폼 ID 값을 지정하는 방법: 직접 또는 일부 옵션을 사용하여 부팅 이미지를 지정하는 방법UEFI이미지를 시작합니다. 제 생각에는이 Fedora 문서는 mosvy로 연결되어 있습니다.이는 기존 BIOS 부팅 이미지를 사용하는 대신 -e
위치를 지정하는 옵션을 사용하여 수행됩니다 .efiboot.img
-b
따라서 귀하의 정보가 boot/cdboot
유효한지 확인하시기 바랍니다UEFI이미지를 부팅하고 대신 명령줄 -e boot/cdboot
에서 사용해 보세요 .mkisofs
-b boot/cdboot
다음은 UEFI 부팅 이미지의 내용에 대한 설명입니다.
우연히 RHEL 8.0 베타 1 ISO 이미지를 가지고 있는데 VirtualBox를 사용하여 실제로 UEFI 모드에서 부팅된다는 것을 방금 확인했습니다. 여기에 사용되는 UEFI 부팅 이미지는 이미지의 기본 iso9660 파일 시스템에서 사용할 수 있으며 images/efiboot.img
어떤 종류의 파티션 테이블도 없이 FAT 파일 시스템 이미지만 포함하고 있는 것으로 보입니다.
의 파일 시스템에는 해당 UEFI 부트로더가 포함된 디렉터리가 efiboot.img
하나만 있습니다 \EFI\BOOT
. 이 경우 , 및 는 BOOTX64.EFI
모두 BOOTIA32.EFI
보안 부팅 shim으로 나타나며 의 각 GRUB 버전에 해당하고 grubx64.efi
필요한 grubia32.efi
보조 파일은 MOKManager입니다. GRUB 구성 파일, GRUB 글꼴 파일 및 보안 부팅 심.