これは、異なるシステム間の論理ボリュームに対するマッピングデバイスのセクタサイズの問題のようです。
具体的には、論理ボリュームに対応するマッピングされたデバイスのセクタサイズを設定するか、どのように設定するかを知りたいです。
以下は、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-mytestlv
512が返されます。
マシン2ではblockdev --getss /dev/mapper/MyVolumeGroup-mytestlv
4096が返されます。
解決策
マシン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/loop0
512を返すkpartx -a /dev/loop0
作る/dev/mapper/loop0p{1,2,3}
このセクタサイズはどこで構成されていますか?
私は余分に依存せずにfdisk
使用できるようにしたいですsfdisk
。kpartx
losetup
マシン2ではcat /sys/block/dm-2/queue/hw_sector_size
4096が返されます(/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つがMyVolumeGroup
4kセクタサイズをサポートできないため、ボリュームグループ全体が最小容量ディスクがサポートできるセクタサイズを使用する必要があることです。
一方、マシン2とすべての物理ボリュームはMyVolumeGroup
デフォルトで4kセクタサイズを完全に使用できるようです(高度なフォーマット4Kn)。以前の512バイトセクタサイズをエミュレートするよりも効率的であるため、これは基本的にこれを行います。