"LISTEN_FDS"
nbdkit-service1
Running nbdkit as a service, and systemd socket activation
Overview
Most people start nbdkit from the command line or run it from another program (see nbdkit-captive(1). It is also possible to run nbdkit as a standalone service, which is what this page describes.
Socket activation
nbdkit supports socket activation (sometimes called systemd socket activation). This is a simple protocol where instead of nbdkit itself opening the listening socket(s), the parent process (typically systemd or libnbd) passes in pre-opened file descriptors.
One use for socket activation is to serve infrequent NBD requests using a superserver without needing nbdkit to be running the whole time. Another use is to run nbdkit from a controlling libnbd process.
Socket activation is triggered when both the "LISTEN_FDS" and "LISTEN_PID" environment variables are set. In this mode using -i, -p, --run, -s or -U flags on the command line will cause an error. Also in this mode nbdkit does not fork into the background (ie. -f is implied).
Using socket activation with systemd
To use nbdkit with socket activation from systemd, create a unit file ending in ".socket" (eg. /etc/systemd/system/nbdkit.socket) containing:
[Unit]Description=NBDKit Network Block Device server[Socket]ListenStream=10809# Optional settings to detect dead clients:#KeepAlive=true#KeepAliveTimeSec=60#KeepAliveIntervalSec=10#KeepAliveProbes=5[Install]WantedBy=sockets.target
There are various formats for the "ListenStream" key. See systemd.socket(5) for more information.
Also create a service unit (eg. /etc/systemd/system/nbdkit.service) containing:
[Service]ExecStart=/usr/sbin/nbdkit file /path/to/serve# Optional settings to run as non-root:#User=nbd#Group=nbd
For more information on systemd and socket activation, see http://0pointer.de/blog/projects/socket-activation.html
Using socket activation with libnbd
libnbd(3) nbd_connect_systemd_socket_activation(3) lets you run nbdkit from a program using libnbd. An example is:
struct nbd_handle *nbd = nbd_create ();if (nbd == NULL) {fprintf (stderr, "%s\n", nbd_get_error ());exit (EXIT_FAILURE);}char *argv[] = {"nbdkit", "--exit-with-parent", "memory", "1G", NULL};if (nbd_connect_systemd_socket_activation (nbd,args) == -1) {fprintf (stderr, "%s\n", nbd_get_error ());exit (EXIT_FAILURE);}
Inetd and xinetd
You can run nbdkit from inetd(8) or xinetd(8). For inetd use:
nbd stream tcp nowait root /usr/sbin/nbdkit nbdkit -s file /tmp/disk.img
For xinetd create a file /etc/xinetd.d/nbdkit containing:
service nbd{socket_type = streamwait = nouser = rootserver = /usr/sbin/nbdkitserver_args = -s file /tmp/disk.img}
Af_vsock
On Linux nbdkit supports the "AF_VSOCK" address family / protocol. This allows you to serve NBD devices into virtual machines without using a regular network connection.
Note that this is different from the usual case where you present NBD as a virtual block device to a guest (which the guest sees as something like a SATA or virtio-scsi disk). With "AF_VSOCK" the virtual machine sees a raw NBD socket which it can connect to by opening an "AF_VSOCK" connection. For more about this protocol, see https://wiki.qemu.org/Features/VirtioVsock
AF_VSOCK example
To set up an "AF_VSOCK" server, use for example:
nbdkit --vsock [--port PORT] memory 1G
The optional -p/--port argument is used to change the "AF_VSOCK" port number. These port numbers exist in a different namespace from TCP/IP port numbers. Also unlike TCP, the port numbers are 32 bit. The default port is 10809.
The guest that wishes to access nbdkit must be configured for virtio-vsock. On the qemu command line use:
qemu ... -device vhost-vsock-pci,id=vhost-vsock-pci0
For libvirt add this element to the "<devices>" section:
<vsock/>
If you see the error "unable to open vhost-vsock device" then you may have to unload the VMCI transport on the host:
modprobe -r vmw_vsock_vmci_transport
Once nbdkit and the guest are running, from inside the guest you can connect to nbdkit on the host using libnbd:
nbdsh -c 'h.connect_vsock(2, 10809)' -c 'print(h.get_size())'
Environment
-
"LISTEN_PID" -
If present in the environment when nbdkit starts up, these trigger "SOCKET ACTIVATION".
Releases
4 releases since Debian 10 (Buster); the text changed 3 times.