差分

このページの2つのバージョン間の差分を表示します。

この比較画面にリンクする

両方とも前のリビジョン 前のリビジョン
virtualization:how_to_simulate_ppartition_as_one_of_vpartitions_in_vdisk [2021-03-30 15:30]
Decomo
virtualization:how_to_simulate_ppartition_as_one_of_vpartitions_in_vdisk [2025-06-29 23:15] (現在)
Decomo
行 1: 行 1:
-====== Device Mapperで物理パーティション仮想パーティションに偽装 ======+====== Device Mapperで構成を保ったまま特定の物理パーティションのみ仮想ディスクとしてVMにススルする ======
  
 仮想マシンに物理ディスクのパーティションをパススルーする、いわゆるRDM (Raw Device Mapping)を行うと、物理パーティションは仮想ブロックデバイスの扱いとなる。つまり、VMから見ると単なる仮想ディスク扱いなので、VMでパーティションを作るとパーティションの中にパーティションがある状態となる。 仮想マシンに物理ディスクのパーティションをパススルーする、いわゆるRDM (Raw Device Mapping)を行うと、物理パーティションは仮想ブロックデバイスの扱いとなる。つまり、VMから見ると単なる仮想ディスク扱いなので、VMでパーティションを作るとパーティションの中にパーティションがある状態となる。
行 50: 行 50:
 <code> <code>
 # cd /var/lib/vz/images/100 # cd /var/lib/vz/images/100
-# dd if=/dev/zero of=./vm-100-fake_gpt1_primary.raw count=2048 +# dd if=/dev/zero of=./vm-100-fake_gpt1_primary.raw   bs=4096 count=256 
-# dd if=/dev/zero of=./vm-100-fake_gpt1_secondary.raw count=20480 +# dd if=/dev/zero of=./vm-100-fake_gpt1_secondary.raw bs=4096 count=2560 
-# dd if=/dev/zero of=./vm-100-fake_gpt2_primary.raw count=2048 +# dd if=/dev/zero of=./vm-100-fake_gpt2_primary.raw   bs=4096 count=256 
-# dd if=/dev/zero of=./vm-100-fake_gpt2_secondary.raw count=20480 +# dd if=/dev/zero of=./vm-100-fake_gpt2_secondary.raw bs=4096 count=2560 
-# dd if=/dev/zero of=./vm-100-fake_esp2.raw count=1048576+# dd if=/dev/zero of=./vm-100-fake_esp2.raw           bs=4096 count=131072
 </code> </code>
  
-それぞれループデバイスを作成する。''/dev/loop0''~''/dev/loop4''る。+それぞれループデバイスを作成する。 
 + 
 +デバイス名を明示することで''/dev/loop100''~''/dev/loop112''成している。また、''-b''で論理セクタサイズを4096バイトとしる。 
 <code> <code>
-# losetup --show -f ./vm-100-fake_gpt1_primary.raw  +# losetup /dev/loop100 ./vm-100-fake_gpt1_primary.raw   -b 4096 
-/dev/loop0 +# losetup /dev/loop101 ./vm-100-fake_gpt1_secondary.raw -b 4096 
-# losetup -f ./vm-100-fake_gpt1_secondary.raw  +# losetup /dev/loop110 ./vm-100-fake_gpt2_primary.raw   -b 4096 
-# losetup -f ./vm-100-fake_gpt2_primary.raw  +# losetup /dev/loop111 ./vm-100-fake_gpt2_secondary.raw -b 4096 
-# losetup -f ./vm-100-fake_gpt2_secondary.raw  +# losetup /dev/loop112 ./vm-100-fake_esp.raw            -b 4096
-# losetup -f ./vm-100-fake_esp.raw +
 </code> </code>
  
行 73: 行 75:
 === テーブルファイルの作成 === === テーブルファイルの作成 ===
  
-仮想ブロックデバイスの定義ファイルを作る。前述のとおり、Device Mapperのセクタ指定の数値は512バイトセクタ基準なので注意のこと。+仮想ブロックデバイスの定義ファイルを作る。前述のとおり、Device MapperのLBA(セクタ番地)ターゲットデバイスの論理セクタサイズに因らず、一律512バイトセクタ基準なので注意のこと。
  
