我不明白如何创建具有所需布局的图像文件。
4Mb of free space | 32 Mb partition
首先,我需要创建分区表。以下部分有效:
dd if=/dev/zero of=<image.img> bs=1M count=32
parted -s <image.img> mklabel msdos mkpart primary ext2 8192s 32M
现在我需要一个文件系统。以下部分没有提供我想要的内容:
mkfs -t ext2 -E offset=8192 <image.img> 36M
此命令不会破坏布局(4Mb 可用空间 + 32Mb 分区),但分区本身被破坏(gparted 无法将其识别为 ext2)
有人告诉我,mkfs 可以看到我用 parted 创建的分区,所以我不需要指定偏移量。但是,没有偏移量会让情况变得更糟:mkfs 会重写整个映像,4Mb 的可用空间会消失:
mkfs -t ext2 <image.img>
唯一可行的方法是在物理磁盘上创建布局。
sudo parted -s /dev/disk mklabel msdos mkpart primary ext2 8192s 32M
请注意,现在我有 /dev/disk 和 /dev/disk1代表分区。在该分区上创建文件系统非常有效。
sudo mkfs -t ext2 /dev/disk1
但我不需要在物理磁盘上创建分区,我需要一个映像文件。我无法将物理磁盘转储到映像中,因为我正在编写用于动态映像创建的脚本。
答案1
首先,图像大小应该是 36MiB,而不是 32MiB:
$ truncate -s 36M test.img
dd
(如果您不想稀疏,您可以坚持您的方法。)
parted
似乎没有办法让我们指定分区大小而不是分区结束:
$ parted -s test.img mklabel msdos mkpart primary ext2 8192s $((36*1024*1024/512-1))s
(需要说明的是,M
parted 中指的不是 MiB 而是 MB。)
现在布局应该正确了:
$ fdisk -l test.img
Disk test.img: 36 MiB, 37748736 bytes, 73728 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xc9c7e736
Device Boot Start End Sectors Size Id Type
test.img1 8192 73727 65536 32M 83 Linux
显然offset
应该以字节为单位:
$ mkfs.ext2 -E offset=$((8192*512)) test.img 32M
mke2fs 1.46.5 (30-Dec-2021)
Discarding device blocks: done
Creating filesystem with 32768 1k blocks and 8192 inodes
Filesystem UUID: 4e527d5c-ad0f-4073-861b-c3e14bba676a
Superblock backups stored on blocks:
8193, 24577
Allocating group tables: done
Writing inode tables: done
Writing superblocks and filesystem accounting information: done
$
PS 顺便说一下,还有一个不错的-P
开关losetup
。