Archives pour la catégorie ‘ZFS’

MySQL : script de sauvegarde par snapshot ZFS

# cat mysql_backup.sh
#!/usr/bin/perl -w

my $host = 'localhost';
my $dbname = 'mysql';
my $user = 'backup';
my $passwd = 'WD8Y2YOraM';
my $pool = 'rpool/sql';
my $backupdir = '/home/backup/mysql';

### SCRIPT ###

use POSIX;
use DBI;

my $snapshot = strftime("%Y%m%d_%H%M%S", localtime);
print "Creating snapshot $snapshot...\n";

$dbh = DBI->connect("dbi:mysql:$dbname;host=$host", $user, $passwd)
   or die "Connection error: $DBI::errstr\n";

$dbh->do("SET SESSION AUTOCOMMIT=0");
$dbh->do("FLUSH TABLES WITH READ LOCK");
system("zfs snapshot -r $pool\@$snapshot");
$sth = $dbh->prepare("SHOW MASTER STATUS");
$sth->execute();
while ($row = $sth->fetchrow_hashref) {
 foreach $col (keys %{$row}) {
 print "$col: " . $$row{$col}."\n";
 }
}

$dbh->do("UNLOCK TABLES");

system("zfs send -vR $pool\@$snapshot | gzip > $backup_dir/$snapshot.gz");
system("zfs destroy -r $pool\@$snapshot");

print "Done.\n"

FreeBSD : clean install ZFS avec support des BE

Les environnements d’initialisation – Boot Environment (BE) – est une fonctionnalité backportée de Solaris et liée au portage de ZFS sur FreeBSD. Son intérêt est de créer différentes versions du filesystem racine afin de garantir un démarrage sûr du système suite à une opération de maintenance comme l’installation, la mise à jour ou tout simplement une reconfiguration. Elle s’appuie intégralement sur des snapshots ZFS.

Techniquement, le pool racine ZFS doit respecter une organisation du type : <nom du pool>/ROOT/<nom du BE>. Ainsi pour un pool nommé rpool et le BE default, le fileystem racine est rpool/ROOT/default. La gestion des BE est ensuite effectuée grâce à la commande beadm qui permet de les créer et de sélectionner le BE à utiliser au prochain démarrage.

Cet article vise à présenter l’installation et l’utilisation d’un système supportant les BE.

Installation du système

Toute la procédure s’effectue depuis le CD de FreeBSD en mode live.

# gpart create -s gpt ada0
# gpart add -b 34 -s 94 -t freebsd-boot ada0
# gpart add -s 4G -t freebsd-swap -l swap0 ada0
# gpart add -t freebsd-zfs -l disk0 ada0
# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada0
# gpart create -s gpt ada1
# gpart add -b 34 -s 94 -t freebsd-boot ada1
# gpart add -s 4G -t freebsd-swap -l swap1 ada1
# gpart add -t freebsd-zfs -l disk1 ada1
# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada1
# kldload geom_mirror.ko
# gmirror label -F -h -b round-robin swap /dev/gpt/swap0 /dev/gpt/swap1
# kldload opensolaris.ko
# kldload zfs.ko
# gnop create -S 4096 /dev/gpt/disk0
# gnop create -S 4096 /dev/gpt/disk1
# zpool create -o altroot=/mnt -o cachefile=/var/tmp/zpool.cache rpool mirror /dev/gpt/disk0.nop /dev/gpt/disk1.nop
# zpool export rpool
# gnop destroy /dev/gpt/disk0.nop
# gnop destroy /dev/gpt/disk1.nop
# zpool import -o altroot=/mnt -o cachefile=/var/tmp/zpool.cache rpool
# zfs set checksum=fletcher4 rpool
# zfs set atime=off rpool
# zfs create rpool/ROOT
# zfs create -o mountpoint=/ rpool/ROOT/default
# zfs set freebsd:boot-environment=1 rpool/ROOT/default
# zpool set bootfs=rpool/ROOT/default rpool
# zfs create -o mountpoint=/usr/local rpool/local
# zfs create -o mountpoint=/var rpool/var
# zfs create -o compression=lzjb -o exec=off -o setuid=off rpool/var/crash
# zfs create -o exec=off -o setuid=off rpool/var/db
# zfs create -o compression=lzjb -o exec=on -o setuid=off rpool/var/db/pkg
# zfs create -o exec=off -o setuid=off rpool/var/empty
# zfs create -o compression=lzjb -o exec=off -o setuid=off rpool/var/log
# zfs create -o compression=gzip -o exec=off -o setuid=off rpool/var/mail
# zfs create -o exec=off -o setuid=off rpool/var/run
# zfs create -o compression=lzjb -o exec=on -o setuid=off rpool/var/tmp
# zfs create -o mountpoint=/tmp -o compression=on -o exec=on -o setuid=off rpool/tmp
# zfs create -o mountpoint=/home rpool/home
# chmod 1777 /mnt/tmp
# chmod 1777 /mnt/var/tmp
# sh
# cd /usr/freebsd-dist
# export DESTDIR=/mnt
# for file in base.txz lib32.txz kernel.txz doc.txz;
> do (cat $file | tar --unlink -xpJf - -C ${DESTDIR:-/}); done
# zfs set readonly=on zroot/var/empty
# cp /var/tmp/zpool.cache /mnt/ROOT/default/boot/zfs/zpool.cache
# ee /mnt/etc/fstab
/dev/mirror/swap none swap sw 0 0
# ee /mnt/boot/loader.conf
geom_mirror_load="YES"
zfs_load="YES"
vfs.root.mountfrom="zfs:rpool/ROOT/default"
# ee /mnt/etc/rc.conf
hostname="freebsd9"
keymap="fr.iso.acc"
zfs_enable="YES"

network_interfaces="lo0 em0"
defaultrouter="192.168.0.1"
ipv6_defaultrouter="fdcb:9921:3552:afd7::1"
ifconfig_em0="inet 192.168.0.2 netmask 255.255.255.0 polling"
ifconfig_em0_ipv6="inet fdcb:9921:3552:afd7::2 prefixlen 64"

clear_tmp_enable="YES"
tcp_drop_synfin="YES"

moused_enable="NO"
sendmail_enable="NONE"
sshd_enable="YES"
syslogd_flags="-ss"
# ee /mnt/etc/resolv.conf
nameserver 192.168.0.254
search my.domain
# echo 'daily_status_gmirror_enable="YES"' >> /mnt/etc/periodic.conf
# echo 'daily_status_zfs_enable="YES"'' >> /mnt/etc/periodic.conf
# echo 'daily_status_smart_devices="/dev/ada0 /dev/ada1"' >> /mnt/etc/periodic.conf
# echo 'daily_status_mail_rejects_enable="NO"' >> /mnt/etc/periodic.conf
# echo 'daily_status_include_submit_mailq="NO"' >> /mnt/etc/periodic.conf
# echo 'daily_submit_queuerun="NO"' >> /mnt/etc/periodic.conf
# echo 'WRKDIRPREFIX=/usr/obj' >> /mnt/etc/make.conf
# chroot /mnt
# passwd
# tzsetup
# cd /etc/mail
# nano aliases
# make aliases
# exit
# zfs umount -a
# zfs set mountpoint=/rpool rpool
# zfs set mountpoint=/rpool/ROOT rpool/ROOT
# zfs set mountpoint=legacy rpool/ROOT/default
# shutdown -r now

Démarrage du système

# zfs list
NAME                 USED  AVAIL  REFER  MOUNTPOINT
rpool                687M  14.7G   152K  /rpool
rpool/ROOT           683M  14.7G   144K  /rpool/ROOT
rpool/ROOT/default   683M  14.7G   683M  legacy
rpool/home           144K  14.7G   144K  /home
rpool/local          144K  14.7G   144K  /usr/local
rpool/tmp            176K  14.7G   176K  /tmp
rpool/var           1.89M  14.7G   564K  /var
rpool/var/crash      148K  14.7G   148K  /var/crash
rpool/var/db         388K  14.7G   244K  /var/db
rpool/var/db/pkg     144K  14.7G   144K  /var/db/pkg
rpool/var/empty      144K  14.7G   144K  /var/empty
rpool/var/log        188K  14.7G   188K  /var/log
rpool/var/mail       144K  14.7G   144K  /var/mail
rpool/var/run        204K  14.7G   204K  /var/run
rpool/var/tmp        152K  14.7G   152K  /var/tmp
# zfs snapshot rpool/ROOT/default@clean

