===== Guía rápida para compartir dispositivos de bloque en red con NBD =====
==== NBD-server ====
Permite exportar dispositivos de bloque (discos duros, lectores de DVD, tarjetas SD, RAID, LVM, loop...) / imágenes (iso, nrg, img,...) en red que son accedidas remotamente desde clientes (nd-client) que los usarán como dispositivos locales. Permite entre otras cosas, IPv6, filtrar clientes por IP, crear automáticamente dispositivos temporales del tamaño que se desee para compartirlos en red y simulación de escrituras para los clientes.
nbd-server puede exportar dispositivos enteros o bien particiones de los mismos de manera individual. Una limitación importante a la hora de permitir la escritura sobre un dispositivo, es que únicamente el primer cliente que montó el dispositivo podrá hacerlo. Generalmente se recomienda, o bien compartir a un solo cliente con posibilidad de escritura o múltiples clientes como solo lectura.
Anteriormente la utilidad nbd-server se usaba por linea de comando, actualmente se ecomienda su uso mediante fichero de configuración, cuyas opciones veremos en esta guía. Por otro lado entendiendo el fichero de configuración se hace trivial el uso de nbd-server desde linea de comandos.
Desde la parte del servidor, es buena práctica no utilizar el disco local mientras haya clientes conectados con privilegios de escritura. Aunque si bien es verdad que no suele dar problemas, desconectar a los clientes previamente es lo más prudente.
==== NBD-client ====
Permite conectar con el servidor y usar como dispositivos locales los discos o imágenes remotas "exportadas". Necesita del usuario root para vincular los dispositivos remotos a unos internos (/dev/nbdX) generados al cargar el módulo "nbd".
Uno de los problemas con NBDs es que, si una conexión de red se cae o se bloquea un servidor, los clientes pueden tener diversos problemas dependiendo del uso que hagan del dispositivo remoto. Una recomendación para usar NBDs es hacerlo únicamente con puntos de montaje no críticos para el funcionamiento del sistema o usarlo simplemente por breves períodos de tiempo. Los clientes pueden configurar tiempos de espera y la posibilidad de reconexión frente a caídas. Se debe recordar que la comunicación cliente servidor no usa cifrado por lo que su uso en redes públicas podría acarrear problemas de seguridad. Si se quiere securizar la conexión se puede hacer uso de socat ([[sctp_con_cualquier_aplicacion_mediante_socat|leer]])
**Qué permite NBD que no se pueda hacer con NFS o SMB / CIFS**.
Si se necesitan usar en remoto herramientas para el mantenimiento de bajo nivel de discos (cfdisk, fsck, parted, etc o incluso otro tipo de operaciones como clonado de dispositivos.
Necesidad de espacio libre para clientes de la red y esos a su vez necesitan iterar con el sistema de ficheros del mismo.
Permite usar la disquetera o el lector, se pueden grabar DVD de manera remota.
Usar el espacio de intercambio "swap" del sistema de manera remota.
==== Fichero de configuración de nbd-server ====
Fichero "/etc/nbd-server/config". Las opciones comentadas (#) no son obligatorias. Los comentarios deben ser a principio de linea, en caso contrario no arrancará (no avisa en muchas ocasiones).
########################### Sección general.
[generic]
# Usuario y grupo del proceso. Si no se especifica se usa el del usuario que arranca el proceso.
user = nbd
group = nbd
# Puerto donde escucha el servidor, por defecto 10809.
# port = 8000
# Permite que los clientes muestren los dispositivos (exportname) con "nbd-client -l"
# allowlist = true
# Directorio donde hay otros ficheros de configuración.
# includedir = /etc/nbd-server/conf.d
# Dirección ip donde se atienden peticiones, con 0.0.0.0 se limita solo s IPv4.
# listenaddr = 0.0.0.0
# Hilos del proceso, por defecto 4.
# max_threads = 6
# Si se prefieren usar sockets UNIX en vez de la red.
# unixsock = /var/run/nbd/server.socket
########################### Nombre del fichero imagen o dispositivo a exportar.
[sda]
# Dispositivo a exportar (NO se especifican particiones).
exportname = /dev/sda
# Simula escritura en los clientes usando un fichero diff con los cambios que es borrado al desconectar. (-c)
# copyonwrite = false
# Permiso de solo lectura, si el cliente intenta escribir será notificado con un error.(-r)
readonly = true
# IPs (una por linea) o redes (CIDR) que tienen permitido conectar, si se crea el fichero sin contenido no se permite ninguna conexión. (-l)
# authfile = /etc/nbd-server/hosts
# Permite especificar donde se ubica el fichero diff con los cambios.
# Útil si el user ID de nbd-server no puede escribir en disco. Requiere "copyonwrite" a true.
# cowdir = /tmp/file
# Desactiva la detección automática de tamaño y fuerza a usarse el definido.
# Si se usa con "multifile" a true tiene efecto sobre todos los dispositivos.
# filesize = 9999999
# Indica al cliente que es compatible con peticiones flush (fdatasync() / fsync()).
# Rendimiento es menor pero más confiable frente a apagones / pérdidas de conexión.
# flush = true
# Indica al cliente la compatibilidad con peticiones fua (force unit access): sync_file_range() / fdatasync().
# fua = true
# Número máximo de conexiones abiertas con el dispositivo exportado.
# maxconnections = 10
# nbd-server buscará múltiples dispositivos "exportname.número" (empezando por el 0) fusionándolos en uno. (-m)
# multifile = false
# Ejecuta un comando cuando el cliente desconecta. "%s" refiere a la IP del cliente.
# postrun = "comando"
# Ejecuta un comando una vez que el cliente conecta pero antes de servir el fichero.
# prerun = "comando"
# Permite usar SPD (Socket Direct Protocol) aprovechando así mejoras de rendimiento (Hardware especial).
# spd = false
# Acelera las escrituras con copyonwrite mediante el uso de "archivos dispersos".
# Útil si hay muchas escrituras.
# sparse_cow = true
# Realiza llamadas fsync después de cada escritura. Menor rendimiento pero más confiable.
# sync = false
# Genera un fichero temporal con el nombre definido en "exportname" que será borrado al terminar el proceso nbd-server.
# Se debe usar con "filesize" y es incompatible con la opción "multifile".
# temporary = false
# Segundos que una conexión puede estar en estado de reposo (idle), por defecto indefinidamente: "0". (-a)
# timeout 300
# Genera un archivo binario con los logs de las transacciones realizadas (peticiones y respuestas).
# No incluye información de las negociaciones. Por cada cliente se genera un fichero de log.
# transactionlog = /tmp/bin.log
# El servidor anuncia que soporta "NBD_CMD_TRIM" para la exportación, activar para discos SSD.
# trim = false
# Permite crear exportaciones que sirvan diferentes archivos en función de la dirección IP del cliente.
# Valores: ipliteral (por defecto) / none / iphash / cidrhash.
# virtstyle = ipliteral
# [sdb3]
# exportname = /dev/sdb3
# copyonwrite = yes
# cowdir = /tmp
# ...
NOTA: Si se exporta con permisos de escritura, el dispositivo no puede estar montado en otra ubicación, el primero que lo monte es el que podrá escribir. Si no se especifica el valor de "readonly" o "copyonwrite" se comparten los discos con posibilidad de escritura (recordar que la escritura se limita al primer cliente).
**Opciones de linea de comandos de nbd-server**.
Usage: [ip:|ip6@]port file_to_export [size][kKmM] [-l authorize_file] [-r] [-m] [-c] [-C configuration file] [-p PID file name] [-o section name] [-M max connections] [-V]
-r|--read-only read only
-m|--multi-file multiple file
-c|--copy-on-write copy on write
-C|--config-file specify an alternate configuration file
-l|--authorize-file file with list of hosts that are allowed to
connect.
-p|--pid-file specify a filename to write our PID to
-o|--output-config output a config file section for what you
specified on the command line, with the
specified section name
-M|--max-connections specify the maximum number of opened connections
-V|--version output the version and exit
if port is set to 0, stdin is used (for running from inetd).
if file_to_export contains '%s', it is substituted with the IP
address of the machine trying to connect
if ip is set, it contains the local IP address on which we're listening.
if not, the server will listen on all local IP addresses
Using configuration file /etc/nbd-server/config
==== Usando el cliente nbd-client ====
Se necesita cargar el módulo nbd y ser ejecutado como usuario root. Si las particiones de los discos importados no aparecen (/dev/nbdXp1, /dev/nbdXp2,...) se debe cargar el módulo indicando el máximo de particiones a manejar.
modprobe nbd max_part=10
**Uso de nbd-client** (Importar discos / Eliminar conexión).
nbd-client 11.22.33.44 -N sda /dev/nbd0
Si se ha montado alguna partición del disco, es recomendable desmontarlo antes de desconectar con el servidor.
# Desmontar.
umount /dev/nbd0p1
# Desconectar la comunicación con el servidor.
nbd-client -d /dev/nbd0
**Opciones de nbd-client**.
nbd-client version 3.14
Usage: nbd-client -name|-N name host [port] nbd_device
[-block-size|-b block size] [-timeout|-t timeout] [-swap|-s] [-sdp|-S]
[-persist|-p] [-nofork|-n] [-systemd-mark|-m]
Or : nbd-client -u (with same arguments as above)
Or : nbd-client nbdX
Or : nbd-client -d nbd_device
Or : nbd-client -c nbd_device
Or : nbd-client -h|--help
Or : nbd-client -l|--list host
Default value for blocksize is 1024 (recommended for ethernet)
Allowed values for blocksize are 512,1024,2048,4096
Note, that kernel 2.4.2 and older ones do not work correctly with
blocksizes other than 1024 without patches
Default value for port is 10809. Note that port must always be numeric
==== Ampliar información sobre NBD con el man de linux ====
man nbd-server
man 5 nbd-server
man nbd-trdump