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

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

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

基本上,我尝试执行以下操作:
- 创建一个大约 128MB 的磁盘映像;
- 创建一个 GPT;
- 在前 32MB 中创建一个 FAT32 分区(我将其称为 UEFI);
- 在剩余的字节中创建一个 FAT32 分区(我将其称为 SYSTEM);
- 在 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 optimal 1
(parted) align-check optimal 2
(parted) name 1 UEFI
(parted) name 2 SYSTEM

这是我的输出:

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

编号 起始 结束 大小 文件系统 名称 标志  
 1 1049kB 33,6MB 32,5MB UEFI msft数据
 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 系统.img -v UEFI -f 1440 -c 1 ::
mcopy -i 系统.img myawesomeOS ::



在前一种情况下,我无法弄清楚为什么“文件系统”列为空(它应该显示 fat32),以及如何创建子目录和复制文件。
在后一种情况下,我无法为这两个图像创建正确的 FAT32 文件系统,如果我将 -F 附加到 mformat,我会得到

对于此 fat 大小来说,簇太少。请在 /etc/mtools.conf 或 .mtoolsrc 文件中选择一个 16 位 fat

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

我该如何实现这一点?任何帮助或提示都值得感激。

答案1

经过几个小时的努力,我自己解决了这个问题。为了以防万一,我将解决方案发布在这里:

# 创建一个 256MB 的空磁盘映像,创建它的 GPT,然后
# 两个分区:第一个大约 60MB,第二个填满
# 剩余的字节。两个分区都对齐。
dd if=/dev/zero of=disk.img bs=1M count=256
parted 磁盘映像
市场表 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 系统.img -F 32
# 复制操作系统文件。
mcopy -i 系统.img SYSTEM.EFI ::

# 启用 kpartx 请求的内核模块,以防万一。
sudo modprobe dm-mod
# 将 disk.img 中的两个分区映射并挂载到 /dev/mapper/loop0p1 和
#/dev/mapper/loop0p2
sudo kpartx -av 磁盘.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
# 卸载两个分区
sudo kpartx-dv 磁盘.img

相关内容