Linux 上制作多启动 U 盘

Linux 上制作多启动 U 盘

方法一 Ventoy

参考官网

方法二 手动安装 grub 后分别分区

我本人也曾经长期使用过 Ventoy,这个工具对于新手来说确实容易上手,而且工具功能丰富。不过随着探索的深入,我现在也不是很喜欢 Ventoy,原因可能有很多,比如说工具复杂、源码看不懂一点(因为我菜)、想要自己看看什么样的配置能完成多启动 U 盘的构造,毕竟在前 Ventoy 时代的人的做法似乎已经几乎在互联网上失传。而且我感觉 Ventoy 的做法看起来不太美观,我自己想 keep it simple,当然我认为对于大部分人来说,使用 Ventoy 仍然是一个最方便、稳妥、好用的选择。

系统环境

你需要一台 x86_64 的电脑,安装有 Linux 操作系统。

准备启动 iso

这里的启动 iso 包括 Windows PE、Linux Livecd、Linux 安装 CD(其实也是 Livecd)等。我准备的包括:

首先是 Windows PE,市面上的 Windows PE 很多,功能类似,但镜像目录结构好像千差万别。甚至有的用 windows boot manager 管理启动,有的用 grub 管理启动(这里什么 grub1 grub2 grub4dos 的我都见过),我也没做过,也不懂。我准备了现在比较常用的微PEFirPE,他俩下载之后都是 exe 文件,选择生成 iso 之后得到两个 iso 文件,就是 PE 镜像。

其次是 Linux livecd,这个就简单了,因为我做过(可以参考我的制作方法),而且都是 grub 引导。这里我用的是我自己做的 livecd,别的没测试过,但我感觉应该都没问题。

前两个 win PE 的 iso,一个是 udf 文件系统,一个是 iso9660 文件系统;一个是 windows boot manager 引导,一个是 grub1 引导,不过最后还是都启动成功了。

另外还要计算每个 iso 的大小,可以用 ls -l 查看之后算出有多少 MB(1024进制),向上取整。

U 盘分区

如果你的 U 盘是空白 U 盘,或者内容都不要了,那么运行

sudo gparted

启动之后删除你的 U 盘上的分区,新建分区。如果有 N 个 iso,那么需要新建 N+1 个:

  • 第一个分区:fat32 格式,建议几十到几百 MB,用于安装 grub
  • 后边的分区,按照上文算出的 MB 数分区,分区格式选已清空或者未格式化(其实怎么选都行)

如果 U 盘有资料,那么需要在 gparted 里挤出来一部分空间(前后都行)使得至少能完成前文所述的分区。当然,安装 grub 的分区也不一定是第一个,注意下面的挂载即可。

另外,如有需要,比如 U 盘剩余空间做常规存储空间,那么也可以添加别的分区。

(我这里 sda3 是用来存放其他资料的)

调整之后点击对钩完成更改。

刻录 iso

把几个 iso 分别刻录到每个分区:

sudo dd if=debian.iso of=/dev/sda2 status=progress
sudo dd if=wepe.iso of=/dev/sda4 status=progress
sudo dd if=firpe.iso of=/dev/sda5 status=progress

然后 gparted 就会变成这样:

查看各个文件系统

每个刻录了 iso 分区的 U 盘,分别查看其引导文件。

对于 windows 来说,一般是 /boot/efi/bootx64.efi;对于 linux 来说,一般是 /boot/efi/grubx64.efi,但也可能有不一样的,比如大小写不一样,这种时候需要自己试试。

# 对每个 iso 的分区执行类似的操作
sudo mount /dev/sda2 /mnt/mobile # 挂载点自选
ls /mnt/mobile/boot/efi/grubx64.efi # 尝试找找有没有这样的文件,并且记下来此时的路径
sudo umount /mnt/mobile

然后使用 blkid 命令查看各个分区的 uuid;

经过测试,我的三个 iso 的启动文件分别是:

Debian Live       UUID: 2024-02-24-22-40-00-00   /EFI/boot/grubx64.efi
WEPE              UUID: xxxxx                    /EFI/BOOT/bootx64.efi
FirPE             UUID: xxxxx                    /efi/boot/bootx64.efi

安装、配置 grub

安装 grub:

sudo mount /dev/sda1 /mnt/mobile # 最后一个挂载点自己选
sudo mkdir /mnt/mobile/boot
sudo mkdir /mnt/mobile/EFI
sudo grub-install --target=x86_64-efi --removable --boot-directory=/mnt/mobile/boot --efi-directory=/mnt/mobile /dev/sda # 记得检查有没有报错

配置:

sudo touch /mnt/mobile/boot/grub/grub.cfg
sudoedit /mnt/mobile/boot/grub/grub.cfg

文件内容为:

insmod all_video
insmod gfxterm
insmod chain
menuentry "Debian Live" {
    search --fs-uuid --set=root 2024-02-24-22-40-00-00
    chainloader /EFI/boot/grubx64.efi
}
menuentry "WEPE" {
    set root=(hd0,gpt4)
    chainloader /EFI/BOOT/bootx64.efi
}
menuentry "FirPE" {
    set root=(hd0,gpt5)
    chainloader /efi/boot/bootx64.efi
}

需要注意的是:

  1. 经过我的尝试,那俩 windows PE 的 UUID 在 grub 里是读取不到的,而且 label 貌似也有问题,总之就是尝试各种办法也没能找到什么好的设置 root 的办法,于是只能硬写 root 为分区编号了。分区编号可以在 grub 界面进入 grub 命令行输入 ls 查看到。

  2. 如果有多个 linux livecd,不能直接用 chainloader:

    man live-boot
    

    可以发现,即使有多个 livecd,系统启动寻找根文件系统时并不会按照 grub 里 root 的位置寻找,而是挨个寻找各个分区。所以这时候需要找到每个 livecd 的 grub 的启动参数:

    sudo mount /dev/sda2 /mnt/kali
    cat /mnt/kali/boot/grub/grub.cfg
    # 找到 grub 里每个启动项 linux 那一行的启动参数,比如
    menuentry "Kali Live" --hotkey=l {
            linux   /live/vmlinuz boot=live components quiet splash noeject findiso=${iso_path}
            initrd  /live/initrd.img
    }
    

    那就需要给启动参数加上 bootfrom=/dev/sdXY 指定启动分区在哪,由此写入 U 盘启动分区的 grub 里:

    menuentry "Kali Live" --hotkey=l {
            search --fs-uuid --set=root xxxx-xx-xx-xx-xx-xx-xx-xx
            linux   /live/vmlinuz boot=live bootfrom=/dev/sda2 components quiet splash noeject findiso=${iso_path}
            initrd  /live/initrd.img
    }
    

    才能正常启动。

chainloader 真是好东西,后边的东西记得按照自己之前搜索到的文件目录进行配置。万能引导器果然万能,甚至可以用 grub2 引导 grub1,grub2,grub4dos,windows boot manager。

配置完成之后解除挂载

sudo umount /mnt/mobile

重启按照你的电脑配置,选择 USB 启动即可使用这些 iso 镜像。

posted @ 2024-06-26 21:04  KZ25T  阅读(1)  评论(0编辑  收藏  举报