-便宜上、物理パーティションの指定に従来のデバイスファイル名を使っているが、実際は''/dev/disk/by-id/~''の永続的な名前の方を使うべきだ。デバイス名が変わったら、即データ破壊なので。+便宜上、下記設定例では物理パーティションの指定に従来のデバイスファイル名を使っているが、実際は''/dev/disk/by-id/~''の永続的な名前の方を使うべきだ。万が一デバイス名に対応する物理デバイスが変わっていたら、即データ破壊なので。
  
 <code> <code>
-0 2048 linear /dev/loop0 +        2048      linear /dev/loop100   
-2048 1048576 linear /dev/nvme0n1p1 0 +2048      1048576   linear /dev/nvme0n1p1 0 
-1050624 209715200 linear /dev/nvme0n1p2 0 +1050624   209715200 linear /dev/nvme0n1p2 0 
-210765824 20480 linear /dev/loop1 0+210765824 20480     linear /dev/loop101   0
 </code> </code>
  
行 98: 行 100:
  
 dmsetupコマンドで仮想ブロックデバイスを作成する。 dmsetupコマンドで仮想ブロックデバイスを作成する。
 +
 +''--table''オプションで定義ファイルを読み込めるっぽいんだけど、前項で書いた書式はなぜか受け付けない。"CONCISE FORMAT"じゃないのダメなのかしら?そんなわけなので、標準入力から流し込む。
  
 <code> <code>
行 103: 行 107:
 </code> </code>
  
-成功すると''/dev/mapper/fbsd_disk0''が生えてくる+成功すると''/dev/mapper/fbsd_disk0''が生えてくる。 
 + 
 +これまた注意すべきはセクタサイズで、**生成されたデバイスの論理セクタサイズは、背後にあるデバイスの論理セクタサイズに依存**する。一般的には、テーブルファイルの最初のデバイスのセクタサイズが採用されるようだが、保証された挙動ではないらしい。 
 + 
 +<code> 
 +# dmsetup ls 
 +fbsd_disk0   (252:0) 
 + 
 +# dmsetup info fbsd_disk0 
 +Name:              fbsd_disk0 
 +State:             ACTIVE 
 +Read Ahead:        256 
 +Tables present:    LIVE 
 +Open count:        0 
 +Event number:      0 
 +Major, minor:      252, 0 
 +Number of targets: 4 
 + 
 +# cat /sys/block/dm-0/dm/name  
 +fbsd_disk0 
 + 
 +# cat /sys/block/dm-0/queue/logical_block_size  
 +4096 
 +</code>
  
 ==== 偽装GPTの作成 ==== ==== 偽装GPTの作成 ====
  
-生成した''/dev/mapper/fbsd_disk0''にパーティションテーブルを作る。+生成した''/dev/mapper/fbsd_disk0''対しfdiskでパーティションテーブルを作る。 
 + 
 +fdiskによる操作はパーティションテーブル、すなわちGPTならディスクの先頭・末尾の1MiB(256セクタ@4k)にのみ影響する。パーティションテーブル情報は、以下の経路をたどり、先に準備した偽装GPTファイルに書き込まれることになる。 
 + 
 +<code> 
 +/dev/mapper/fbsd_disk0 
 + ↓ 
 +/dev/loop100, /dev/loop/101 
 + ↓ 
 +vm-100-fake_gpt1_primary.raw, vm-100-fake_gpt1_secondary.raw 
 +</code>
  
-原則、fdiskはパーティションテーブル、すなわちディスクの先頭1MiBにのみ影響する。ここでの操作は、''/dev/mapper/fbsd_disk0'' → ''/dev/loop0'',''loop1''を経由し、vm-100-fake_gpt1_primary.raw, vm-100-fake_gpt1_secondary.rawファイルに対する変更となる。 
  
 512バイトセクタを明示するため、fdiskは**''-b 512''オプション**を付けて起動すること。fdiskはDevice Mapperデバイスをデフォルトで4kセクタと認識する一方、PVE (QEMU?)は512バイトセクタと認識するため、セクタサイズを合わせておかないとパーティションが正しく認識されてない。 512バイトセクタを明示するため、fdiskは**''-b 512''オプション**を付けて起動すること。fdiskはDevice Mapperデバイスをデフォルトで4kセクタと認識する一方、PVE (QEMU?)は512バイトセクタと認識するため、セクタサイズを合わせておかないとパーティションが正しく認識されてない。
  • virtualization/how_to_simulate_ppartition_as_one_of_vpartitions_in_vdisk.txt
  • 最終更新: 2025-06-29 23:15
  • by Decomo