Création d’un nouvel environnement

On commence par installer la commande beadm :

# cd /usr/ports/sysutils/beadm
# make install

On peut dès lors vérifier que le BE default est bien détecté :

# beadm list
BE      Active Mountpoint  Space Created
default NR     /            1.8G 2012-10-08 04:33

La création d’un BE nécessite uniquement de spécifier son nom :

# beadm create upgrade
Created successfully
# beadm list
BE      Active Mountpoint  Space Created
default NR     /            1.8G 2012-04-19 15:05
upgrade -      -          136.0K 2012-10-08 06:25

Il est également possible de cloner un BE existant en spécifiant son nom.

Au niveau du pool ZFS, le BE se matérialise par un nouveau clone :

# zfs list
NAME                 USED  AVAIL  REFER  MOUNTPOINT
rpool               1.83G  13.6G   152K  /rpool
rpool/ROOT          1.68G  13.6G   144K  /rpool/ROOT
rpool/ROOT/default  1.68G  13.6G  1.68G  legacy
rpool/ROOT/upgrade   144K  13.6G  1.68G  legacy
rpool/home           144K  13.6G   144K  /home
rpool/local         4.14M  13.6G  4.14M  /usr/local
rpool/tmp            184K  13.6G   184K  /tmp
rpool/var            146M  13.6G   564K  /var
rpool/var/crash      148K  13.6G   148K  /var/crash
rpool/var/db         145M  13.6G   144M  /var/db
rpool/var/db/pkg     196K  13.6G   196K  /var/db/pkg
rpool/var/empty      144K  13.6G   144K  /var/empty
rpool/var/log        192K  13.6G   192K  /var/log
rpool/var/mail       144K  13.6G   144K  /var/mail
rpool/var/run        204K  13.6G   204K  /var/run
rpool/var/tmp        152K  13.6G   152K  /var/tmp

Reste enfin à activer ce BE et redémarrer le système :

# beadm activate upgrade
Activated successfully
# shutdown -r now

A présent, l’ensemble des opérations affecte le BE upgrade. En cas d’erreur, une réactivation du BE default permettra un redémarrage du système.

Solaris 11 : configuration du pool racine ZFS en miroir

Cette procédure détaille la configuration en miroir du pool racine ZFS d’une installation de Solaris 11 x86 et reproductible pour un Solaris 10. L’installation du système a été réalisée sur le premier disque dur c4t0d0. Voici  un mémo des commandes nécessaires.

root@solaris:~# cfgadm -s 'select=type(disk)'
Ap_Id                          Type         Receptacle   Occupant     Condition
sata7/0::dsk/c4t0d0            disk         connected    configured   ok
sata7/2::dsk/c4t2d0            disk         connected    configured   ok
root@solaris:~# fdisk -W -c c4t0d0p0

* /dev/rdsk/c4t0d0p0 default fdisk table
* Dimensions:
*    512 bytes/sector
*     63 sectors/track
*    255 tracks/cylinder
*   2088 cylinders
*

* Id    Act  Bhead  Bsect  Bcyl    Ehead  Esect  Ecyl    Rsect      Numsect
191   128  0      1      1       254    63     1023    16065      33527655
0     0    0      0      0       0      0      0       0          0
0     0    0      0      0       0      0      0       0          0
0     0    0      0      0       0      0      0       0          0
root@solaris:~# fdisk -B c4t2d0p0
root@solaris:~# fdisk -W - c4t2d0p0

* /dev/rdsk/c4t2d0p0 default fdisk table
* Dimensions:
*    512 bytes/sector
*     63 sectors/track
*    255 tracks/cylinder
*   2088 cylinders
*

* Id    Act  Bhead  Bsect  Bcyl    Ehead  Esect  Ecyl    Rsect      Numsect
191   128  0      1      1       254    63     1023    16065      33527655
0     0    0      0      0       0      0      0       0          0
0     0    0      0      0       0      0      0       0          0
0     0    0      0      0       0      0      0       0          0
root@solaris:~# prtvtoc /dev/rdsk/c4t0d0s0 | fmthard -s - /dev/rdsk/c4t2d0s0
root@solaris:~# format
Searching for disks...done

AVAILABLE DISK SELECTIONS:
0. c4t0d0 <ATA-VBOX HARDDISK-1.0 cyl 2085 alt 2 hd 255 sec 63>
/pci@0,0/pci8086,2829@d/disk@0,0
1. c4t2d0 <ATA-VBOX HARDDISK-1.0 cyl 2085 alt 2 hd 255 sec 63>
/pci@0,0/pci8086,2829@d/disk@2,0
Specify disk (enter its number): 0
selecting c4t0d0
[disk formatted]
/dev/dsk/c4t0d0s0 is part of active ZFS pool rpool. Please see zpool(1M).

format> verify

Primary label contents:

Volume name = <        >
ascii name  = <ATA-VBOX HARDDISK-1.0 cyl 2085 alt 2 hd 255 sec 63>
pcyl        = 2087
ncyl        = 2085
acyl        =    2
bcyl        =    0
nhead       =  255
nsect       =   63
Part      Tag    Flag     Cylinders        Size            Blocks
0       root    wm       1 - 2084       15.96GB    (2084/0/0) 33479460
1 unassigned    wm       0               0         (0/0/0)           0
2     backup    wu       0 - 2086       15.99GB    (2087/0/0) 33527655
3 unassigned    wm       0               0         (0/0/0)           0
4 unassigned    wm       0               0         (0/0/0)           0
5 unassigned    wm       0               0         (0/0/0)           0
6 unassigned    wm       0               0         (0/0/0)           0
7 unassigned    wm       0               0         (0/0/0)           0
8       boot    wu       0 -    0        7.84MB    (1/0/0)       16065
9 unassigned    wm       0               0         (0/0/0)           0

format> disk

selecting c4t2d0
[disk formatted]

format> verify

Primary label contents:

Volume name = <        >
ascii name  = <DEFAULT cyl 2085 alt 2 hd 255 sec 63>
pcyl        = 2087
ncyl        = 2085
acyl        =    2
bcyl        =    0
nhead       =  255
nsect       =   63
Part      Tag    Flag     Cylinders        Size            Blocks
0       root    wm       1 - 2084       15.96GB    (2084/0/0) 33479460
1 unassigned    wu       0               0         (0/0/0)           0
2     backup    wu       0 - 2086       15.99GB    (2087/0/0) 33527655
3 unassigned    wu       0               0         (0/0/0)           0
4 unassigned    wu       0               0         (0/0/0)           0
5 unassigned    wu       0               0         (0/0/0)           0
6 unassigned    wu       0               0         (0/0/0)           0
7 unassigned    wu       0               0         (0/0/0)           0
8       boot    wu       0 -    0        7.84MB    (1/0/0)       16065
9 unassigned    wu       0               0         (0/0/0)           0
root@solaris:~# zpool  status
pool: rpool
state: ONLINE
scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        rpool       ONLINE       0     0     0
          c4t0d0s0  ONLINE       0     0     0

errors: No known data errors
root@solaris:~# zpool attach -f rpool c4t0d0s0 c4t2d0s0
Make sure to wait until resilver is done before rebooting.
root@solaris:~# zpool status
pool: rpool
state: ONLINE
status: One or more devices is currently being resilvered.  The pool will
continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
scan: resilver in progress since Mon Oct  1 23:30:04 2012
921M scanned out of 5.90G at 19.6M/s, 0h4m to go
921M resilvered, 15.23% done
config:

        NAME          STATE     READ WRITE CKSUM
        rpool         ONLINE       0     0     0
          mirror-0    ONLINE       0     0     0
            c4t0d0s0  ONLINE       0     0     0
            c4t2d0s0  ONLINE       0     0     0  (resilvering)

errors: No known data errors
root@solaris:~# installgrub /boot/grub/stage1 /boot/grub/stage2 /dev/rdsk/c4t2d0s0
stage2 written to partition 0, 282 sectors starting at 50 (abs 16115)
stage1 written to partition 0 sector 0 (abs 16065)

FreeBSD : cloner un serveur en live grâce à ZFS

Cet article vise à présenter un des grand intérêts de l’utilisation de ZFS : permettre le clonage d’un serveur complet, live, à distance et de façon transparente. Le serveur cloné utilise donc un pool ZFS racine (bootable) qui sera répliqué sur un second serveur.

Le clonage proprement dit s’effectue par la création d’un snapshot ZFS, un instantané non modifiable d’un système de fichiers. La création d’un snapshot est instantanée et n’entraîne aucune charge. On parle de mécanisme copy-on-write : c’est au moment de la modification des données que la copie des fichiers est effectuée pour conserver la différence entre l’état actuel et celui de l’instantané. Il est donc important de supprimer au plus tôt un snapshot lorsqu’il n’est plus nécessaire.

Le snapshot généré est ensuite copié par le réseau – de préférence par SSH – sur le serveur cible. Ce dernier doit posséder un pool ZFS avec suffisament d’espace disque pour pouvoir y copier les données. Deux conséquences :

  • la configuration du pool sur le serveur cible peut être différente : le nombre de disques durs, le type de RAID, les propriétés du pool, etc…
  • l’espace disque total du pool peut être différent, au sens supérieur mais aussi inférieur, à celui du pool source, vu que c’est l’espace utilisé des données qui est pris en compte.

Bref, avec ZFS, plus aucun autre logiciel ne vous sera nécessaire pour faire vos backups systèmes.

Voici donc la procédure pour cloner un système live en ZFS.

Initalisation du serveur cible

Le démarrage du serveur cible s’effectue sur une image mfsBSD (image live minimale d’un système FreeBSD avec support ZFS). Vous pouvez également utiliser un DVD de FreeBSD en mode fixit.

On configure le réseau :

target# ifconfig em0 inet 192.168.0.101 netmask 255.255.255.0

On partitionne les disques internes (ici je fais un miroir / RAID1) :

target# gpart -s gpt ada0
target# gpart create -s gpt ada0
target# gpart -add -b 34 -s 94 -t freebsd-boot ada0
target# gpart add -b 34 -s 94 -t freebsd-boot ada0
target# gpart add -t freebsd-zfs -l disk0 ada0
target# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada0
target# gpart create -s gpt ada1
target# gpart -b 34 -s 94 -t freebsd-boot ada1
target# gpart create -b 34 -s 94 -t freebsd-boot ada1
target# gpart add -b 34 -s 94 -t freebsd-boot ada1
target# gpart add -t freebsd-zfs -l disk1 ada1
target# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada1

Et on crée le pool ZFS en veillant à bien spécifier un répertoire de montage alternatif, tout en la marquant comme bootable :

target# zpool create -o altroot=mnt -o cachefile=/var/tmp/zpool.cache zroot mirror /dev/gpt/disk0 /dev/gpt/disk1
target# zpool set bootfs=zroot zroot
target# zpool list
NAME    SIZE  ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT
zroot  7.81G   120K  7.81G     0%  1.00x  ONLINE  /mnt
target# zfs list
NAME    USED  AVAIL  REFER  MOUNTPOINT
zroot   102K  7.69G    31K  /mnt

Lancement du clonage

Sur le serveur à cloner, un snapshot ZFS complet est créé par emploi du mode récursif :

server# zfs snapshot -r zroot@clone

Le snapshot complet provoque la création d’un snapshot de tous les filesystems ZFS :

freebsd9# zfs list -t snapshot
NAME                              USED  AVAIL  REFER  MOUNTPOINT
zroot@clone                          0      -   344M  -
zroot/tmp@clone                      0      -    35K  -
zroot/usr@clone                      0      -   308M  -
zroot/usr/home@clone                 0      -    31K  -
zroot/usr/ports@clone                0      -    33K  -
zroot/usr/ports/distfiles@clone      0      -    31K  -
zroot/usr/ports/packages@clone       0      -    31K  -
zroot/usr/src@clone                  0      -    31K  -
zroot/var@clone                      0      -   154K  -
zroot/var/crash@clone                0      -  31.5K  -
zroot/var/db@clone                 29K      -  96.5K  -
zroot/var/db/pkg@clone               0      -    31K  -
zroot/var/empty@clone                0      -    31K  -
zroot/var/log@clone                21K      -    48K  -
zroot/var/mail@clone                 0      -    31K  -
zroot/var/run@clone              20.5K      -  43.5K  -
zroot/var/tmp@clone                  0      -    32K  -

