NBD : Network Block Devices

Network Block Devices (NBD) est un composant du kernel permettant de monter un fichier distant via ethernet, en TCP, comme s’il s’agissait d’un périphérique de bloc local.

Le système fonctionne en client serveur. Le client monte le fichier distant tandis que le serveur offre le service (l’espace de stockage). NBD est très légé, simple à mettre en œuvre et indépendant du système de fichier utilisé (puisque les accès sont effectués en mode bloc).

Installation

Activation dans le noyau

NBD étant un « block device », il s’active dans la partie « Device Drivers > Block devices » du kernel du client ET du serveur :

Device Drivers  --->
   Block devices  --->
...
      < * > Network block device support
...

Si l’option est compilée en tant que module, ce dernier sera chargé par « modprobe » :

mafalda ~ # zgrep NBD /proc/config.gz 
CONFIG_BLK_DEV_NBD=m
mafalda ~ # modprobe nbd
mafalda ~ # lsmod | grep nbd
nbd                     8085  0

… pour ceux dont le kernel n’est pas compilé avec les options « Kernel .config support » et « Enable access to .config through /proc/config.gz », lancez un grep NBD sur /boot/config-votre-kernel pour voir comment l’option est activée :

root@tester:~# ls /proc/config*
ls: ne peut accéder /proc/config*: Aucun fichier ou dossier de ce type
root@tester:~# grep NBD /boot/config-2.6.32-22-generic 
CONFIG_BLK_DEV_NBD=m

(exemple sous Ubuntu 10.04)

Installation des composants

NBD est pacagé sous la plupart des distributions linux, comme sous Gentoo Linux :

mafalda ~ # emerge nbd
...

Debian et ses dérivés permettent de choisir le client seul ou le serveur seul ou les deux :

root@debian:~# aptitude search nbd
...
p   nbd-client                                            - Network Block Device protocol - client                                                           
p   nbd-server                                            - Network Block Device protocol - server 
root@debian:~# aptitude install nbd-client nbd-server
...

Si toutefois votre distribution ne disposait pas d’un paquet NBD, vous pouvez utiliser les sources du programme en les téléchargeant depuis le site officiel http://nbd.sourceforge.net/ (lien « Sourceforge project pages ») :

