FreeBSD

15932715140470376031
Installation d'un serveur FreeBSD en tirant parti du système de fichiers ZFS pour gérer efficacement l'espace disque, avoir un archivage bon marché (via les snapshots) et la possibilité d'effectuer des rollback en cas de problèmes. Le processus de mise à jour sera également détaillé.
Decouvrez Alux-Studio et ces magnifiques photograhies:

Périphériques et partitions

Périphériques disques

Les contrôleurs RAID matériels ont quelques inconvénients lorsqu'ils sont utilisés avec ZFS. ZFS dans une configuration de type raidz est capable de détecter plus d'erreurs et de mieux gérer la situation qu'un RAID matériel. Il va donc être nécessaire d'accéder à chaque disque individuellement pour pouvoir pleinement tirer parti de ZFS, cependant généralement le RAID matériel:

  • ne permet pas un accès direct au disque, il est donc nécessaire de créer un volume RAID contenant un seul disque
  • quand le dernier disque est retiré d'un volume RAID, le volume est détruit

Ceci conduit à une situation où il est quasi impossible de s'assurer que la numérotation des périphériques va rester la même à travers des modifications, ajouts ou suppressions de disques; ce type d'opération étant courant quand un disque tombe en panne. Cette difficulté de représenter logiquement les périphériques disques, rend propices aux erreurs conduisant à un mauvais redémarrage du système, celui-ci n'arrivant pas à retrouver les bons disques et partitions. Ce problème de numérotation des périphériques existe aussi avec USB, où la numérotation est faite en fonction des numéros déjà attribués.

La solution est de ne pas s'appuyer sur la numérotation automatique du système d'exploitation pour les périphérique disques, mais d'utiliser explicitement des labels pour identifier les disques.

Les labels seront systématiquement utilisés, y compris pour un système de fichiers comme ZFS.

Il y a plusieurs façons de créer un label, via la table de partition GPT, le système de fichiers (UFS, MSDOS, ...) ou l'instrastructure GEOM:

gpart modify -i index -l label device     # GUID partition table (GPT)
tunefs -L label device                    # UFS filesystem
glabel label -v label device              # GEOM infrastructure

La liste des labels et de leur numéro de périphérique associé s'obtient pour tous les labels créés (GPT, UFS, GEOM, ...) avec la commande:

glabel status

Partitions

Les partitions utilisant un MBR ne permettent pas d'obtenir des tailles supérieures à 2TB. Pour retirer cette limitation, une GUID Partition Table (GPT) doit être utilisée pour les grands disques.

Les disques seront systématiquement partitionés en utilisant GPT, avec éventuellement une exception pour le disque servant au boot car l'installation de FreeBSD 8 peut être un peu plus complexe. A partir de FreeBSD 9, la procédure d'installaton est capable de créer ce type de partition.

Pour créer une unique partition (de type GPT) utilisant tout le disque sur le périphérique da1:

gpart create -s GPT         da1                        # Creation d'une table des partitions GUID (GPT)
gpart add    -t freebsd-ufs da1                        # Ajout une nouvelle partition pour un système de fichier UFS
gpart show                  da1                        # Affichage des partitions

Pour créer un disque bootable, sur le périphérique ad1, ayant une partition ZFS et un partitionnement de type GPT:

gpart create   -s GPT                         da1      # Creation d'une table des partitions GUID (GPT)
gpart add      -b 40   -s 984 -t freebsd-boot da1      # Creation d'une partition pour le bootloader
gpart add      -b 1024 -s 5g  -t freebsd-zfs  da1      # Creation d'une partition pour ZFS
gpart bootcode -b /boot/pmbr                  da1      # Protection du MBR
gpart bootcode -p /boot/gptzfsboot -i 1       da1      # Installation du boot loader

Les types de partitions qui sont courament utilisés:

TypeDescription
freebsd-bootBootloader
freebsd-swapSwap
freebsd-ufsSystème de fichiers UFS
freebsd-zfsPool ZFS

RAID