On lance une copie à destination du serveur cible :

server# zfs send -R zroot@clone | ssh root@target zfs recv -Fdv zroot
receiving full stream of zroot@clone into zroot@clone

Une fois la copie terminée, le snapshot peut être détruit sur les 2 serveurs :

server# zfs destroy -R zroot@clone
target# zfs detroy -R zroot@clone

Vérification faite le pool est bien identique au serveur cloné :

target# zfs list
NAME                        USED  AVAIL  REFER  MOUNTPOINT
zroot                       653M  7.05G   344M  /
zroot/tmp                    35K  7.05G    35K  /tmp
zroot/usr                   308M  7.05G   308M  /usr
zroot/usr/home               31K  7.05G    31K  /usr/home
zroot/usr/ports              95K  7.05G    33K  /usr/ports
zroot/usr/ports/distfiles    31K  7.05G    31K  /usr/ports/distfiles
zroot/usr/ports/packages     31K  7.05G    31K  /usr/ports/packages
zroot/usr/src                31K  7.05G    31K  /usr/src
zroot/var                   568K  7.05G   154K  /var
zroot/var/crash            31.5K  7.05G  31.5K  /var/crash
zroot/var/db                156K  7.05G  96.5K  /var/db
zroot/var/db/pkg             31K  7.05G    31K  /var/db/pkg
zroot/var/empty              31K  7.05G    31K  /var/empty
zroot/var/log                69K  7.05G    48K  /var/log
zroot/var/mail               31K  7.05G    31K  /var/mail
zroot/var/run                64K  7.05G  43.5K  /var/run
zroot/var/tmp                32K  7.05G    32K  /var/tmp

Finalisation de la configuration

Sur le serveur distant, il reste à créer le volume pour la swap (il n’y a pas de partition dédiée à la swap), stocker le cache du pool ZFS (il faut écraser celui qui a été copié vu qu’il est différent) et enfin modifier la configuration réseau pour éviter le pépin :

target# zfs create -V 256m zroot/swap
target# zfs export zroot
target# zfs import zroot -o altroot=/mnt -o cachefile=/var/tmp/zpool.cache zroot
target# cp /var/tmp/zpool.cache /mnt/boot/zfs/zpool.cache
target# ee /mnt/etc/rc.conf

On peut ensuite rebooter le serveur sur une copie système parfaite du serveur source.

FreeBSD : clean install avec pool ZFS racine

Un petit mémo sur une installation clean de FreeBSD 9 avec :

  • partitionnement GPT (boot loader ZFS, swap & pool ZFS)
  • pool ZFS racine en miroir, avec alignement pour secteurs disque de 4k
  • miroir GEOM pour le swap
  • configuration LAN dualstack IPv4 et IPv6

Toute la procédure s’effectue depuis le CD de FreeBSD en mode live.

Partitionnement des disques

# gpart create -s gpt ada0
# gpart add -b 34 -s 94 -t freebsd-boot ada0
# gpart add -s 4G -t freebsd-swap -l swap0 ada0
# gpart add -t freebsd-zfs -l disk0 ada0
# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada0
# gpart create -s gpt ada1
# gpart add -b 34 -s 94 -t freebsd-boot ada1
# gpart add -s 4G -t freebsd-swap -l swap1 ada1
# gpart add -t freebsd-zfs -l disk1 ada1
# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada1

Création du miroir GEOM pour la swap

# kldload geom_mirror.ko
# gmirror label -F -h -b round-robin swap /dev/gpt/swap0 /dev/gpt/swap1

Création du pool ZFS racine

