LVMとデバイスマッパー:論理ボリュームデバイスセクタサイズ

LVMとデバイスマッパー:論理ボリュームデバイスセクタサイズ

これは、異なるシステム間の論理ボリュームに対するマッピングデバイスのセクタサイズの問題のようです。

具体的には、論理ボリュームに対応するマッピングされたデバイスのセクタサイズを設定するか、どのように設定するかを知りたいです。

以下は、2つのシステムを比較して問題の説明です。

マシン1

mytestlv名前付きボリュームグループの論理ボリュームにはディスクイメージ全体がありますMyVolumeGroup

ディスクイメージには独自のパーティションテーブルがあります(画像が格納されている物理ディスクとは完全に独立しています)。

たとえば、fdisk /dev/mapper/MyVolumeGroup-mytestlv次のようにします。

Disk /dev/mapper/MyVolumeGroup-mytestlv: 30 GiB, 32212254720 bytes, 62914560 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: ...

Device                                    Start      End  Sectors Size Type
/dev/mapper/MyVolumeGroup-mytestlv-part1    2048     4095     2048   1M BIOS boot
/dev/mapper/MyVolumeGroup-mytestlv-part2    4096  4198399  4194304   2G Linux swap
/dev/mapper/MyVolumeGroup-mytestlv-part3 4198400 62914526 58716127  28G Linux filesystem

そのディスクイメージの特定のパーティションのデータにアクセスする必要がある場合は、kpartxそのパーティションを使用してマウントできます。

kpartx -a /dev/mapper/MyVolumeGroup-mytestlvこのディスクイメージ内にパーティションをマウントするために使用できるデバイスファイルを作成します。たとえば、次のようになります。

/dev/mapper/MyVolumeGroup-mytestlvl
/dev/mapper/MyVolumeGroup-mytestlv2
/dev/mapper/MyVolumeGroup-mytestlv3

マシン2

これを別のコンピュータにコピーします(内容はまったく同じで、チェックサムは両方とも/dev/mapper/MyVolumeGroup-mytestlv同じです)。

fdisk /dev/mapper/MyVolumeGroup-mytestlv以下のように構成されたブロックサイズを使用してください。

/dev/mapper/MyVolumeGroup-mytestlv: 30 GiB, 32212254720 bytes, 7864320 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
Disklabel type: dos
Disk identifier: 0x00000000

Device                                  Boot Start     End Sectors Size Id Type
/dev/mapper/MyVolumeGroup-mytestlv-part1          1 7864319 7864319  30G ee GPT

違い

論理セクタサイズはマシン1では512ですが、マシン2では4096です.

マシン1ではblockdev --getss /dev/mapper/MyVolumeGroup-mytestlv512が返されます。

マシン2ではblockdev --getss /dev/mapper/MyVolumeGroup-mytestlv4096が返されます。

解決策

マシン2でセクタサイズを512に強制すると、fdiskパーティションテーブルを正しく表示するのに役立ちます。

fdisk --sector-size 512 /dev/mapper/MyVolumeGroup-mytestlv
Disk /dev/mapper/MyVolumeGroup-mytestlv: 30 GiB, 32212254720 bytes, 62914560 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: gpt
Disk identifier: ...

Device                                    Start      End  Sectors Size Type
/dev/mapper/MyVolumeGroup-mytestlv-part1    2048     4095     2048   1M BIOS boot
/dev/mapper/MyVolumeGroup-mytestlv-part2    4096  4198399  4194304   2G Linux swap
/dev/mapper/MyVolumeGroup-mytestlv-part3 4198400 62914526 58716127  28G Linux filesystem

残念ながら、他のツール(sfdiskまたは)kpartxにはこれらのオプションがないようです。

そのLVでループバックデバイスを明示的に生成すると、ループバックデバイスのセクタサイズは512で、すべてがうまく機能します。実際、losetupデバイスのバージョンは明示的なセクタサイズオプションを持つにはあまりにも古いではありませんでした。後ろにlosetup --show -f /dev/mapper/MyVolumeGroup-mytestlv:

  • blockdev --getss /dev/loop0512を返す
  • kpartx -a /dev/loop0作る/dev/mapper/loop0p{1,2,3}

このセクタサイズはどこで構成されていますか?

私は余分に依存せずにfdisk使用できるようにしたいですsfdiskkpartxlosetup

マシン2ではcat /sys/block/dm-2/queue/hw_sector_size4096が返されます(/dev/mapper/MyVolumeGroup-mytestlv実際にはへのソフトリンク/dev/dm-2)。を使用してこの設定を変更してみましecho 512 > /sys/block/dm-2/queue/hw_sector_sizeたが、不可能なようです。

  • そのデバイスのセクタサイズが512になるようにLVMに通知する方法はありますか/dev/mapper/MyVolumeGroup-mytestlv

  • これはグループまたはシステムのすべての論理ボリュームに影響しますか?

lvcreateこれに関連するオプションは表示されませんlvdisplay

答え1

私が知る限り、デフォルトのセクタサイズは基本ハードウェアから来ています。

したがって、マシン1では、基本ディスクがはっきりと配置されています。高度なフォーマット 512eマシン1のディスクコントローラ自体が4kセクタを使用できないためです。もう1つの可能性は、マシン1では、物理ボリュームの1つがMyVolumeGroup4kセクタサイズをサポートできないため、ボリュームグループ全体が最小容量ディスクがサポートできるセクタサイズを使用する必要があることです。

一方、マシン2とすべての物理ボリュームはMyVolumeGroupデフォルトで4kセクタサイズを完全に使用できるようです(高度なフォーマット4Kn)。以前の512バイトセクタサイズをエミュレートするよりも効率的であるため、これは基本的にこれを行います。

関連情報