Il existe plusieurs possibilités pour aggréger des diques et augmenter la tolérance aux pannes: le RAID matériel (cartes PERC, ...), le pseudo RAID (Intel MatrixRAID, Promise FastTrak, ...) et le RAID logiciel (Vinum, ZFS).

Une présentation rapide des différentes approches est abordée ci-dessous:

PERC 5/6 (SATA/SAS)
Il sagit des contrôleurs RAID matériel, du constructeur LSI, installés sur les serveurs DELL. Le RAID matériel offre de bonnes performances et ne sollicite pas de ressources du système mais ils sont onéreux et propriétaires. Les commandes FreeBSD natives mfiutil et mptutil remplacent avantageusement l'utilitaire MegaCLI fourni par LSI, cet utilitaire était très mal documenté et nécessitait une compatibilité Linux.
Ataraid
C'est le driver FreeBSD pour la gestion du pseudo RAID disponible sur les machines pourvues de Intel MatrixRAID ou JMicron, par exemple. Le pseudo RAID permet de résoudre le problème du démarrage du système d'exploitation à partir d'un RAID logiciel, il a pour avantage son faible coût mais garde l'aspect propriétaire (impossibilité de changer de contrôleur sans perdre le volume RAID) et les inconvénients du RAID logiciel (utilisation plus ou moins intensive des ressources du système).
Vinum
Vinum est le RAID logiciel historique de FreeBSD inspiré du gestionnaire de volume de Veritas™. Il supporte les configurations RAID-0, RAID-1 et RAID-5 et a l'avantage d'être indépendant du matériel.
ZFS
C'est la combinaison d'un système de fichiers et d'un gestionnaire de volume, il intègre donc les fonctionnalités d'un RAID logiciel, ainsi que d'autres plus avancées telles que la déduplication, la vérification de l'intégrité des données, les snapshots, ... C'est cette approche qui sera privilégiée dans ce document.

Système de fichiers

Agencement

L'agencement qui va être déployé fera un usage intensif de ZFS pour hiérarchiser les systèmes de fichiers et répertoires, ce qui facilitera par la suite les sauvegardes, les snapshots et les retours en arrière (ie: rollback), d'autant plus que ZFS permet de faire cela de façon récursive.

La hierarchie est divisée en quatre catégories principales:

basele système de base constituant FreeBSD
pkgles applications installées depuis le mécanisme de packages ou de ports
distribles sources de FreeBSD (système de base et mécanisme des ports)
servicesles données sauvegardées par les différents services
S'il est choisi de faire une installation du système de base (et de la partition racine) sur ZFS, il faudra alors suivre la procédure décrite sur FreeBSD Root on ZFS - GPT ZFS boot. En effet, le CD d'installation ne pouvant pour l'instant déployer FreeBSD que sur UFS.

La hiérarchie ZFS suivante est donc proposée, et peut être adaptée en fonction du type d'installation souhaitée: système de base sur ZFS, services (ldap, mysql, imap, ...) installés. Il est possible de faire un découpage plus léger ou au contraire plus poussé, dans tous les cas, il restera relativement facile par la suite de modifier cette hiérarchie, à l'exception toutefois d'une partie des systèmes de fichiers présents sur des points de montage du système de base (ie: /, /usr, /var, ...).

