ディスクイメージの作成

1
2022.03.03

希望のレイアウトの画像ファイルを作成する方法がわかりません。

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

ただし、物理ディスクにパーティションを作成する必要はありません。イメージファイルが必要です。また、動的なイメージ作成用のスクリプトを作成しているため、物理ディスクをイメージにダンプできません。

回答
2
2022.03.03

まず、画像サイズは32MiBではなく36MiBにする必要があります。

 $ truncate -s 36M test.img

(スパースを望まない場合は、 ddアプローチを使用できます。)

partedには、パーティションの終わりではなくパーティションサイズを指定する方法がないようです。

 $ parted -s test.img mklabel msdos mkpart primary ext2 8192s $((36*1024*1024/512-1))s

(記録のために、partedのMは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はバイト単位である必要があります:

 $ sudo 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

$

PSlosetupには素晴らしい-Pスイッチもあります。