werk.feub.net

Icon

Mémo de Fabien Amann à propos de Mac, Fedora et caetera

freebsd : mount_nullfs

Sous GNU/Linux, j’utilisais assez les mount --bind pour monter un système de fichiers à un autre endroit de l’arborescence. Ceci étant une spécificité Linux, il n’existe pas sous FreeBSD. Mais il y a nullfs qui fait à peu près la même chose. Voici comment utiliser mount_nullfs pour – par exemple – monter une sous-arborescence music sous le home de toto :

# mkdir /usr/home/toto/music
# mount_nullfs /dataraid/zfsdata/music /usr/home/toto/music

L’arborescence /dataraid/zfsdata/music est désormais aliasée et ainsi disponible dans le home de toto. La grosse différence entre ceci et un lien symbolique est que le chemin de cette nouvelle arborescence est réellement vu à l’endroit indiqué /usr/home/toto/music. Ainsi :

# cd /usr/home/toto/music/
# realpath .
/usr/home/alex/music
# stat .
134283012 107 drwxr-xr-x 342 fabien wheel 0 345 "Dec 22 03:01:29 2009" "Dec 19 17:00:43 2009" "Dec 19 17:00:43 2009" "Dec  9 20:32:31 2009" 4096 27 0 .

Le realpath retourne bien notre système de fichiers et non celui d’origine sous /dataraid/zfsdata/music. stat quant à lui nous indique qu’il s’agit bien d’un répertoire et non d’un lien symbolique.

Pour faire ce montage (en lecture-écriture) automatiquement au démarrage dans le fstab, ajouter cette ligne :

/dataraid/zfsdata/music    /usr/home/toto/music nullfs  rw      0       0

freebsd : découverte de ZFS

Ce tutoriel explique comment ajouter un système de fichiers ZFS sous FreeBSD 8.0. Pour ce faire, deux disques SATA de 500Go vont être ajoutés pour fonctionner en mirroring (RAID 1).

Les manipulations suivantes ont été l’occasion pour moi de découvrir ZFS et je dois avouer que la simplicité de mise en œuvre est étonnante. Une seule ligne de commandes pour créer un volume RAID 1 exploitable. On est loin des longues suites de commandes sous GNU/Linux pour avoir un équivalent – par équivalent, j’entends ce que j’avais sous Fedora, du LVM2 formaté en ext3 sur un RAID 1 logiciel (mdadm).

Principes généraux

L’architecture de ZFS repose sur 3 niveaux : un ou des système(s) de fichiers sont contenus dans un pool qui lui-même est fait de device(s). Et ceci s’administre avec seulement deux commandes : zpool et zfs.

Mise en œuvre

Deux disques de 500Go sont donc ajoutés à la machine. Un dmesg montre qu’ils sont reconnus comme ad4 et ad6 :

# dmesg
ad4: 476940MB <WDC WD5000AAKS-65A7B0 01.03B01> at ata2-master SATA150
ad6: 476940MB <Seagate ST3500830AS 3.AFD> at ata3-master SATA150

On peut donc créer le pool ZFS – que je nommerai dataraid – comme ceci :

# zpool create dataraid raidz ad4 ad6

Et voilà. C’est fini :> Sérieusement, on peut s’arrêter là, le volume /dataraid monté à la racine est disponible et parfaitement exploitable. Voyons un peu son état avec l’option list de zpool qui permet de lister les pools :

# zpool list
NAME       SIZE   USED  AVAIL    CAP  HEALTH  ALTROOT
dataraid   931G   159K   931G     0%  ONLINE  -

C’est plutôt lisible. dataraid d’une taille de 931Go (capacité totale des devices et non pas capacité utile), utilisé pour 159Ko (il est encore vide), il reste donc 931Go et le pool est en ligne.
Un df confirme qu’il est monté :

# df -h
Filesystem               Size    Used   Avail Capacity  Mounted on
/dev/ad0s1a              496M    174M    282M    38%    /
/dev/ad0s1e              496M     16K    456M     0%    /tmp
/dev/ad0s1f               71G    7.4G     57G    11%    /usr
/dev/ad0s1d              1.4G    204M    1.1G    15%    /var
dataraid                 458G      0B    458G     0%    /dataraid

Pour plus d’informations :

# zpool status dataraid
  pool: dataraid
 state: ONLINE
 scrub: none requested
config:
 
	NAME        STATE     READ WRITE CKSUM
	dataraid    ONLINE       0     0     0
	  raidz1    ONLINE       0     0     0
	    ad4     ONLINE       0     0     0
	    ad6     ONLINE       0     0     0
 
errors: No known data errors

Encore des informations bien utiles. Le nom du pool, son statut en ligne. scrub indique la dernière vérification de l’état du pool qui se fait à chaque écriture/modification. Et on voit la hiérarchie de notre pile ZFS, le pool dataraid, en RAID constitué de 2 disques physiques. La dernière ligne renvoie les erreurs s’il y a lieu.

Essayons de passer ce pool en mode dégradé en débranchant un disque SATA à chaud tant qu’il n’y a pas trop de données dessus. Le système chez moi ne bronche pas. Normal. Lorsque c’est fait, on revoit le statut du pool :

# zpool status dataraid
  pool: dataraid
 state: DEGRADED
status: One or more devices could not be used because the label is missing or
	invalid.  Sufficient replicas exist for the pool to continue
	functioning in a degraded state.