Nom Point de montage Opt Description
B
a
s
e
system/base legacy: / Racine du système d'exploitation
system/base/tmp /tmp Répertoire pour fichiers temporaires
system/base/usr /usr Applications du système de base
system/base/var /var Fichiers dont le contenu est modifié (log, lock, spoool, mail, ...)
system/base/var/spool /var/spool Zone tampon pour le traitement des tâches
system/base/var/tmp /var/tmp Répertoire pour fichiers temporaires
system/base/var/empty /var/empty Répertoire vide
system/base/var/log /var/log Journaux du système
system/base/var/db /var/db Bases de données des applications (dhcp, ntpd, entropy, ...)
P
k
g
system/pkg /usr/local Packages installés
system/pkg/db /var/db/pkg Information sur les packages installés
system/pkg/ports /var/db/ports Information sur les options choisies pour l'installation des packages
D
i
s
t
r
i
b
system/distrib aucun Données pour la compilation/installation de FreeBSD et de ses packages
system/distrib/src /usr/src Sources de la distribution de base de FreeBSD
system/distrib/ports /usr/ports Sources et infrastructure nécessaire pour la compilation des packages
system/distrib/distfiles /usr/ports/distfiles Stockage des tarballs contenant les sources des applications
system/distrib/obj /usr/obj Données intermédiaires de la compilation de la distribution
S
e
r
v
i
c
e
s
system/services aucun Données sauvegardées par les différents services (ie: ldap, mysql, ...)
system/services/ldap /var/db/openldap-data Données pour LDAP
system/services/mysql /var/db/mysql Données pour MySQL
system/services/ftp /var/ftp Données pour FTP
system/services/imap /var/imap Données pour la gestion interne de Cyrus IMAP
system/services/imap/mbox /var/spool/imap Boîte aux lettres des utilisateurs
system/services/imap/meta /var/spool/imap-meta Métadonnées des boîtes aux lettres
system/services/imap/sieve /var/spool/sieve Règles de filtrage, des mails, gérées Cyrus IMAP
Création du pool ZFS
zpool create system vdev -o mountpoint=none
Création des systèmes de fichiers pour les packages de FreeBSD
zfs create  -o mountpoint=/usr/local                               system/pkg
zfs create  -o mountpoint=/var/db/pkg           -o compress=gzip   system/pkg/db 
zfs create  -o mountpoint=/var/db/ports         -o compress=gzip   system/pkg/ports
Création des systèmes de fichiers pour la distribution FreeBSD
zfs create                                      -o sync=disabled   system/distrib
zfs create  -o mountpoint=/usr/src              -o compress=gzip   system/distrib/src 
zfs create  -o mountpoint=/usr/ports            -o compress=gzip   system/distrib/ports 
zfs create  -o mountpoint=/usr/ports/distfiles                     system/distrib/distfiles
zfs create  -o mountpoint=/usr/obj                                 system/distrib/obj 

Boot

Loader

Le fichier /boot/loader.conf est automatiquement lu et interprété au démarrage par le boot loader, il contient les instructions pour le chargement des modules et les options de configuration à passer au noyau.

Impossible de trouver la partition root

Si la partition root (ie: /) n'est pas trouvée durant la phase de boot, FreeBSD va demander cette information. Malheureusement, le clavier USB n'est pas forcément opérationnel à ce moment, la solution consiste à indiquer manuellement la partition depuis le boot loader (quand le BIOS gère encore le clavier):

set vfs.root.mountfrom=????     # exemples:  zfs:freebsd/base  /  ufs:ad8s1a

Configuration du système (rc.conf)

La configuration du système est faite dans le fichier /etc/rc.conf et surcharge les valeurs par défauts définies dans /etc/defaults/rc.conf.

Ci-dessous se trouvent quelques valeurs raisonnables pour:

  • configurer le clavier et la souris
  • éviter la mise en veille de l'écran, afin de voir les informations affichées en cas de kernel-panic
  • vérifier l'état des disques
  • activer les dumps en cas de crash
  • effacer les répertoires temporaires (ie: /tmp/, ...) au reboot
  • forcer fsck à fonctionner sans intervention
  • empêcher syslog d'écouter sur le réseau
# Keyboard / Mouse / Screen
#---------------------------
keymap="fr.iso.acc"                     # Clavier francais
moused_flags="-3"                       # Emulation du 3eme bouton
saver="NO"                              # Pas d'economiseur d'ecran
blanktime="NO"                          # N'eteind jamais l'ecran

# Auto-diagnostic
#-----------------                 
smartd_enable="YES"                     # Verifie la sante du disque dur
dumpdev="AUTO"                          # Sauvegarde d'un dump en cas de panic

# Misc
#------
clear_tmp_enable="YES"                  # Efface /tmp au demarrage
fsck_y_enable="YES"                     # Repond 'yes' aux question de fsck
syslogd_flags="-s -s"                   # Pas de reseau pour syslog

