抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

手工做一个 Ventory 类似物

前言

我想要自己做一个启动很多系统的U盘,Ventory使用ISO,很简单。但是这样就少了折腾的乐趣,所以我们现在自己做个类似的吧。

创建分区表

我们使用GPT分区表,毕竟我们后面的操作都是能在支持UEFI的设备上运行。创建具体分区表的步奏是通用的,例如

1
sudo parted /dev/sdx
1
2
3
GNU Parted 3.6
Using /dev/sdx
Welcome to GNU Parted! Type 'help' to view a list of commands.

使用p打印分区表,一定要确认下是不是您要的盘!

1
(parted) p
1
2
3
4
5
6
7
8
9
10
11
12
Model: KIOXIA TransMemory (scsi)
Disk /dev/sdx: 62.0GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number Start End Size File system Name Flags
1 17.4kB 512MB 512MB fat32 boot, esp
2 512MB 8511MB 8000MB
3 8511MB 18.5GB 9999MB
4 18.5GB 28.5GB 9999MB
5 28.5GB 62.0GB 33.5GB ext4
1
2
3
4
5
(parted) mktable
New disk label type? GPT
Warning: The existing disk label on /dev/sdx will be destroyed and all data on this disk will be lost. Do
you want to continue?
Yes/No?

输入yes您的数据就消失辣,所以一定要小心。
创建好了空的分区表,我们就可以创建一堆分区了,常见的样子就像上面的一样,>512M的ESP分区,和若干个存放您的解压缩后的ISO的分区(可以先格式化为ext4),您可以以任何方式创建这些分区,包括GUI。

ESP

ESP分区最好是FAT32(因为所有人都这么说)我们可以用mkfs.vfat -F 32 /dev/sdx1 创建。
ESP分区还需要boot,esp的flag

  • parted中使用set命令
  • Partition number? 输入ESP分区的编号
  • Flag to Invert? 输入booton
  • New state? [on]/off? 输入on

一般来讲加入bootflag同时也会加上esp,可以完成后使用p检查是否正确。

装载镜像

解压镜像首先要下载下来,一般(指为了避免最极端的情况)对于非livecd需要3G分区,livecd需要10G分区。请在开始前先创建好分区,准备好iso。
使用dd复制镜像,请注意不要dd错了。这个过程可能会非常慢,请耐心等待。
sudo dd bs=4M if=ubuntu-23.10.1-desktop-amd64.iso of=/dev/sdx2 conv=fdatasync status=progress

GRUB

安装

我们使用一个gurb引导各个镜像中的grub,因此首先我们要挂载U盘的EFI分区

1
2
sudo mkdir /mnt/usbefi
sudo mount /dev/sdx1 /mnt/usbefi

然后再开始安装
sudo grub-install --target=x86_64-efi --efi-directory=/mnt/usbefi --bootloader-id=grub --removable --recheck

放置module

在你挂载好的ESP分区下,创建grub目录,然后cd到该目录。
首先我们将所有可能的module复制过去
sudo cp -r /usr/lib/grub/x86_64-efi .

配置grub

配置在grub/grub.cfg

启动项

每一个启动项都类型下面的配置
--fs-uuid 后面的UUID请从您dd后的分区里找(例如Gnome Disks里就有)
chainloader后EFI的文件遵循以下找法:

  • 打开您的iso文件
  • 找到efi/boot
  • grubx64.efi就是它(多为debian系)
  • 再去找bootx64.efi,就是这个
1
2
3
4
5
6
7
8
menuentry 'Alpine Linux' {
set gfxpayload=keep
insmod fat
insmod chain
search --no-floppy --set=root --fs-uuid 2023-12-27-12-33-10-00
echo 'Loading Alpine linux 3.19.1 ...'
chainloader /efi/boot/bootx64.efi
}

其他选项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
menuentry "System shutdown" {
echo "System shutting down..."
halt
}

menuentry "System restart" {
echo "System rebooting..."
reboot
}

if [ ${grub_platform} == "efi" ]; then
menuentry 'UEFI Firmware Settings' --id 'uefi-firmware' {
fwsetup
}

常见问题

echo完就不动了:是不是有grubx64.efi
UEFI菜单里有多个启动项:本身每个ISO就能启动,选择第一个就是我们自制的grub\