web-dev-qa-db-ja.com

qemuにパススルーされた物理ディスクのホットスワップVM

私はproxmoxのqemuで仮想サーバーを実行しています。以下のように、101.cfgのvirtio:ディレクティブを使用してホストに接続された2つの物理ディスクがあります。

virtio2: /dev/disk/by-id/ata-vol1,backup=0 
virtio3: /dev/disk/by-id/ata-vol2,backup=0

これらには、nextcloudを使用してファイルが提供されるミラー化されたZFSボリュームが含まれています。これらのディスクはゲストから削除されないため、これはすべて正常に機能します。

また、他の3つの物理ディスクのローテーションをバックアップしています(物理コントローラーはJBOD構成のLSI RAID RAIDコントローラー、物理ハードウェアはHP Proiliant DL380e Gen8です)。これを行うには、zfsが更新されたスナップショットをストレージアレイからシステムに存在するバックアップディスクに送信します。これらを次のようにVMに追加しました。

virtio4: /dev/disk/by-id/ata-backup1-volname,backup=0
virtio5: /dev/disk/by-id/ata-backup2-volname,backup=0
virtio6: /dev/disk/by-id/ata-backup3-volname,backup=0

この種の動作ですが、問題は、これらのディスクのいずれもホットスワップ可能ではないことです。そのため、ディスクをローテーションで取り外して挿入すると、ゲストはそれらを表示できなくなります。 qemu設定でディスクホットプラグを有効にしています。

私の質問は、これらのディスクを挿入および削除するときに、これらのディスクを動的にVMに動的に接続および切断する正しい方法は何ですか?

次のようにvirtio-scsi「pciカード」を取り付けたり取り外したりすることで、「qmモニター」を使用して、取り出したディスクを取り付けたり取り外したりする部分的なソリューションを作成できました。

添付する

qm> drive_add 0 file=/dev/disk/by-id/ata-<disk-id>,if=none,id=backup_vol,cache=none,detect-zeroes=on
qm> device_add virtio-blk-pci,drive=backup_vol,id=backup_scsi_controller

切り離すには

qm> device_del backup_scsi_controller

(ソース: https://blog.chrishowie.com/2019/09/19/hot-swapping-virtio-disks-on-qemu/ Googleキャッシュ経由)

これらをバックアップスクリプトに追加できる可能性があると考えていましたが、シェルスクリプトからqmモニターコマンドを実行することはできないようです。qmモニターは引数またはstdinからの入力を受け取りません。 aroudを読むことから、ゲスト上のqemu-agentにソケットを作成し、JSONを使用してこれを注入することが可能かもしれませんが、JSONについては何も知らず、本当にもっと簡単な方法があることを望んでいます。

5
Christi

私はこれについていくらか家を回っていましたが、確かに、UNIXソケットを介してQMPコマンドをゲストに送信できるようになりました。これは、/ var/run/qemu-server/<server-id> .qmpのソケットを使用するデフォルトのProxmox構成でサポートされています。次に、インタラクティブにQMP JSONメッセージを送信できます

rlwrap -C qmp socat - UNIX:/var/run/qemu-server/101.qmp

(rlwrapはデフォルトではインストールされませんが、「apt install rlwrap」を使用してインストールできます)

ただし、QMPメッセージ形式は、私が思っていたほど不透明であり、イデオロギーの純粋さの理由から「drive_add」に直接相当するものはありません(理解できるかもしれませんが、それでも現在の難しさのコンテキストでは非常に役に立ちません)。 「blockdev_add」コマンドがあり、正しい構文を理解できると想定して、私が望んでいたことを実行できた可能性があります。

したがって、私は一歩戻り、「qm monitor」はreadlineのサポートのためにstdinからの入力をおそらく受け付けていなかったという結論に達しました。これは私に「期待」を思い起こさせました。後で簡単に "apt install expect"を実行すると、次のようにドライブを接続および切断するスクリプトを作成できました。

qemu-drive-attach <vm-id> <device-name> <path-to-block-device>

qemu-drive-attachスクリプトを使用(device-nameは任意-Proxmox命名スキームとの一貫性のために「virtio8」を使用)

!/usr/bin/expect
set vm_id               [lindex $argv 0];
set device_name         [lindex $argv 1];
set device_file         [lindex $argv 2];

spawn qm monitor $vm_id
expect "qm> "
send "drive_add 0 file=$device_file,if=none,id=drive-$device_name,cache=none,detect-zeroes=on\r"

expect "OK" {
    expect "qm> "
    send "device_add virtio-blk-pci,drive=drive-$device_name,id=$device_name\r"
}

expect "qm> "
send "quit\r"

send_user "\n"

そして、取り外しのために

qemu-drive-detach <vm-id> <device-name>

qemu-drive-detachスクリプトを使用

#!/usr/bin/expect
set vm_id               [lindex $argv 0];
set device_name         [lindex $argv 1];

spawn qm monitor $vm_id
expect "qm> "
send "device_del $device_name\r"

expect "qm> "
send "quit\r"

send_user "\n"

これらのスクリプトを使用したエラーチェックでは、特にdevice_addとdevice_delが成功しても何も表示されないため、何かが望まれますが、これにより、外部ブロックデバイスドライブをスクリプトからVMにホットスワップすることができます。

2
Christi

virtio-blkはホットスワップをサポートしていません。

ホットスワップ可能なディスクを使用するには、SATAまたはvirtio-scsi(SCSIプロトコルを実装)などのサポートを備えたドライバーを使用する必要があります。次に、virsh(編集:ご存知のように、Proxmoxではサポートされていません)またはQemu HMP(普遍的にサポートされていますが、エラーが発生しやすい可能性があります)を使用して、ディスクをホットアド/リムーブできます。

0
shodanshok