Qemu VM-д дамжуулсан халуун солигддог физик дискнүүд

Би виртуал сервер ажиллуулж байна proxmox дээр qemu дээр. Энэ нь виртуал ашиглан хост руу залгагдсан хоёр физик дисктэй: 101.cfg-д өгсөн заавар

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

Эдгээрт толин тусгал бүхий ZFS хэмжээ багтсан бөгөөд үүнээс миний файлууд nextcloud ашиглан үйлчилдэг. Эдгээр дискийг зочдоос хэзээ ч хасдаггүй тул энэ бүхэн сайн ажиллаж байна.

Надад өөр гурван физик дискний эргэлт байдаг бөгөөд үүнийг нөөцөлж өгдөг (физик хянагч нь JBOD тохиргоонд байгаа LSI рейд хянагч, физик тоног төхөөрөмж нь 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 config-д дискний hotplug-ийг идэвхжүүлсэн байна.

Миний асуух зүйл бол эдгээр дискнүүдийг оруулж, устгаж байх үед нь миний VM-д динамикаар холбож салгах зөв арга юу вэ?

Би виртуал-scsi "pci картуудыг" хавсаргаж салгаснаар гаргаж байгаа дискээ хавсаргаж салгах "qm monitor" ашиглан хэсэгчилсэн шийдлийг боловсруулж чадсан:

хавсаргах

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 кэшээр дамжуулан)

I Эдгээрийг нөөц скрипт дээрээ нэмж болно гэж бодож байсан боловч бүрхүүл скриптээс qm дэлгэцийн командыг ажиллуулах боломжгүй юм шиг санагдсан бөгөөд qm монитор нь stdin-ээс нэмэлт өгөгдөл эсвэл оролт авахгүй. Чанга уншихаас зочин дээр qemu-agent руу залгуур үүсгэж, үүнийг JSON ашиглан тарьж болох юм, гэхдээ би JSON-ийн талаар юу ч мэдэхгүй, илүү хялбар арга байна гэж найдаж байна.

5
задан 21 May 2020 в 00:20
2 ответа

Я несколько раз ходил по домам на этом, и действительно дошел до того момента, когда я смог посылать команды QMP гостю через сокет UNIX. Это поддерживается конфигурацией Proxmox по умолчанию с использованием сокета в / var / run / qemu-server / .qmp. Затем я могу в интерактивном режиме отправлять сообщения QMP JSON, используя

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

(rlwrap не установлен по умолчанию, но может быть установлен с помощью «apt install rlwrap»)

Однако формат сообщения QMP был настолько непрозрачным, насколько я думал, что он будет be и не имеет прямого эквивалента "drive_add" по причинам идеологической чистоты (что, возможно, понятно, но, тем не менее, крайне бесполезно в контексте моих нынешних затруднений).Существует команда «blockdev_add», которая вполне могла сделать то, что я хотел, если предположить, что я смогу выработать правильный синтаксис.

Поэтому я сделал шаг назад и пришел к выводу, что «qm monitor», вероятно, не принимает ввод от stdin из-за поддержки строки чтения. Это заставило меня задуматься о «ожидании». Позже была произведена быстрая «подходящая установка», и я смог создать сценарии для подключения и отключения дисков следующим образом:

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

с помощью сценария qemu-drive-attach (имя устройства произвольное - я использую «virtio8» для согласованности с Схема именования Proxmox)

!/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 не сообщают об успехе, но это позволит включить внешнюю блокировку диски устройств, которые должны быть заменены на виртуальную машину из сценария.

2
ответ дан 4 January 2021 в 07:29

virtio-blk не поддерживает горячую замену.

Для использования горячей замены. заменяемые диски, необходимо использовать драйвер с такой поддержкой, как SATA или virtio-scsi (реализующие протокол SCSI). Затем вы можете использовать что-то вроде virsh (отредактируйте: как вы правильно заметили, он не поддерживается в Proxmox) или Qemu HMP (универсально поддерживается, но потенциально более подвержен ошибкам) ​​для горячего добавления / удаления дисков.

0
ответ дан 4 January 2021 в 07:29

Теги

Похожие вопросы