# kldload opensolaris.ko
# kldload zfs.ko
# gnop create -S 4096 /dev/gpt/disk0
# gnop create -S 4096 /dev/gpt/disk1
# zpool create -o altroot=/mnt -o cachefile=/var/tmp/zpool.cache zroot mirror /dev/gpt/disk0.nop /dev/gpt/disk1.nop
# zpool export zroot
# gnop destroy /dev/gpt/disk0.nop
# gnop destroy /dev/gpt/disk1.nop
# zpool import -o altroot=/mnt -o cachefile=/var/tmp/zpool.cache zroot
# zpool set bootfs=zroot zroot
# zfs set checksum=fletcher4 zroot
# zfs set atime=off zroot
# zfs create zroot/usr
# zfs create zroot/usr/home
# zfs create zroot/var
# zfs create -o compression=on -o exec=on -o setuid=off zroot/tmp
# zfs create -o compression=lzjb -o setuid=off zroot/usr/ports
# zfs create -o compression=off -o exec=off -o setuid=off zroot/usr/ports/distfiles
# zfs create -o compression=off -o exec=off -o setuid=off zroot/usr/ports/packages
# zfs create -o compression=lzjb -o exec=off -o setuid=off zroot/usr/src
# zfs create -o compression=lzjb -o exec=off -o setuid=off zroot/var/crash
# zfs create -o exec=off -o setuid=off zroot/var/db
# zfs create -o compression=lzjb -o exec=on -o setuid=off zroot/var/db/pkg
# zfs create -o exec=off -o setuid=off zroot/var/empty
# zfs create -o compression=lzjb -o exec=off -o setuid=off zroot/var/log
# zfs create -o compression=gzip -o exec=off -o setuid=off zroot/var/mail
# zfs create -o exec=off -o setuid=off zroot/var/run
# zfs create -o compression=lzjb -o exec=on -o setuid=off zroot/var/tmp
# chmod 1777 /mnt/tmp
# chmod 1777 /mnt/var/tmp
# cd /mnt; ln -s usr/home home

Installation du système

# sh
# cd /usr/freebsd-dist
# export DESTDIR=/mnt
# for file in base.txz lib32.txz kernel.txz doc.txz;
> do (cat $file | tar --unlink -xpJf - -C ${DESTDIR:-/}); done

Configuration

# zfs set readonly=on zroot/var/empty
# cp /var/tmp/zpool.cache /mnt/boot/zfs/zpool.cache
# ee /mnt/etc/fstab
/dev/mirror/swap none swap sw 0 0
# ee /mnt/boot/loader.conf
geom_mirror_load="YES"
zfs_load="YES"
vfs.root.mountfrom="zfs:zroot"
# ee /mnt/etc/rc.conf
hostname="freebsd9"
keymap="fr.iso.acc"
zfs_enable="YES"

network_interfaces="lo0 em0"
defaultrouter="192.168.0.1"
ipv6_defaultrouter="fdcb:9921:3552:afd7::1"
ifconfig_em0="inet 192.168.0.2 netmask 255.255.255.0 polling"
ifconfig_em0_ipv6="inet fdcb:9921:3552:afd7::2 prefixlen 64"

clear_tmp_enable="YES"
tcp_drop_synfin="YES"

moused_enable="NO"
sendmail_enable="NONE"
sshd_enable="YES"
syslogd_flags="-ss"
# ee /mnt/etc/resolv.conf
nameserver 192.168.0.254
search my.domain
# echo 'daily_status_gmirror_enable="YES"' >> /mnt/etc/periodic.conf
# echo 'daily_status_zfs_enable="YES"'' >> /mnt/etc/periodic.conf
# echo 'daily_status_smart_devices="/dev/ada0 /dev/ada1"' >> /mnt/etc/periodic.conf
# echo 'daily_status_mail_rejects_enable="NO"' >> /mnt/etc/periodic.conf
# echo 'daily_status_include_submit_mailq="NO"' >> /mnt/etc/periodic.conf
# echo 'daily_submit_queuerun="NO"' >> /mnt/etc/periodic.conf]
# echo 'WRKDIRPREFIX=/usr/obj' >> /mnt/etc/make.conf
# chroot /mnt
# passwd
# tzsetup
# gpart status
# zpool status
# gmirror status
# exit
# shutdown -r now

L’installation étant terminée, on peut de suite effectuer un snapshot ZFS du pool :

# zfs snapshot -r zroot@default

Annexe : création d’un volume ZFS pour la swap

Au lieu d’une partition dédiée, la swap peut être stockée par un volume dans le pool ZFS. Le système d’exploitation ne pourra toutefois pas y stocker les coredumps.

# zfs create -V 4G zroot/swap
# zfs set org.freebsd:swap=on zroot/swap
# zfs set checksum=off zroot/swap
Haut de page