u盘安装linux系统

u盘安装linux系统

我的目的是在u盘上用efi的方式启动linux,并留相应的空间用于数据交换

分区建立文件系统

1 使用fdisk分区

u盘挂载点为/dev/sdb

1
2
3
4
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格式

1
2
mkfs -t ext4 /dev/sdb3
mkfs -t vfat /dev/sdb2

linux内核准备

1 挂载分区

1
mount -o sync /dev/sdb3 /usb

2 这里还是使用当前系统上已经编译的内核还有initramfs,一般位于/boot目录下

1
2
3
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来创建

1 挂载分区

1
mount -o sync /dev/sdb2 /efi

2 编写grub.cfg

grub.cfg位于/efi/grub里

grub.cfg

1
2
3
4
5
6
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可以使用以下命令查看

1
ls -l /dev/disk/by-uuid

3 创建引导程序

1
grub-install --efi-directory=/efi --boot-directory=/efi --removable

创建成功后/efi里会多出一个EFI目录,之后如果修改了grub.cfg需要重新运行命令创建

模拟启动

此时使用qemu来模拟电脑的启动来测试引导程序是否正常运行

1
qemu-system-x86_64 /dev/sdb

如果qemu卡死在booting from hard disk或cannot allocate kernel buffer可以参考以下方案

1
2
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这个选项不会影响解决方案,只是留作备忘

正常流程内核启动进入ramfs会由于没有init进程而无法完成启动,至于init的问题就可以通过安装busybox来解决,具体可以参考之前的文章

启动

在bios配置相应选项进行启动即可

附录

查看挂载点

1
cat /proc/mounts