最後の目的は、パーティションのイメージをセクターごとに構築することです。セクターサイズを4096にしたいと思います。最初のステップとして、512バイトではなく4096バイトセクターの32MiBの空のイメージを作成しようとしています。このために私は試しています:
dd if=/dev/zero of=empty4k.img bs=4096 count=8192
それから私はします
fdisk -l empty4k.img
512バイトのセクターを示しています。私が信じるのは
fdisk -l /dev/zero
また、512バイトのセクターを示しています。
誰か助けてもらえますか?
bs
に与えられたdd
は、ファイルの作成時にバッファがどれだけの大きさになるかを示すだけです。結局のところ、ファイルはゼロバイトのみで構成されており、アライメントに関する情報はありません。
fdisk(8)
のfdisk
- pageに従って、man
に固有のパラメーターを使用する必要があります。これは-b
です。
-b, --sector-size sectorsize
Specify the sector size of the disk. Valid values are 512, 1024, 2048, and 4096. (Recent kernels know the sector size. Use this option only on old kernels or to override the kernel's
ideas.) Since util-linux-2.17, fdisk differentiates between logical and physical sector size. This option changes both sector sizes to sectorsize.
あなたが説明する方法でそれを行うことは不可能です。セクターサイズは、ファイルに本来備わっていないブロックデバイスプロパティです。ファイルは特定のバイト数のシーケンスであり、それらの格納方法は実装の詳細です...
したがって、特定のセクターサイズが必要な場合は、ブロックデバイスが必要です。 Linuxはこの目的のためだけにループデバイスを提供しているので、losetup
を使用して、特定のセクターサイズでファイルバックアップされた仮想ブロックデバイスを作成します。
テストファイル:
# dd if=/dev/zero of=empty4k.img bs=4096 count=8192
通常のループデバイス:
# losetup --find --show empty4k.img
/dev/loop0
# fdisk -l /dev/loop0
Disk /dev/loop0: 32 MiB, 33554432 bytes, 65536 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
4096バイトのセクターループデバイス:
# losetup --find --show --sector-size=4096 empty4k.img
/dev/loop1
# fdisk -l /dev/loop1
Disk /dev/loop1: 32 MiB, 33554432 bytes, 8192 sectors
Units: sectors of 1 * 4096 = 4096 bytes
Sector size (logical/physical): 4096 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
どちらの場合も、ファイルは完全に同一であり、セクターサイズプロパティはブロックループデバイスレイヤーによって提供されます。
dd
のブロックサイズは、そのサイズのチャンクで読み取り/書き込みを要求するだけです。今日のディスクとI/Oのよりスマートなオペレーティングシステムの処理を考えると、パフォーマンスのためにディスクセクターサイズのチャンクの書き込みに関連していたため、ほとんど(ほとんどない)違いはありません。