Tuning

ZFS

Depuis la version 7.2 de FreeBSD, pour avoir un fonctionnement correct du système, il n'est plus nécessaire d'effectuer des ajustements sur les architectures amd64 disposant d'au moins 2Go de mémoire. Il est raisonnable de penser qu'actuellement ces critères sont atteints lors de l'installation de serveurs.

Boot

Le processus de boot peut être personnalisé dans le fichier /boot/loader.conf.

Par exemple, afin d'afficher un joli menu montrant beastie, le logo de FreeBSD:

# Menu de boot
loader_logo="beastie"

Périphériques réseaux

Pour les interfaces réseaux subissant un trafic important, il est conseillé d'activer un fonctionnement en polling plutôt que d'utiliser les interruptions, ceci diminuera le surcoût des commutations de contexte et les possibilités d'interblocages actifs (ie: livelocks).

Le noyau a besoin d'être compilé avec les options suivantes (la valeur recommandée pour HZ est de 1000):

options         DEVICE_POLLING          # Device polling support
options         HZ=1000                 # Granularity of clock interupts

L'activation du mode polling, pour les cartes réseaux le supportant, se fait en utilisant la commande ifconfig:

ifconfig device polling

Services

Man pages: rc (8), rc.conf (5)

L'ensemble des services peuvent être démarrés ou stoppés si nécessaire. Ceci est géré par les scripts présents dans les répertoires /etc/rc.d/ et /usr/local/etc/rc.d/.

Quelques exemples d'invocation du script (autres actions possible: start, stop, restart, reload, status, poll):

# Depend de la configuration presente dans rc.conf (necessite: service_enabled="YES")
/etc/rc.d/service start        # Start service
/etc/rc.d/service stop         # Stop  service

# Execute l'action du service (independamment de la configuration rc.conf)
/etc/rc.d/service onestart     # Start service
/etc/rc.d/service onesstop     # Stop  service

Débogage

DTrace

DTrace est un environnement dynamique de suivi permettant le diagnostic du noyau et des applications en cas de problème et ce sur un système en production et en temps réel. Cet outil a été importé du système d'exploitation Solaris et n'est pour l'instant fonctionnel dans FreeBSD que pour le noyau.

Le noyau a besoin d'être compilé avec les options suivantes afin de supporter les points d'entrées de DTrace et d'embarquer le Compact C Type Format nécessaire:

options KDTRACE_HOOKS        # all architectures - enable general DTrace hooks
options KDTRACE_FRAME        # amd64-only
makeoptions WITH_CTF=yes     # embed Compact C Type code
options DDB_CTF              # all architectures - kernel ELF linker loads CTF data
L'embarquement de CTF dans le code s'effectue en activant la variable WITH_CTF, toutefois:
  • FreeBSD 8: Cette variable n'est pas prise en compte dans les fichiers /etc/src.conf ou /etc/make.conf, la méthode de compilation à utiliser alors est: make kernel KERNCONF=YOUR_KERNEL WITH_CTF=1
  • FreeBSD 9: Cette variable peut être définie dans les fichiers /etc/src.conf ou /etc/make.conf cependant, cela peut produire quelques effets de bord. La méthode conseillée est celle décrite précédemment et utilisant makeoptions WITH_CTF=yes dans le fichier de configuration du noyau.

Mise à jour

Seul le processus de mise à jour à partir du code source sera détaillé ici. Pour une mise à jour binaire, les outils à utiliser sont freebsd-update pour la distribution de base et portupgrade -PP -a pour les packages.

Accelération de la compilation

Il est possible d'accélérer la phase de compilation en mettant en place une ou plusieurs des stratégies suivantes:

  • utilisation d'un système de fichiers en mémoire
  • mise en cache des fichiers issues du préprocesseur
  • distribution de la compilation sur d'autres machines

Système de fichiers en mémoire

