내 모든 디스크와 파티션을 표시합니다.
sudo fdisk -l
Disk /dev/sda: 931.5 GiB, 1000204886016 bytes, 1953525168 sectors
Disk model: ST1000VX000
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: BF20422A-7E3A-4CA2-B249-61BB4A5D42B7
Device Start End Sectors Size Type
/dev/sda1 2048 923647 921600 450M Windows recovery environment
/dev/sda2 923648 1128447 204800 100M EFI System
/dev/sda3 1128448 1161215 32768 16M Microsoft reserved
/dev/sda4 1161216 314069245 312908030 149.2G Microsoft basic data
/dev/sda5 314071040 315117567 1046528 511M Windows recovery environment
/dev/sda6 315119616 346370047 31250432 14.9G Linux swap
/dev/sda7 346370048 1953523711 1607153664 766.4G Linux filesystem
Disk /dev/sdb: 465.8 GiB, 500107862016 bytes, 976773168 sectors
Disk model: ST500DM002-1SB10
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: 4635826C-E544-11EB-AD01-48F31700362D
Device Start End Sectors Size Type
/dev/sdb1 40 532519 532480 260M EFI System
/dev/sdb2 532520 968884255 968351736 461.8G FreeBSD UFS
/dev/sdb3 968884256 976773127 7888872 3.8G FreeBSD swap
FreeBSD는 /dev/sdb2에 설치되어 있으며 BIOS에서 선택한 후 들어갈 수 있습니다.
grub 메뉴에 추가하고 싶습니다.
sudo vim /boot/grub/grub.cfg
### BEGIN /etc/grub.d/40_custom ###
menuentry "FreeBSD" {
insmod ufs2
insmod bsd
set root=(hd1,gpt2)
kfreebsd /boot/loader
kfreebsd /boot/kernel
set kFreeBSD.vfs.root.mountfrom=ufs:/dev/ada1p2
set kFreeBSD.vfs.root.mountfrom.options=rw
set kFreeBSD.hw.psm.synaptics_support=1
}
### END /etc/grub.d/40_custom ###
다시 시작하세요. FreeBSD
grub 메뉴가 추가되었습니다.
클릭하여 시작하면 "잘못된 a.out 헤더"가 나타납니다.
sudo vim /boot/grub/grub.cfg
### BEGIN /etc/grub.d/40_custom ###
menuentry "FreeBSD" {
insmod ufs2
insmod bsd
set root=(hd1,gpt2)
kfreebsd /boot/loader
}
### END /etc/grub.d/40_custom ###
출력이 없고 부팅 로드가 거기에 걸린 것 같습니다.
debian에 /dev/sdb2를 마운트하고 부팅과 관련된 모든 파일을 나열합니다.
debian@debian:~$ sudo mkdir /mnt/freebsd
debian@debian:~$ sudo mount -r -t ufs -o ufstype=ufs2 /dev/sdb2 /mnt/freebsd
debian@debian:~$ ls /mnt/freebsd
bin COPYRIGHT entropy home libexec mnt proc root sys usr
boot dev etc lib media net rescue sbin tmp var
debian@debian:~$ ls /mnt/freebsd/boot
beastie.4th efi.4th loader.efi modules
boot entropy loader_lua pmbr
boot0 firmware loader_lua.efi pxeboot
boot0sio fonts loader.rc screen.4th
boot1 frames.4th loader_simp shortcuts.4th
boot1.efi gptboot loader_simp.efi support.4th
boot2 gptboot.efi logo-beastie.4th uboot
brand.4th gptzfsboot logo-beastiebw.4th userboot_4th.so
brand-fbsd.4th images logo-fbsdbw.4th userboot_lua.so
cdboot isoboot logo-orb.4th userboot.so
check-password.4th kernel logo-orbbw.4th version.4th
color.4th loader lua zfs
defaults loader.4th mbr zfsboot
delay.4th loader_4th menu.4th zfsloader
device.hints loader_4th.efi menu-commands.4th
dtb loader.conf menu.rc
efi loader.conf.d menusets.4th
다음 명령을 사용하여 a.out 파일을 검색합니다.
tree /mnt/freebsd/boot/ | grep a.out
/dev/sdb2에는 a.out이라는 파일이 없습니다!
그렇다면 grub.cfg 파일을 복구하는 방법은 무엇입니까?
grub-mkconfig를 사용하여 작성해 보는 것은 어떨까요?
debian@debian:~$ sudo grub-mkconfig -o /boot/grub/grub.cfg
Generating grub configuration file ...
Found background image: /usr/share/images/desktop-base/desktop-grub.png
Found linux image: /boot/vmlinuz-4.19.0-17-amd64
Found initrd image: /boot/initrd.img-4.19.0-17-amd64
Found linux image: /boot/vmlinuz-4.19.0-16-amd64
Found initrd image: /boot/initrd.img-4.19.0-16-amd64
Found Windows Boot Manager on /dev/sda2@/efi/Microsoft/Boot/bootmgfw.efi
Found FreeBSD 13.0-RELEASE on /dev/sdb2
Adding boot menu entry for EFI firmware configuration
done
windows
인식되어 grub.cfg에 기록됩니다.
debian@debian:~$ cat /boot/grub/grub.cfg | grep -i window
menuentry 'Windows Boot Manager (on /dev/sda2)' --class windows --class os $menuentry_id_option 'osprober-efi-4A44-FBE5' {
FreeBSD
또한 인식되며 grub.cfg에 기록되지 않습니다.
debian@debian:~$ cat /boot/grub/grub.cfg | grep -i freebsd
debian@debian:~$ cat /boot/grub/grub.cfg | grep BSD
그렇다면 어떻게 해결해야 할까요?
답변1
a.out
파일 이름이 아니라 특정 실행 파일 형식의 이름입니다. 오류 메시지는 기본적으로 "이 명령에 대한 올바른 파일 형식이 아닌 것 같습니다."를 의미합니다.
/boot/loader
저는 FreeBSD에 대해 잘 알지 못하지만 빠른 Google 검색에 따르면 BIOS 기반 부팅용으로 제작되었으며 프로세서가 있는 BTX 클라이언트로 실행되는 것 같습니다 .가상 86 모드즉, 16비트 또는 32비트 코드를 사용합니다.
반면에 최신 UEFI 기반 x86_64 시스템은 전체 64비트 모드에서도 펌웨어를 실행할 수 있으므로 kfreebsd /boot/loader
UEFI 시스템에서 이렇게 하는 것은 실수라고 생각합니다.
다음과 같이 시도해 볼 수 있습니다.
### BEGIN /etc/grub.d/40_custom ###
menuentry "FreeBSD (chainloaded loader.efi)" {
set root=(hd1,gpt1)
chainloader /EFI/BOOT/BOOTX64.EFI
# /EFI/BOOT/BOOTX64.EFI could be replaced with /EFI/FreeBSD/loader.efi
# either way, the chainloaded file should be a copy of FreeBSD /boot/loader.efi
}
loader.efi
이는 펌웨어 기반 부팅 항목과 마찬가지로 두 번째 디스크의 EFI 시스템 파티션 링크에서 FreeBSD 로더의 UEFI 버전을 로드하려고 시도합니다 .
FreeBSD의 UEFI NVRAM 부팅 항목을 보고 대신 efibootmgr -v
경로 이름을 찾을 수도 있습니다 . 다음과 같이 보일 수도 있습니다 .loader.efi
/EFI/BOOT/BOOTX64.EFI
/EFI/FreeBSD/loader.efi
위 항목은 기본적으로 펌웨어 부팅 메뉴에서 "FreeBSD" 부팅 옵션을 선택한 경우 펌웨어가 수행하는 작업을 반복하므로 작업하기가 더 쉽습니다.
GRUB를 통해 kFreeBSD 부팅 옵션을 유연하게 편집하려면 아래 두 번째 항목을 시도해 볼 수 있지만, 저는 FreeBSD에 익숙하지 않기 때문에 이는 단지 경험에 근거한 추측일 뿐입니다:
menuentry "FreeBSD (native from GRUB)" {
insmod ufs2
insmod bsd
set root=(hd1,gpt2)
# /boot/loader is not applicable on UEFI, maybe GRUB can do its job directly?
kfreebsd /boot/kernel
set kFreeBSD.vfs.root.mountfrom=ufs:/dev/ada1p2
set kFreeBSD.vfs.root.mountfrom.options=rw
set kFreeBSD.hw.psm.synaptics_support=1
}
### END /etc/grub.d/40_custom ###
답변2
debian에 freebsd 파티션을 설치한 후 /boot에 정보를 게시했습니다. 이것은 보여준다:
sudo mount -r -t ufs -o ufstype=ufs2 /dev/sdb2 /mnt/freebsd
ls /mnt/freebsd/boot | grep boot
boot
boot0
boot0sio
boot1
boot1.efi
boot2
cdboot
gptboot
gptboot.efi
gptzfsboot
isoboot
pxeboot
uboot
userboot_4th.so
userboot_lua.so
userboot.so
zfsboot
따라서 /boot/grub/grub.cfg에 다음 줄을 추가하십시오:
### BEGIN /etc/grub.d/40_custom ###
menuentry "FreeBSD" {
insmod ufs2
chainloader (hd1,gpt2)/boot/boot1.efi
}
### END /etc/grub.d/40_custom ###
좋은 결과.
두 번째 항목이 작동하지 않습니다.