布局磁盘映像并将文件复制到其中

4 linux command-line partitioning gpt

在问这里之前,我尝试在 SU/SE 和 Google 上搜索但没有成功。这是我得到的最接近的东西。

基本上,我正在尝试执行以下操作:
- 创建一个大约 128MB 的磁盘映像;
- 创建一个 GPT;
- 在前 32MB 中创建一个 FAT32 分区(我称之为 UEFI);
- 在剩余字节中创建一个 FAT32 分区(我称之为系统);
- 在 UEFI 分区中创建以下子目录:/EFI/BOOT/;
- 复制子目录中的文件;
- 复制 SYSTEM 分区中的另一个文件。


这是我迄今为止所做的:

dd if=/dev/zero of=disk.img bs=1M count=128

parted disk.img
(parted) mktable gpt
(parted) mkpart primary fat32 2048s 65535s
(parted) mkpart primary fat32 65536s 100%
(parted) align-check optimization 1 (parted) align-check optimization
2
(parted) name 1 UEFI
(parted) ) 名称 2 系统

这是我的输出:

磁盘disk.img:134MB  
扇区大小(逻辑/物理):512B/512B  
分区表:gpt  
磁盘标志:  

编号开始结束大小文件系统名称标志  
 1 1049kB 33,6MB 32,5MB UEFI msftdata
 2 33,6MB 134MB 101MB 系统 msftdata



另一种方法是创建两个不同的分区,然后合并它们:

dd if=/dev/zero of=uefi.img bs=1M count=32
mformat -i uefi.img -v UEFI -f 1440 -c 1 ::
mmd -i uefi.img ::/EFI
mmd -i uefi.img ::/EFI/BOOT
mcopy -i uefi.img BOOTX64.EFI ::/EFI/BOOT
dd if=/dev/zero of=system.img bs=1M count=100
mformat -i system.img -v UEFI -f 1440 -c 1 ::
mcopy -i system.img myawesomeOS ::



在前一种方式中,我无法弄清楚为什么“文件系统”列是空的(应该说是fat32)以及如何创建子目录和复制文件。
在后一种方式中,我无法为这两个图像创建合适的 FAT32 文件系统,如果我将 -F 附加到 mformat 我得到

这种脂肪尺寸的簇太少了。请在您的 /etc/mtools.conf 或 .mtoolsrc 文件中选择一个 16 位的 fat

如果我设法做到了,我仍然不知道如何设置 GPT 并将两个图像合并到一个文件中。

我怎样才能做到这一点?任何帮助或提示表示赞赏。

小智 5

经过几个小时的挣扎,我自己解决了。我会在这里发布解决方案,以防万一:

# 创建一个 256MB 的空磁盘镜像,创建它的 GPT,然后制作
# 两个分区:第一个大约60MB,第二个填满
# 剩余的字节。两个分区对齐。
dd if=/dev/zero of=disk.img bs=1M count=256
分开的磁盘.img
mktable gpt
mkpart 初级 fat32 2048s 131071s
mkpart 初级 fat32 131072s 100%
对齐检查最优 1
对齐检查最优 2
名称 1 UEFI
名称 2 系统
退出

# 创建一个 33MB 的空磁盘映像。
dd if=/dev/zero of=uefi.img bs=1M count=33
# 将磁盘映像格式化为 FAT32
mkfs.vfat uefi.img -F 32
# 创建请求的子目录。
mmd -i uefi.img ::/EFI
mmd -i uefi.img ::/EFI/BOOT
# 复制启动文件。
mcopy -i uefi.img BOOTX64.EFI ::/EFI/BOOT

# 创建一个 100MB 的空磁盘映像。
dd if=/dev/zero of=system.img bs=1M count=100
# 将磁盘映像格式化为 FAT32
mkfs.vfat system.img -F 32
# 复制操作系统文件。
mcopy -i system.img SYSTEM.EFI ::

# 启用 kpartx 请求的内核模块,以防万一。
须藤 modprobe dm-mod
# 将disk.img 中的两个分区映射并挂载到/dev/mapper/loop0p1 和
# /dev/mapper/loop0p2
须藤 kpartx -av disk.img
# 将 UEFI 分区复制到磁盘映像中。
sudo dd if=uefi.img of=/dev/mapper/loop0p1 bs=1M
# 将 SYSTEM 分区复制到磁盘映像中。
sudo dd if=system.img of=/dev/mapper/loop0p2 bs=1M
# 卸载两个分区
须藤 kpartx -dv disk.img