Si vous disposez de suffisamment de RAM, il est possible de réduire le temps de mise à jour en optant pour un système de fichiers en mémoire plutôt que sur disque pour les différentes étapes de compilation. La taille mémoire à allouer dépend bien sûr des ressources disponibles et de ce qui sera mis à jour (système, ports).

mdmfs -M -S -o async -s 4g md1 /mnt    # Création et montage du système de fichiers (4Go)
export MAKEOBJDIRPREFIX=/mnt           # Emplacement pour la compilation du système
export WRKDIRPREFIX=/mnt               # Emplacement pour la compilation des ports
export CCACHE_DIR=/mnt/.ccache         # Si utilisation de ccache pour la compilation des ports
export DISTCC_DIR=/mnt/.distcc         # Si utilisation de distcc pour la compilation des ports
mkdir -p ${CCACHE_DIR} ${DISTCC_DIR}   # Garantit l'existence des répertoires utilisés par ccache/distcc
# make                                 # Compilation
umount /mnt                            # Démontage du système de fichiers
mdconfig -d -u 1                       # Récuperation de la mémoire allouée

Utilisation de ccache et distcc

Man pages: ccache (1), distcc (1)

Ces programmes sont présentés ensemble car ils peuvent s'utiliser conjointement moyennant quelques précautions d'utilisation qui seront brièvement évoquées. Un script pour la commande make permettant une utilisation correcte de ces programmes est disponible au téléchargement: bsd.quickbuild.mk.

La compilation et l'installation s'effectue au moyen de:

Pour ccache:
cd /usr/ports/devel/ccache && make install
Pour distcc:
cd /usr/ports/devel/distcc && make install
  [ ] GNOME           Build GUI monitor based on GNOME
  [ ] GTK             Build GUI monitor based on GTK
  [X] RFC2553         Enable IPv6 support
  [ ] AVAHI           Enable Avahi Zeroconf/mDNS/Bonjour support
  [X] COMPILER_LINKS  Create symlinks to distcc

Pour les machines participant à la compilation distribuée, il faut activer le daemon distccd. Cette étape n'est pas nécessaire pour la machine démarrant la compilation, puisqu'elle sera référée avec le mot clef spécial localhost. La configuration s'effectue dans le fichier /etc/rc.conf:

distccd_enable="YES"
distccd_flags="--listen 192.168.1.5 --allow 192.168.1.0/24 --user distcc --daemon -P /var/run/distccd.pid"

Voici les invocations possibles pour les programmes ccache et distcc et leur combinaison lors de l'utilisation du compilateur cc:

ProgrammeType d'utilisation
ccachedistccligne de commandemodification du chemin
ccache cc /usr/local/libexec/ccache
distcc cc /usr/local/libexec/distcc
env CCACHE_PREFIX=distcc ccache cc impossible

Dans le cas de la modification du chemin, celui-ci doit paraître en premier dans la variable PATH afin que les wrappers correspondants soient appelés. Ce changement du PATH permet ainsi d'éviter la modification des scripts. Toutefois, les compilateurs doivent pour cela être appelés sans avoir un chemin de spécifié et l'utilisation conjointe de ccache et distcc n'est alors pas possible.

Le fichier de configuration /etc/make.conf est modifié pour inclure le script /usr/local/etc/bsd.quickbuild.mk. Celui-ci s'occupe alors de mettre en place la bonne ligne de commande pour l'invocation des compilateurs. Certains ports vont avoir des problèmes de compilation, essentiellement dus à distcc utilisé avec libtool. Les variables WITHOUT_CCACHE_PORTS et WITHOUT_DISTCC_PORTS permettent d'exclure les ports qui ont pu être identifiés comme problématiques.

WITHOUT_DISTCC_PORTS=www/libwww
.sinclude "/usr/local/etc/bsd.quickbuild.mk"

Il est alors possible de lancer la compilation en activant les différentes accelérations avec USE_CCACHE et USE_DISTCC; soit celles-ci sont placées dans le fichier /etc/make.conf soit passées en arguments à make:

export DISTCC_HOSTS="--randomize localhost 192.168.1.10/2 192.168.2.25/4,lzo"
make -DUSE_DISTCC -DUSE_CCACHE
La variable DISTCC_HOSTS doit être une variable d'environnement. Il est possible toutefois d'utiliser à la place le fichier $DISTCC_DIR/hosts, mais attention à la valeur de DISTCC_DIR en particulier si celle-ci a été redéfinie.

Les principaux arguments et options servant à définir la liste des machines à contacter pour distribuer la compilation sont décrits ci-dessous:

ArgumentDescription
--randomize Utilise les machines listées dans un ordre aléatoire
MachineDescription
localhost Mot clef permettant d'utiliser directement la machine locale
ip Adresse IP à contacter
hostname Machine à contacter après résolution de nom
OptionDescription
,lzo Mise en place d'une compression, particulièrement utile si le réseau est lent
/limit Limite le nombre de connexions afin d'éviter de surcharger la machine
:port Numéro de port à utiliser si celui-ci n'est pas standard

Distribution de base

Man pages: src.conf (5)
Si des méthodes d'optimisations ou d'accélaration de la compilation sont mises en place, il faut s'assurer qu'au final se sont bien GCC ou Clang qui vont compiler le noyau (kernel) et le monde (world). Car il s'agit des deux seuls compilateurs officielement supportés.

Le fichier /etc/src.conf permet de contrôler les éléments à inclure ou exclure de la distribution de base. Celui-ci va servir à supprimer des outils ou le support matériel pour des éléments obsolètes ou non communément utilisés (vérifiez que le fichier proposé est cohérent avec vos besoins):

# Suppression des differents firewalls inutilises: ipfilter, ipfw
#  => Le choix du firewall se portant sur: pf
WITHOUT_IPFILTER=yes
WITHOUT_IPFW=yes

# Suppression des protocoles: atm, ipx
WITHOUT_ATM=yes
WITHOUT_IPX=yes

# Suppression de la compatibilite windows pour les drivers
WITHOUT_NDIS=yes

# Suppression du support pour du materiel obsolete (disquette)
WITHOUT_FLOPPY=yes
WITHOUT_APM=yes

# Suppression d'application obsoletes au profit d'autres en provenance
#   du systeme de ports: lpr => cups, nis => ldap, cvs => subversion
WITHOUT_CTM=yes
WITHOUT_LPR=yes
WITHOUT_NIS=yes
WITHOUT_CVS=yes
WITHOUT_RCS=yes

La procédure standard est décrite ci-dessous, mais n'oubliez pas de jeter un œil à /usr/src/UPDATING:

cd /usr/src                                  # Change to source directory
make buildworld                              # Build toolchain and base distribution 
make kernel KERNCONF=YOUR_KERNEL             # Build and install kernel

<reboot in single user>
mergemaster -p                               # Apply pre-build configuration changes
make installworld                            # Install base distribution
make delete-old                              # Delete obsolete programs
mergemaster -i -F                            # Apply configuration changes
<reboot>

Points importants:

  • Mise à jour de la configuration sendmail (si sendmail est utilisé): cd /etc/mail && make && make install
  • Afin de s'assurer que les applications utilisent la dernière API, on peut souhaiter reconstruire tous les packages

Ports et packages

Man pages: make.conf (5)

Premièrement, vous avez besoin de récupérer les sources nécessaires en fonction de votre version de FreeBSD. Ceci s'effectue au moyen de la commande svn (ou svnlite):

svn co http://svn.freebsd.org/ports             /usr/ports/
svn co http://svn.freebsd.org/base/releng/10.0  /usr/src/

Pour faire la mise à jour des packages, il est nécessaire de mettre à jour les ports, construire l'index, récupérer les sources de toutes les applications (cette étape permet de s'assurer qu'il n'y aura pas de problèmes à cause d'un code source manquant en plein milieu du processus), lire les instructions de mise à jour, créer une snapshot (afin de pouvoir revenir en arrière si quelque chose se passe mal) et finalement, faire la mise à jour:

svn update /usr/ports/                # Mise a jour des ports
portsdb -uU                           # Construction de l'index
portupgrade -a -F                     # Verification de la disponibilite des sources
pkg updating | less                   # Lecture de la fiche concernant les problemes potentiels
zfs snapshot -r system/pkg@tag        # Creation recursive d'une snapshot zfs (tag: date +%Y%m%d)
portupgrade -a                        # Realisation de la mise a jour

Si, pour une raison quelconque, la mise à jour n'était pas fonctionnelle, il est possible de revenir en arrière (grâce la snapshot zfs) vers un précédant état stable. Néanmoins, certaines applications une fois exécutées peuvent également avoir mis à jour leurs données dans un format incompatible avec les précédentes versions (par exemple: mysql_upgrade):

zfs rollback -r system/pkg@tag        # Retour en arriere en cas de problemes

Nettoyage

Après plusieurs mises à jour, il est possible que de petits bugs dans la définition des ports aient conduit à l'existence de fichiers résiduels. De plus, lors de l'utilisation de portupgrade, les librairies partagées ne sont pas supprimées mais déplacées dans /usr/local/lib/compat/pkg/.

Soyez attentif lors de la suppression de fichiers, vous devez être sûr qu'ils ne sont pas utilisés. N'ayez donc pas une confiance aveugle dans la liste retournée par:

  • Recherche des librairies non utilisées:
    libchk		# installation depuis: /usr/ports/sysutils/libchk
    
  • Recherche des fichiers orphelins:
    find /usr/local/ -type f -exec sh -c ' pkg which -q "$0" > /dev/null || echo "$0" ' {} \;
    

Sauvegarde / Restauration

Procédures de sauvegarde et restauration des deux principaux systèmes de fichiers UFS et ZFS:

UFS ZFS
Variables
timestamp=`date +%Y-%m-%d`
dumpfile=/data/archive/dump-${timestamp}
src=/
src=main
Snapshot
cd ${src} && mksnap_ffs .snap/${timestamp}
zfs snapshot -r ${src}@${timestamp}
Sauvegarde
dump -0 -a -f ${dumpfile} ${src}/.snap/${timestamp}
zfs send -R ${src}@${timestamp} > ${dumpfile}
Création
newfs -n /dev/da0s1a
mount /dev/da0s1a ${src}
zpool create ${src} /dev/da0 ...
Restauration
cd ${src} && restore rf ${dumpfile}
zfs recv -F -d ${src} < ${dumpfile}
Lors de la phase de création et de restauration, il peut être nécessaire de choisir temporairement un autre nom pour la partition où le pool restauré afin qu'il n'y ai pas de conflit avec le système en cours d'exécution. C'est typiquement le cas de /, par exemple.

Vérification

État des disques

A l'aide de l'outil smartmontools, il est possible de vérifier périodiquement l'état des disques en interrogeant pour cela le contrôleur SATA ou SCSI et en leur demandant d'effectuer une vérification de bas niveau.

L'installation et la configuration s'effectue comme suit pour vérifier le disque /dev/ada0 à l'aide d'un test court tous les jours vers 2AM et d'un test long tous les samedi vers 4AM.

cd /usr/ports/sysutils/smartmontools/ && make install
/dev/ada0 -a -H -s (S/../.././02|L/../../6/04) -m root@example.com
smartd_enable="YES"                     # Verifie la sante du disque dur

La commande smartctl peut être utilisée pour avoir un résultat immédiat:

OptionDescription
-t shorteffectue un test court (environ quelques minutes)
-t longeffectue un test long (environ une heure)
-aaffiche toutes les informations, y compris le résultat ou l'état des tests en cours
-Xinterruption du test
Selon le micro-code présent sur les disques durs, effectuer une requête pour suivre la progression du test peut interrompre celui-ci. Il est toutefois possible de vérifier au préalable le comportement du disque au moyen de la commande:
smartctl -c /dev/ada0
et de vérifier les capacités suivantes:
MessageArrêt du test
Abort Offline collection upon new commandOui
Suspend Offline collection upon new commandNon