u盤安裝linux系統
我的目的是在u盤上用efi的方式啟動linux,并留相應的空間用于資料交換
分區建立檔案系統
1 使用fdisk分區
u盤挂載點為/dev/sdb
Device Start End Sectors Size Type
/dev/sdb1 2048 16779263 16777216 8G Linux filesystem
/dev/sdb2 16779264 17803263 1024000 500M EFI System
/dev/sdb3 17803264 28289023 10485760 5G Linux filesystem
以上是我的分區結果,這裡劃分了三個分區,sdb1是用來存儲資料的,sdb2是efi分區,sdb3是存放linux的分區
2 建立檔案分區
sdb1根據需要來建立檔案系統,sdb2為fat格式,sdb3為ext4格式
mkfs -t ext4 /dev/sdb3
mkfs -t vfat /dev/sdb2
linux核心準備
1 挂載分區
mount -o sync /dev/sdb3 /usb
2 這裡還是使用目前系統上已經編譯的核心還有initramfs,一般位于/boot目錄下
mkdir /usb/boot
cp /boot/vmlinuz-5.4.0-81-generic /usb/boot
cp /boot/initrd.img-5.4.0-81-generic /usb/boot
引導程式
引導程式使用grub來建立
mount -o sync /dev/sdb2 /efi
2 編寫grub.cfg
grub.cfg位于/efi/grub裡
grub.cfg
menuentry 'Linux(USB)' {
insmod ext2
search --no-floppy --fs-uuid --set=root b77cc5ce-4cf9-4190-ac65-e6d30e8956fa
linux /boot/vmlinuz-5.4.0-81-generic root=UUID=b77cc5ce-4cf9-4190-ac65-e6d30e8956fa ro
initrd /boot/initrd.img-5.4.0-81-generic
}
注:
1 一般grub.cfg是使用grub-mkconfig來建立的,但該指令無法掃描到u盤,是以選擇手動建立
2 b77cc5ce-4cf9-4190-ac65-e6d30e8956fa這個/dev/sdb3的uuid可以使用以下指令檢視
ls -l /dev/disk/by-uuid
3 建立引導程式
grub-install --efi-directory=/efi --boot-directory=/efi --removable
建立成功後/efi裡會多出一個EFI目錄,之後如果修改了grub.cfg需要重新運作指令建立
模拟啟動
此時使用qemu來模拟電腦的啟動來測試引導程式是否正常運作
qemu-system-x86_64 /dev/sdb
如果qemu卡死在booting from hard disk或cannot allocate kernel buffer可以參考以下方案
apt-get install ovmf qemu-efi
qemu-system-x86_64 -m 512M --bios /usr/share/qemu/OVMF.fd /dev/sdb -boot menu=on
--bios /usr/share/qemu/OVMF.fd可以解決booting from hard disk卡死問題
-m 512M 可以解決cannot allocate kernel buffer這個問題
-boot menu on這個選項不會影響解決方案,隻是留作備忘
啟動
附錄
cat /proc/mounts