[root@backup ~]# cd /usr/src/
[root@backup src]# wget -q http://downloads.sourceforge.net/project/nbd/nbd/2.9.15/nbd-2.9.15.tar.gz?use_mirror=freefr
[root@backup src]# tar xvf nbd-2.9.15.tar.gz 
nbd-2.9.15/
...
[root@backup src]# cd nbd-2.9.15
[root@backup nbd-2.9.15]# ./configure --help
`configure' configures nbd 2.9.15 to adapt to many kinds of systems.
...
[root@backup nbd-2.9.15]# ./configure --enable-lfs --enable-syslog
...
config.status: creating Makefile
...
config.status: executing depfiles commands
[root@backup nbd-2.9.15]#  make -j2
...
[root@backup nbd-2.9.15]#  make install
...
[root@backup nbd-2.9.15]#  nbd-client -h
nbd-client version 2.9.15
...
[root@backup nbd-2.9.15]#  nbd-server -h
nbd-server: invalid option -- 'h'
This is nbd-server version 2.9.15
...

Note : La version « 2.9.15 » d’nbd nécessite une GLIB > 2.6.0 …

Configuration

Préparation du banc de test

Comme souvent pour effectuer des tests sur des périphériques de blocs, la mise en place du banc de test commence par la création d’un conteneur dans lequel on crée un système de fichier. Vous pouvez vous reporter à l’article  » Utiliser les périphériques de loop » sur ce « Admin Linux Fr » pour plus de renseignements sur le sujet :

fhh@mafalda ~ $ mkdir tmp/ndb
fhh@mafalda ~ $ dd if=/dev/zero of=tmp/nbd/hd0.img bs=1024 count=1024000
1024000+0 enregistrements lus
1024000+0 enregistrements écrits
1048576000 octets (1,0 GB) copiés, 24,8713 s, 42,2 MB/s
fhh@mafalda ~ $ mkfs.xfs tmp/nbd/hd0.img 
meta-data=tmp/nbd/hd0.img        isize=256    agcount=4, agsize=64000 blks
         =                       sectsz=512   attr=2
data     =                       bsize=4096   blocks=256000, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0
log      =internal log           bsize=4096   blocks=1200, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =aucun                  extsz=4096   blocks=0, rtextents=0

De la même façon, nous pourrons créer « tmp/nbd/hd1.img ».

Une fois les conteneurs créé et formatés, nous les montons afin d’y créer des fichier pour effectuer les tests :

fhh@mafalda ~ $ mkdir -p tmp/nbd/disk{0,1}
fhh@mafalda ~ $ su -
Mot de passe : 
root@mafalda:~# mount -o loop ~fhh/tmp/nbd/hd0.img ~fhh/tmp/nbd/disk0/
root@mafalda:~# mount -o loop ~fhh/tmp/nbd/hd1.img ~fhh/tmp/nbd/disk1/
root@mafalda:~# mount
...
/dev/loop0 on /home/fhh/tmp/nbd/disk0 type xfs (rw)
/dev/loop1 on /home/fhh/tmp/nbd/disk1 type xfs (rw)
root@mafalda:~# touch ~fhh/tmp/nbd/disk{0,1}/test.txt
root@mafalda:~# echo "disque 0..." > ~fhh/tmp/nbd/disk0/fic.txt
root@mafalda:~# echo "disque 1..." > ~fhh/tmp/nbd/disk1/fic.txt
root@mafalda:~# ls ~fhh/tmp/nbd/disk*
/home/fhh/tmp/nbd/disk0:
fic.txt  test.txt
 
/home/fhh/tmp/nbd/disk1:
fic.txt  test.txt
root@mafalda:~# umount ~fhh/tmp/nbd/disk*

Lancement du serveur

Le binaire de lancement du serveur NBD n’accepte que peut d’option comme vous pourrez le constater en consultant sa page de man. De manière générale et en l’absence de fichier de configuration par défaut du service (fichier /etc/nbd-server/config) l’appel à nbd-server est du type :

nbd-server [ip d'écoute du serveur:][port d'écoute] [fichier] [options diverses]

  • [ip d’écoute du serveur:] est l’adresse de l’interface sur laquelle le serveur attendra les connexions au périphérique de blocs (par défaut, nbd écoute sur toutes les interfaces) ;
  • [port d’écoute] est le port d’écoute ;
  • [fichier] est le fichier exporté ;
  • [options diverses] sont les options acceptées par nbd-serveur.

Ce qui donne par exemple :

fhh@mafalda ~ $ nbd-server 192.168.215.1:5000 ~fhh/tmp/nbd/hd0.img
fhh@mafalda ~ $ ps aux | grep nbd-server
fhh       5694  0.0  0.0   9204   556 ?        Ss   18:45   0:00 nbd-server 192.168.215.1:5000 /home/fhh/tmp/nbd/hd0.img

Utilisation du fichier de configuration par défaut

Afin de ne pas avoir à re saisir une ligne de commande complète pour exporter un fichier en tant que périphérique de bloc sur le réseau, vous pouvez utiliser le fichier de configuration de nbd-server : « /etc/nbd-server/config« . Sa documentation est consultable via les pages de man (« man 5 nbd-server« ).

Pour exporter le fichier « /home/fhh/tmp/nbd/hd1.img » sur le port 5001 via l’ip 192.168.215.1 pour la machine 192.168.215.129 en tant qu’utilisateur « fhh », votre fichier ressemblera à :

[generic]
    user = fhh
    group = users
[export]
    exportname = /home/fhh/tmp/nbd/hd1.img
     port = 5001
     authfile = /etc/nbd-server/host.allow
     copyonwrite = true
     listenaddr = 192.168.215.1

Notez l’option « copyonwrite » qui permettra à la machine connectée au périphérique d’écrire « virtuellement » sur ce dernier comme elle le souhaite, mais, dès que le client sera déconnecté, toutes les modifications seront perdue… En réalité, les modifications ne sont pas appliquée au système de fichier monté, elles sont stockées dans un fichier temporaire qui est effacé quand le périphérique est déconnecté. Cette méthode, ralentis le fonctionnement d’nbd.

Le fichier « /etc/nbd-server/host.allow » disposera d’un contenu du type :

127.0.0.1
192.168.215.129

Il ne reste alors qu’à lancer le serveur NBD :

root@mafalda:~# nbd-server
root@mafalda:~# ps aux | grep nbd-server
fhh       5694  0.0  0.0   9204   556 ?        Ss   18:45   0:00 nbd-server 192.168.215.1:5000 /home/fhh/tmp/nbd/hd0.img
fhh       6001  0.0  0.0  17604   800 ?        Ss   19:17   0:00 nbd-server
root@mafalda:~# lsof -i | grep 6001
nbd-serve 6001      fhh    3u  IPv4  30687      0t0  TCP mafalda.local:5001 (LISTEN)

Comme vous pouvez le constater, nous retrouvons le serveur NBD lancé précédemment (process 5694) et voyons apparaître le processus 6001 qui, bien que lancé sous l’identité root tourne en tant qu’utilisateur non privilégié « fhh ». Un « lsof -i » à la recherche de ce processus nous informe qu’il écoute sur le port 5001 de l’interface locale comme définit dans le fichier de configuration que nous avons créé.

Bien sûr, les deux exports peuvent être définis dans un fichier de configuration du type :

root@mafalda:~# kill 6001 # tuons les serveurs en cours d'execution ... le premier...
root@mafalda:~# kill 5694 # le second...
root@mafalda:~# cat /etc/nbd-server/config 
[generic]
	user = fhh
	group = users
[export]
	exportname = /home/fhh/tmp/nbd/hd1.img
	port = 5001
	authfile = /etc/nbd-server/host.allow
	copyonwrite = true
	listenaddr = 192.168.215.1
[file]
	exportname = /home/fhh/tmp/nbd/hd0.img
	port = 5000
	authfile = /etc/nbd-server/host.allow
	listenaddr = 192.168.215.1
root@mafalda:~# nbd-server
root@mafalda:~# ps aux | grep nbd
fhh       6107  0.0  0.0  17604   800 ?        Ss   19:26   0:00 nbd-server
root@mafalda:~# lsof -i
...
nbd-serve 6107      fhh    3u  IPv4  34859      0t0  TCP mafalda.local:5001 (LISTEN)
nbd-serve 6107      fhh    4u  IPv4  34860      0t0  TCP mafalda.local:5000 (LISTEN)

Avant de passer à la partie cliente de nbd, notez l’option « virtstyle » qui permet d’associer automatiquement un fichier personnalisé à chaque client ce connectant. Par exemple, en définissant un export du type :

[sauvegarde]
	exportname = /export/%s
	port = 5001
	virtstyle = ipliteral
	authfile = /etc/nbd-server/host.allow
	listenaddr = 192.168.215.1

La machine 192.168.215.129 accédera au fichier « /export/192.168.215.129 » du serveur 192.168.215.1 lors de sa connexion au port 5001 tandis que la machine 192.168.215.100 aura accès au fichier « /export/192.168.215.100 » en utilisant le même partage…

Le format de « %s » peut varier en fonction de la valeur passée à « virtstyle ». « iphash » Dirige les clients vers des fichier du type « /export/192/168/215/129 » ou « /export/192/168/215/100 », et « cidrhash » en fonction des masques réseaux… Consultez la page de man pour plus d’informations sur cette option.

Enfin notons également les options « prerun » et « postrun » qui permettent par exemple de créer à la volée des fichiers a exporter ou de les supprimer après déconnexion du client. « %s » Désigne avec ces options le nom du fichier cible.

Lancement du client

Tous comme le serveur, le client NBD n’autorise que peu d’options. Un appel à « nbd-client » est du type :

nbd-client [nom du serveur ou ip] [port de connexion] [device /dev/nbX]

  • [nom du serveur ou ip] est le nom ou l’ip du serveur offrant le service de partage,
  • [port de connexion] est le port de connexion au serveur,
  • [device /dev/nbX] est le device à qui est associé le montage.

Si le serveur est lancé en utilisant le fichier présenté ci dessus (dans la partie consacré à la configuration du serveur), nous nous connecterons aux exports via les commandes suivantes :

root@debian:~# nbd-client 192.168.215.1 5000 /dev/nbd0
Negotiation: ..size = 1024000KB
bs=1024, sz=1024000
root@debian:~# nbd-client 192.168.215.1 5001 /dev/nbd1
Negotiation: ..size = 1024000KB
bs=1024, sz=1024000

avant d’effectuer les montages classiquement :

root@debian:~# mkdir /export/disk{0,1} -p
root@debian:~# mount /dev/nbd1 /export/disk1/
root@debian:~# mount /dev/nbd0 /export/disk0/

Les montages peuvent ensuite être utilisé comme n’importe quel autre :

root@debian:~# ls /export/disk*
/export/disk0:
fic.txt  test.txt
 
/export/disk1:
fic.txt  test.txt

La libération du device « /dev/nbdX » est également assurée par la commande « nbd-client » :

root@debian:~# umount /export/disk0
root@debian:~# nbd-client -d /dev/nbd1
Disconnecting: que, disconnect, sock, done

Détail de l’option « copyonwrite »

Afin de bien comprendre l’interêt de l’option « copyonwrite« , nous allons modifier les fichier « fic.txt » des deux montages :

root@debian:~# cat /export/disk*/fic.txt
disque 0...
disque 1...
root@debian:~# echo "fichier modifié depuis le client" > /export/disk0/fic.txt
root@debian:~# ^0^1
echo "fichier modifié depuis le client" > /export/disk1/fic.txt
root@debian:~# cat /export/disk*/fic.txt
fichier modifié depuis le client
fichier modifié depuis le client
root@debian:~# rm /export/disk*/test.txt
root@debian:~# ls /export/disk*
/export/disk0:
fic.txt
 
/export/disk1:
fic.txt

Sur le serveur vous constaterez l’apparition d’un fichier « hd1.img-192.168.215.129-5492.diff » au côté du fichier « hd1.img ». Ce fichier contient les différences entre le système d’origine et le système en cour de traitement.

Les systèmes de fichiers peuvent ensuite être démontés et les devices /dev/nbdX libérés :

root@debian:~# umount /export/disk*
root@debian:~# nbd-client -d /dev/nbd0
Disconnecting: que, disconnect, sock, done
root@debian:~# nbd-client -d /dev/nbd1
Disconnecting: que, disconnect, sock, done

Au remontage, vous pourrez constater les différences :

root@debian:~# nbd-client 192.168.215.1 5000 /dev/nbd0
Negotiation: ..size = 1024000KB
bs=1024, sz=1024000
root@debian:~# nbd-client 192.168.215.1 5001 /dev/nbd1
Negotiation: ..size = 1024000KB
bs=1024, sz=1024000
root@debian:~# mount /dev/nbd0 /export/disk0/
root@debian:~# mount /dev/nbd1 /export/disk1
root@debian:~# ls /export/disk*
/export/disk0:
fic.txt
 
/export/disk1:
fic.txt  test.txt
root@debian:~# cat /export/disk{0,1}/fic.txt
fichier modifié depuis le client
disque 1...

Toutes les modifications effectuées sur le périphérique de bloc « 1 » utilisant l’option « copyonwrite » ont été perdue dès la déconnexion tandis quelles sont définitives sur le périphérique « 0 » !

Référence

Man de nbd-server : http://linux.die.net/man/1/nbd-server
Man de nbd-server (fichier de configuration) : http://linux.die.net/man/5/nbd-server
Man de nbd-client : http://linux.die.net/man/8/nbd-client

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *