差分
このページの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: | ||
| < | < | ||
| # cd / | # cd / | ||
| - | # dd if=/ | + | # dd if=/ |
| - | # dd if=/ | + | # dd if=/ |
| - | # dd if=/ | + | # dd if=/ |
| - | # dd if=/ | + | # dd if=/ |
| - | # dd if=/ | + | # dd if=/ |
| </ | </ | ||
| - | それぞれループデバイスを作成する。''/ | + | それぞれループデバイスを作成する。 |
| + | |||
| + | デバイス名を明示することで''/ | ||
| < | < | ||
| - | # losetup | + | # losetup |
| - | /dev/loop0 | + | # losetup |
| - | # losetup -f ./ | + | # losetup |
| - | # losetup | + | # losetup |
| - | # losetup | + | # losetup |
| - | # losetup | + | |
| </ | </ | ||
| 行 73: | 行 75: | ||
| === テーブルファイルの作成 === | === テーブルファイルの作成 === | ||
| - | 仮想ブロックデバイスの定義ファイルを作る。前述のとおり、Device Mapperのセクタ指定の数値は512バイトセクタ基準なので注意のこと。 | + | 仮想ブロックデバイスの定義ファイルを作る。前述のとおり、Device MapperのLBA(セクタ番地)はターゲットデバイスの論理セクタサイズに因らず、一律512バイトセクタ基準なので注意のこと。 |
| - | 便宜上、物理パーティションの指定には従来のデバイスファイル名を使っているが、実際は''/ | + | 便宜上、下記設定例では物理パーティションの指定に従来のデバイスファイル名を使っているが、実際は''/ |
| < | < | ||
| - | 0 2048 linear /dev/loop0 0 | + | 0 |
| - | 2048 1048576 linear / | + | 2048 1048576 |
| - | 1050624 209715200 linear / | + | 1050624 |
| - | 210765824 20480 linear /dev/loop1 0 | + | 210765824 20480 |
| </ | </ | ||
| 行 98: | 行 100: | ||
| dmsetupコマンドで仮想ブロックデバイスを作成する。 | dmsetupコマンドで仮想ブロックデバイスを作成する。 | ||
| + | |||
| + | '' | ||
| < | < | ||
| 行 103: | 行 107: | ||
| </ | </ | ||
| - | 成功すると''/ | + | 成功すると''/ |
| + | |||
| + | これまた注意すべきはセクタサイズで、**生成されたデバイスの論理セクタサイズは、背後にあるデバイスの論理セクタサイズに依存**する。一般的には、テーブルファイルの最初のデバイスのセクタサイズが採用されるようだが、保証された挙動ではないらしい。 | ||
| + | |||
| + | < | ||
| + | # dmsetup ls | ||
| + | fbsd_disk0 | ||
| + | |||
| + | # dmsetup info fbsd_disk0 | ||
| + | Name: fbsd_disk0 | ||
| + | State: | ||
| + | Read Ahead: | ||
| + | Tables present: | ||
| + | Open count: | ||
| + | Event number: | ||
| + | Major, minor: | ||
| + | Number of targets: 4 | ||
| + | |||
| + | # cat / | ||
| + | fbsd_disk0 | ||
| + | |||
| + | # cat / | ||
| + | 4096 | ||
| + | </ | ||
| ==== 偽装GPTの作成 ==== | ==== 偽装GPTの作成 ==== | ||
| - | 生成した''/ | + | 生成した''/ |
| + | |||
| + | fdiskによる操作はパーティションテーブル、すなわちGPTならディスクの先頭・末尾の1MiB(256セクタ@4k)にのみ影響する。パーティションテーブル情報は、以下の経路をたどり、先に準備した偽装GPTファイルに書き込まれることになる。 | ||
| + | |||
| + | < | ||
| + | / | ||
| + | ↓ | ||
| + | / | ||
| + | ↓ | ||
| + | vm-100-fake_gpt1_primary.raw, | ||
| + | </ | ||
| - | 原則、fdiskはパーティションテーブル、すなわちディスクの先頭1MiBにのみ影響する。ここでの操作は、''/ | ||
| 512バイトセクタを明示するため、fdiskは**'' | 512バイトセクタを明示するため、fdiskは**'' | ||