NBD расшифровывается как “сетевое блочное устройство”, но на самом деле оно также работает просто как аналог FUSE для блочных устройств, то есть, представляет собой “блочное устройство в пространстве пользователя”.

NBD на данный момент необходимо, чтобы монтировать диски Vitastor ядром Linux. NBD немного снижает производительность из-за дополнительных копирований памяти, но она всё равно остаётся на неплохом уровне (см. для примера тест).

Смотрите также VDUSE, как лучшую альтернативу NBD.

CSI-драйвер Kubernetes Vitastor использует NBD, когда VDUSE недоступен.

Поддерживаются следующие команды:

map

Чтобы создать локальное блочное устройство для образа, выполните команду:

vitastor-nbd map [/dev/nbdN] --image testimg

Команда напечатает название блочного устройства вида /dev/nbd0, которое потом можно будет использовать как обычный диск.

Для обращения по номеру инода, аналогично другим командам, можно использовать опции --pool <POOL> --inode <INODE> --size <SIZE> вместо --image testimg.

vitastor-nbd поддерживает все обычные опции Vitastor, например, --config_file <path_to_config>, плюс специфичные для NBD:

  • --nbd_timeout 0
    Максимальное время выполнения любой операции чтения/записи в секундах, при превышении которого ядро остановит NBD-устройство. На ядрах Linux старее 5.19, если таймаут установлен в 0, NBD-устройство вообще невозможно отключить из системы при нештатном завершении процесса.
  • --nbd_max_devices 64 --nbd_max_part 3
    Опции, передаваемые модулю ядра nbd, если его загружает vitastor-nbd (nbds_max и max_part).
  • --logfile /path/to/log/file.txt
    Писать сообщения о процессе работы в заданный файл, вместо пропуска их при фоновом режиме запуска или печати на стандартный вывод при запуске в консоли с --foreground 1.
  • --dev_num N
    Использовать заданное устройство /dev/nbdN вместо автоматического подбора.
  • --foreground 1
    Не уводить процесс в фоновый режим.

Обратите внимание, что опции nbd_timeout, nbd_max_devices и nbd_max_part можно также задавать в /etc/vitastor/vitastor.conf или в другом файле конфигурации, заданном опцией --config_file.

unmap

Для отключения устройства выполните:

vitastor-nbd unmap /dev/nbd0

ls

vitastor-nbd ls [--json]

Вывести подключённые устройства.

Пример вывода в обычном формате:

/dev/nbd0
image: bench
pid: 584536

/dev/nbd1
image: bench1
pid: 584546

Пример вывода в JSON-формате:

{"/dev/nbd0": {"image": "bench", "pid": 584536}, "/dev/nbd1": {"image": "bench1", "pid": 584546}}
vitastor-nbd netlink-map [/dev/nbdN] (--image <image> | --pool <POOL> --inode <INODE> --size <SIZE>)

На свежих версиях ядра Linux также возможно подключать NBD-устройства через интерфейс netlink.

Это экспериментальная функция, так как она не решает всех проблем NBD. Отличия от обычного ‘map’:

  1. Можно создавать новые /dev/nbdN устройства (отсутствующие в /dev/).
  2. Отключать netlink-устройства можно только командой netlink-unmap.
  3. netlink-устройства не видно в выводе ls (пока что).
  4. Мёртвые netlink-устройства можно “оживить” командой netlink-revive. Правда, предыдущие запросы ввода-вывода всё равно зависнут навсегда, если nbd_timeout не задан.
  5. Поддерживаются дополнительные опции:
  • --nbd_conn_timeout 0
    Отключать мёртвое устройство автоматически через данное число секунд.
  • --nbd_destroy_on_disconnect 1
    Удалять NBD-устройство при отключении.
  • --nbd_disconnect_on_close 1
    Отключать NBD-устройство автоматически, когда его все закроют.
  • --nbd_ro 1
    Установить для NBD-устройства режим “только для чтения”.
vitastor-nbd netlink-unmap /dev/nbdN

Отключить устройство через интерфейс netlink. Работает и с обычными, и с netlink-устройствами.

vitastor-nbd netlink-revive /dev/nbdX (--image <image> | --pool <pool> --inode <inode> --size <size in bytes>)

Оживить мёртвое NBD-устройство, ранее подключённое через netlink, без удаления. Поддерживает те же опции, что и netlink-map.