qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: questions about QMP commands - "block-export-add" and "nbd-server-ad


From: Hanna Reitz
Subject: Re: questions about QMP commands - "block-export-add" and "nbd-server-add"
Date: Tue, 5 Jul 2022 13:32:13 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.10.0

On 05.07.22 11:57, Yu Zhang wrote:
Hi All,

since QEMU-5.2, the QMP command "nbd-server-add" was deprecated and replaced with "block-export-add" [1].

Arguments for the two are different. For using "block-export-add", "id" and "node-name" are needed, of which "id" is "device" for "nbd-server-add"

No, @id is the ID for the export, which is used to identify it it in other block-export-* commands like block-export-del. nbd-server-add’s @device parameter corresponds to block-export-add’s @node-name parameter.

and "node-name" can be obtained from the querying result of "query-block".

Ideally, management tools would set every block node’s @node-name manually so it doesn’t need to be queried.

As shown by an example below:

{ "execute": "query-block" }
{"return": [..., {..., "device": "drive-virtio-disk5", ...: {...:
{"virtual-size": 53687091200, "filename": "/dev/md0", "format": "raw", ...} , ..., "node-name": "#block349", ...}, "qdev": "/machine/peripheral/virtio-disk5/virtio-backend", "type": "unknown"}]}

{ "execute": "nbd-server-add", "arguments": { "device": "drive-virtio-disk5", "writable": true }}

Note that you could pass “#block349” for @device here, instead of “drive-virtio-disk5”.

{"error": {"class": "GenericError", "desc": "Permission conflict on node '#block349': permissions 'write' are both required by an unnamed block device (uses node '#block349' as 'root' child) and unshared by block device 'drive-virtio-disk5' (uses node '#block349' as 'root' child)."}}

{ "execute": "block-export-add", "arguments": { "type": "nbd", "id": "drive-virtio-disk5", "node-name": "#block349", "writable": true }}

You can pass anything for @id that you’d like, for example “nbd-export-349”.  It should identify the export, not the block device underneath.

{"error": {"class": "GenericError", "desc": "Permission conflict on node '#block349': permissions 'write' are both required by an unnamed block device (uses node '#block349' as 'root' child) and unshared by block device 'drive-virtio-disk5' (uses node '#block349' as 'root' child)."}}


An issue we encountered with "block-export-add" for VM live migration:

on the target server
- exported device name: drive-virtio-disk5
- node name of the exported device: #node123

on the source server
- gets the device name from target via network: driver-virtio-disk5
- gets the node name from the target via network: #node123

However, on the source server, the node name #node123 can't be identified.

Assumption: the same "device" may have different "node-name" on the source and target servers.

Yes.  You should configure the node name to match or at least to be something that you can work with.

I don’t know how you command line to configure block devices looks, but if you’re using -drive (which I assume you do, because with -blockdev, the @node-name parameter would be mandatory for you to set), then you can simply use something like

-drive id=drive-virtio-disk5,node-name=drive-virtio-disk5-node,...

And then you can address the drive-virtio-disk5 block device with the node name “drive-virtio-disk5-node”.

Hanna




reply via email to

[Prev in Thread] Current Thread [Next in Thread]