action: Replace the device using 'zpool replace'.
   see: http://www.sun.com/msg/ZFS-8000-4J
 scrub: scrub in progress for 0h0m, 29.73% done, 0h0m to go
config:
 
	NAME        STATE     READ WRITE CKSUM
	dataraid    DEGRADED     0     0     0
	  raidz1    DEGRADED     0     0     0
	    ad4     ONLINE       0     0     0
	    ad6     UNAVAIL      3   212     0  experienced I/O failures
 
errors: No known data errors

Le statut est passé en mode dégradé, il nous indique qu’un disque est manquant (I/O failures). J’arrête la machine, je remets le disque :

$ sudo zpool status
  pool: dataraid
 state: ONLINE
 scrub: none requested
config:
 
	NAME        STATE     READ WRITE CKSUM
	dataraid    ONLINE       0     0     0
	  raidz1    ONLINE       0     0     0
	    ad4     ONLINE       0     0     0
	    ad6     ONLINE       0     0     0
 
errors: No known data errors

C’est reparti.
Le pool est en place, il faut maintenant le remplir avec un ou des systèmes de fichiers. Ceci s’opère avec la simple commande zfs. Dans l’exemple suivant, un système de fichiers zfsdata sera ajouté dans notre pool, on vérifiera sa disponibilité par un df :

# zfs create dataraid/zfsdata
# df -h
Filesystem               Size    Used   Avail Capacity  Mounted on
/dev/ad0s1a              496M    174M    282M    38%    /
devfs                    1.0K    1.0K      0B   100%    /dev
/dev/ad0s1e              496M     16K    456M     0%    /tmp
/dev/ad0s1f               71G    7.4G     57G    11%    /usr
/dev/ad0s1d              1.4G    204M    1.1G    15%    /var
dataraid                 458G    128K    458G     0%    /dataraid
devfs                    1.0K    1.0K      0B   100%    /var/named/dev
dataraid/backup          458G    128K    458G     0%    /dataraid/backup
dataraid/zfsdata         458G    128K    458G     0%    /dataraid/zfsdata

Voilà, par ce simple zfs create on a un système de fichiers exploitable. Celui-ci pourrait être supprimé avec zfs destroy dataraid/zfsdata. Cette commande zfs permet beaucoup plus, notament d’avoir des informations – très – détaillées sur le système de fichiers, grâce à zfs get all :

# zfs get all dataraid/zfsdata
NAME              PROPERTY              VALUE                  SOURCE
dataraid/zfsdata  type                  filesystem             -
dataraid/zfsdata  creation              Wed Dec  9 19:48 2009  -
dataraid/zfsdata  used                  18K                    -
dataraid/zfsdata  available             458G                   -
dataraid/zfsdata  referenced            18K                    -
dataraid/zfsdata  compressratio         1.00x                  -
dataraid/zfsdata  mounted               yes                    -
dataraid/zfsdata  quota                 none                   default
dataraid/zfsdata  reservation           none                   default
dataraid/zfsdata  recordsize            128K                   default
dataraid/zfsdata  mountpoint            /dataraid/zfsdata      default
dataraid/zfsdata  sharenfs              off                    default
dataraid/zfsdata  checksum              on                     default
dataraid/zfsdata  compression           off                    default
dataraid/zfsdata  atime                 on                     default
dataraid/zfsdata  devices               on                     default
dataraid/zfsdata  exec                  on                     default
dataraid/zfsdata  setuid                on                     default
dataraid/zfsdata  readonly              off                    default
dataraid/zfsdata  jailed                off                    default
dataraid/zfsdata  snapdir               hidden                 default
dataraid/zfsdata  aclmode               groupmask              default
dataraid/zfsdata  aclinherit            restricted             default
dataraid/zfsdata  canmount              on                     default
dataraid/zfsdata  shareiscsi            off                    default
dataraid/zfsdata  xattr                 off                    temporary
dataraid/zfsdata  copies                1                      default
dataraid/zfsdata  version               3                      -
dataraid/zfsdata  utf8only              off                    -
dataraid/zfsdata  normalization         none                   -
dataraid/zfsdata  casesensitivity       sensitive              -
dataraid/zfsdata  vscan                 off                    default
dataraid/zfsdata  nbmand                off                    default
dataraid/zfsdata  sharesmb              off                    default
dataraid/zfsdata  refquota              none                   default
dataraid/zfsdata  refreservation        none                   default
dataraid/zfsdata  primarycache          all                    default
dataraid/zfsdata  secondarycache        all                    default
dataraid/zfsdata  usedbysnapshots       0                      -
dataraid/zfsdata  usedbydataset         18K                    -
dataraid/zfsdata  usedbychildren        0                      -
dataraid/zfsdata  usedbyrefreservation  0                      -

Le détail de toutes ces informations peut être consulté à cette adresse chez Sun. A noter que les propriétés avec un tiret dans la colonne SOURCE, indiquent que celles-ci sont en lecture uniquement, alors que les autres peuvent être modifiées. Il y a trois types de SOURCE :

  • default – la valeur ZFS par défaut
  • local – la propriété a été modifiée localement pour ce système de fichiers
  • inherited – la propriété est héritée d’un système de fichiers parent

Conclusion

Voilà une introduction à ZFS qui permet tout de même de commencer à le découvrir et l’exploiter rapidement. Une documentation complète peut être consultée ou téléchargée sur le site de Sun.


Sources :