Proxmox VEのVMからHDDを直接読み書き(いわゆるRDM)

物理HDDやSSDをVMに直接アタッチしてストレージとして使う、いわゆるRDM (Raw Device Mapping)をProxmox VEで行う方法。

RDMはVMware用語っぽい雰囲気で、Proxmoxではディスクパススルーと呼んでいる。厳密には仕組みも違うっぽい気がするけど、RDMの方が通りがいいので本記事ではRDMと呼ぶことにする。

  • Proxmox VE 6.2-4

RDMしたいストレージのホスト側デバイスファイルを、仮想ディスクまたは仮想ブロックデバイスとしてゲストにくっつけるだけで行ける。

Proxmoxのストレージ画面でRDM対象のHDDを確認する。重要なのはHDDのモデル名とシリアル番号。

CLIからはls -l /dev/disk/by-id/で確認すると良いだろう。

# ls -l /dev/disk/by-id/
total 0
lrwxrwxrwx 1 root root  9 Jan 20 22:53 ata-MARSHAL_MAL38000NS-T72_37F5K073FDMF -> ../../sdc
lrwxrwxrwx 1 root root 10 Jan 20 22:53 ata-MARSHAL_MAL38000NS-T72_37F5K073FDMF-part1 -> ../../sdc1
lrwxrwxrwx 1 root root  9 Jan 20 23:24 ata-ST10000NM0086-2AA101_ZA210RT9 -> ../../sdb
lrwxrwxrwx 1 root root 10 Jan 20 23:24 ata-ST10000NM0086-2AA101_ZA210RT9-part1 -> ../../sdb1
(略)
lrwxrwxrwx 1 root root  9 Jan 26 13:41 ata-WDC_WD160EDGZ-11B2DA0_2BJBRUZN -> ../../sdh
lrwxrwxrwx 1 root root 10 Jan 26 13:41 ata-WDC_WD160EDGZ-11B2DA0_2BJBRUZN-part1 -> ../../sdh1

PVEのシェルを開きqm setコマンドでHDDをVMにくっつける。書式は見れば分かると思うが、qm set 仮想マシンID アタッチ先仮想デバイス アタッチ元ホスト側デバイスである。

# qm set 100 -virtio0 /dev/disk/by-id/ata-HGST_HUH728080ALE604_VKHV9Z7X
# qm set 100 -virtio1 /dev/disk/by-id/ata-HGST_HUH728080ALE604_VLG7NZGY
# qm set 100 -virtio2 /dev/disk/by-id/ata-MARSHAL_MAL38000NS-T72_37F5K073FDMF
# qm set 100 -virtio3 /dev/disk/by-id/ata-TOSHIBA_MD05ACA800_37H1K0KYFYZD

アタッチ元のHDDのデバイスファイルは、上記のように/dev/disk/by-id/以下の製品名・シリアル番号を含むパスを使うのが良いとされている。

/dev/sdaのような昔ながらのデバイスファイルも使えるが、sdXと物理HDDの対応は変化する可能性があるので(例えばHDDを繋ぐ物理SATAポートが変わった時とか)、確実に一意に定まる/dev/dis/by-id/ata-MODELNAME_SERIALNOの方が安全というわけ。アタッチしたデバイスはVM側で直接読み書きされちゃうので(それを望んでるわけだけど)、あずかり知らぬところで意図せぬストレージが読み書きされたら目も当てられない状況になってしまう。

アタッチ先仮想デバイスは、上記では-virtio0でブロックデバイスとして接続している。SCSIなら-scsi0、SATAなら-sata0って感じで使いたい方式で置き換えてください。

なお、2021年現在、RDMに限らず仮想ディスクの接続は、virtio-scsiによるSCSI接続がよさげな雰囲気。理由は以下のとおり。

  • virtio-blkの開発が停滞しており、性能面でvirtio-scsiが優位になってきた。
  • virtio-blkはPCIデバイス扱いなのでデバイス数制限がキツイく、virtio-scsiの方がユルイ。
  • virtio-scsiはゲスト側でのホットプラグ対応が望める。

問題なくアタッチできれば、VM管理画面で「ハードディスク」が追加されているのが確認できる。

以上で、VM側から追加したHDD全体が仮想ストレージとして見える。

勘の良い人はお気づきだろうが、同じ方法で物理ディスク全体だけではなく、特定のパーティションのみをRDMすることもできる。この場合も、VM側からは1台の仮想ディスクに見えるため、VM側でパーティションを切ると物理パーティションの中に仮想パーティションテーブルが存在する入れ子状態となる(仕組み上当然ですわな。)

既存のデータ入りパーティションをVMにRDMし、仮想ディスク上の有効なパーティションとしてそのまま使いたい場合は、Linuxのデバイスマッパーを使うと実現できる。手前みそですけど参考記事:Device Mapperで物理パーティションを仮想パーティションに偽装

  • virtualization/proxmox_ve_6_2_rdm.txt
  • 最終更新: 2022-04-07 11:51
  • by Decomo