-->

Vous êtes ici : accueil » article » FreeBSD 9.2 en Full ZFS sur un Kimsufi PS 4G

FreeBSD 9.2 en Full ZFS sur un Kimsufi PS 4G

Rédigé par Gérald Niel - - 8 commentaires

FreeBSD Beatsie

Beatsie - FreeBSD

Je suis en train de remonter un serveur pour remplacer mon vieux Kimsufi qui me rend de bons et loyaux services depuis plus de cinq ans avec un FreeBSD 7.4 mais qui commence à me couter un peu par rapport à cette nouvelle gamme.
Comme on dit, c'est l'occasion qui fait le larron, alors j'ai décidé d'installer FreeBSD 9.2 dessus sur un système de fichier ZFS.

Par contre partir tête baissée en recopiant les différentes doc qu'on peut trouver en faisant une recherche sur les mots-clé FreeBSD, Kimsufi et ZFS sans vraiment comprendre est une erreur !
Je me suis arraché les cheveux pendant quelques jours… Avant enfin de me décider à lire les page de man de zpool(8) et zfs.

Maintenant, entrons dans le vif du sujet…

Installation de FreeBSD 9.2 en Full ZFS sur un Kimsuif PS 4G

Sources d'inspiration

Comme je le disais, j'ai commencé par rechercher un peu sur le net et suis tombé sur plusieurs documents sur lesquels je me suis appuyé :

Et j'ai fini par tomber sur cet article grâce auquel j'ai enfin compris ce qui n'allait pas, zpool sous FreeBSD 9.2 ayant visiblement un comportement différent des versions antérieures :
zpool(8) sets wrong mountpoint when using altroot.

1. Préambule

  1. En premier lieu, il faut évidement installer FreeBSD 9.2 depuis le manager OVH.
  2. Récupérer le contenu de rc.conf qui sera utile plus tard.
  3. Mettre le boot en rescue-pro depuis le manager.
  4. Redémarrer le serveur (depuis la session ssh).

2. Préparation du disque

On va créer trois partitions, une de boot, une de swap, et une pour les données et le système. C'est celle-ci contiendra le pool ZFS.

On commence par initialiser le disque (point de non retour !) :

rescue-bsd# dd if=/dev/zero of=/dev/ada0 bs=512 count=10
> 10+0 records in
> 10+0 records out
> 5120 bytes transferred in 0.001184 secs (4324373 bytes/sec)

On crée maintenant les partitions :

rescue-bsd# gpart create -s gpt ada0
> ada0 created
rescue-bsd# gpart add -s 64K -t freebsd-boot ada0
> ada0p1 added
rescue-bsd# gpart add -s 4G -t freebsd-swap -l swap ada0
> ada0p2 added
rescue-bsd# gpart add -t freebsd-zfs -l data ada0
> ada0p3 added
rescue-bsd# glabel label swap ada0p2
rescue-bsd# glabel label data ada0p3

On installe le chargeur de démarrage qui sait gérer ZFS :

rescue-bsd# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada0
> bootcode written to ada0

On crée maintenant le pool ZFS, qu'on va temporairement monter dans /mnt en indiquant le point de montage définitif :

rescue-bsd# zpool create -f -R /mnt -m / zroot /dev/gpt/data
rescue-bsd# zpool list
> NAME    SIZE  ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT
> zroot   920G   148K   920G     0%  1.00x  ONLINE  /mnt
rescue-bsd# zpool set bootfs=zroot zroot
rescue-bsd# zfs set checksum=fletcher4 zroot

Et maintenant on s'occupe du système de fichier. J'avais prévu une partition pour les jails, mais comme ezjail le gère je ne m'en suis pas occupé pour l'instant. Pour le reste c'est largement inspiré de ce document.

rescue-bsd# zfs create zroot/usr
rescue-bsd# zfs create zroot/usr/home
rescue-bsd# zfs create zroot/var
rescue-bsd# zfs create -o compression=on -o exec=on -o setuid=off zroot/tmp
rescue-bsd# zfs create -o compression=lz4 -o setuid=off zroot/usr/ports
rescue-bsd# zfs create -o compression=off -o exec=off -o setuid=off zroot/usr/ports/distfiles
rescue-bsd# zfs create -o compression=off -o exec=off -o setuid=off zroot/usr/ports/packages
rescue-bsd# zfs create -o compression=lz4 -o exec=off -o setuid=off zroot/usr/src
rescue-bsd# zfs create -o compression=lz4 -o exec=off -o setuid=off zroot/var/crash
rescue-bsd# zfs create -o exec=off -o setuid=off zroot/var/db
rescue-bsd# zfs create -o compression=lz4 -o exec=on -o setuid=off zroot/var/db/pkg
rescue-bsd# zfs create -o exec=off -o setuid=off zroot/var/empty
rescue-bsd# zfs create -o compression=lz4 -o exec=off -o setuid=off zroot/var/log
rescue-bsd# zfs create -o exec=off -o setuid=off zroot/var/run
rescue-bsd# zfs create -o compression=lz4 -o exec=on -o setuid=off zroot/var/tmp
rescue-bsd# zfs list
> NAME                        USED  AVAIL  REFER  MOUNTPOINT
> zroot                       780K   906G    34K  /mnt
> zroot/tmp                    31K   906G    31K  /mnt/tmp
> zroot/usr                   191K   906G    34K  /mnt/usr
> zroot/usr/home               31K   906G    31K  /mnt/usr/home
> zroot/usr/ports              95K   906G    33K  /mnt/usr/ports
> zroot/usr/ports/distfiles    31K   906G    31K  /mnt/usr/ports/distfiles
> zroot/usr/ports/packages     31K   906G    31K  /mnt/usr/ports/packages
> zroot/usr/src                31K   906G    31K  /mnt/usr/src
> zroot/var                   256K   906G    38K  /mnt/var
> zroot/var/crash              31K   906G    31K  /mnt/var/crash
> zroot/var/db                 63K   906G    32K  /mnt/var/db
> zroot/var/db/pkg             31K   906G    31K  /mnt/var/db/pkg
> zroot/var/empty              31K   906G    31K  /mnt/var/empty
> zroot/var/log                31K   906G    31K  /mnt/var/log
> zroot/var/run                31K   906G    31K  /mnt/var/run
> zroot/var/tmp                31K   906G    31K  /mnt/var/tmp

On ajuste quelques permissions pour les répertoires temporaires et on crée le lien symbolique vers /home.

rescue-bsd# chmod 1777 /mnt/tmp
rescue-bsd# chmod 1777 /mnt/var/tmp
rescue-bsd# cd /mnt ; ln -s usr/home home ; cd

3. Installation de FreeBSD

Comme on est sur un système en lecture seule, on crée un espace temporaire pour télécharger le système.

rescue-bsd# mkdir /root/sets
rescue-bsd# mount -t tmpfs -o size=300000000 dummy /root/sets
rescue-bsd# cd /root/sets

On télécharge le système depuis le FTP de FreeBSD.

rescue-bsd# ftp ftp.freebsd.org
> Trying 193.162.146.4:21 ...
> Connected to ftp.beastie.tdk.net.
> 220 beastie.tdk.net FTP server (Version 6.00LS) ready.
> Name (ftp.freebsd.org:root): anonymous
> 331 Guest login ok, send your email address as password.
> Password: adresse@mail.tld
> 230 Guest login ok, access restrictions apply.
> Remote system type is UNIX.
> Using binary mode to transfer files.
> ftp> cd /pub/FreeBSD/releases/amd64/amd64/9.2-RELEASE
> 250 CWD command successful.
> ftp> get base.txz
> local: base.txz remote: base.txz
[...]
> ftp> get kernel.txz
> local: kernel.txz remote: kernel.txz
[...]
> 226 Transfer complete.
> 83735660 bytes received in 00:55 (1.43 MiB/s)
> ftp> ^D
> 221 Goodbye.
[Edit 02/12/2013]
Voici une autre méthode pour télécharger le système sans avoir à ouvrir une sessions FTP.
rescue-bsd# fetch ftp://ftp.fr.freebsd.org/pub/FreeBSD/releases/amd64/amd64/9.2-RELEASE/kernel.txz
rescue-bsd# fetch ftp://ftp.fr.freebsd.org/pub/FreeBSD/releases/amd64/amd64/9.2-RELEASE/base.txz

Ensuite on décompresse les fichier dans le nouvel environnement.

rescue-bsd# cat base.txz | tar --unlink -xpJf - -C /mnt
rescue-bsd# cat kernel.txz | tar --unlink -xpJf - -C /mnt

4. Configuration de FreeBSD

On se "chroote" dans le nouvel environnement :

rescue-bsd# chroot /mnt

On s'occupe de rc.conf en récupérant le contenu de celui qu'on a gardé de la première installation, surtout sans oublier de rajouter zfs_enable="YES", pour le mien, ça donne ça. Les ipv4 et ipv6 sont bien entendu celles de mon Kimsufi.

/etc/rc.conf
sshd_enable="YES"
ntpdate_enable="YES"
ntpdate_hosts="213.186.33.99"
fsck_y_enable="YES"
named_enable="YES"
# Set dumpdev to "AUTO" to enable crash dumps, "NO" to disable
dumpdev="NO"

ifconfig_re0="inet 91.121.172.159 netmask 255.255.255.0 broadcast 91.121.172.255"
defaultrouter="91.121.172.254"

# IPv6 configuration
ipv6_enable="YES"
ipv6_network_interfaces="re0"
ifconfig_re0_ipv6="inet6 2001:41D0:1:ED9f::1 prefixlen 128"
ipv6_static_routes="ovhgw"
ipv6_route_ovhgw="2001:41D0:1:EDff:ff:ff:ff:ff -prefixlen 128 -interface re0"
ipv6_defaultrouter="2001:41D0:1:EDff:ff:ff:ff:ff"
hostname="asterix.gegeweb.org"

zfs_enable="YES"

syslogd_flags="-ss"

Ensuite on s'occupe de loader.conf

root@rescue-bsd:/ # echo 'zfs_load="YES"' > /boot/loader.conf
root@rescue-bsd:/ # echo 'vfs.root.mountfrom="zfs:zroot"' >> /boot/loader.conf

… et de fstab

root@rescue-bsd:/ # echo /dev/label/swap none swap sw 0 0 > /etc/fstab

On configure le mot de passe du super utilisateur root.

root@rescue-bsd:/ # passwd
> Changing local password for root
> New Password: your password
> Retype New Password: your password

On crée un utilisateur qu'on ajoute au groupe wheel pour éviter de devoir autoriser root à se connecter en ssh.

root@rescue-bsd:/ # adduser
> Username: userlogin
> Full name: User Name
> Uid (Leave empty for default): 
> Login group [userlogin]: 
> Login group is userlogin. Invite userlogin into other groups? []: wheel
> Login class [default]: 
> Shell (sh csh tcsh nologin) [sh]: 
> Home directory [/home/userlogin]: 
> Home directory permissions (Leave empty for default): 
> Use password-based authentication? [yes]: 
> Use an empty password? (yes/no) [no]: 
> Use a random password? (yes/no) [no]: 
> Enter password: 
> Enter password again: 
> Lock out the account after creation? [no]: 
> Username   : userlogin
> Password   : *****
> Full Name  : User Name
> Uid        : 1001
> Class      : 
> Groups     : userlogin wheel
> Home       : /home/userlogin
> Home Mode  : 
> Shell      : /bin/sh
> Locked     : no
> OK? (yes/no): yes
> adduser: INFO: Successfully added (userlogin) to the user database.
> Add another user? (yes/no): no
> Goodbye!

Et éventuellement, on installe sa clef publique.

root@rescue-bsd:/ # su - userlogin
$ mkdir .ssh
$ chmod 700 .ssh/
$ ee .ssh/authorized_keys2
$ chmod 600 .ssh/authorized_keys2
$ exit
root@rescue-bsd:/ # exit
> exit

ZFS aurait besoin d'un cache pour démarrer correctement. La première foi que ça a marché j'avais oublié, et ça a démarré quand même.
Bon, dans le doute, je l'ai malgré tout configuré.

rescue-bsd# zpool set cachefile=/mnt/boot/zfs/zpool.cache zroot

Maintenant il n'y a plus qu'à reconfigurer le démarrage sur le disque dur dans le manager, on croise les doigts (mais normalement ça devrait marcher) et on redémarre.

rescue-bsd# reboot

Et si quelque chose ne se passait pas comme prévu ou qu'il faille redémarrer en rescue après une fausse manip, pour monter le pool dans /mnt on utilise la commande suivante.

rescue-bsd# zpool import -R /mnt zroot

Et voilà ! HTH comme on dit.
Et n'hésitez pas à commenter au besoin pour apporter des précisions ou corrections.

8 commentaires

#1 patpro a dit :

" qu'on va temporairement monter dans /tmp " <-- dans /mnt plutôt non ?

#2 Gérald Niel a dit :

@patpro :
En effet ! Je corrige, merci !

#3 Louis Henry a dit :

Merci, mille fois pour votre billet, super clair, net et concis.

Cordialement,

LH.

#4 bastien a dit :

Bonjour,

Je me suis permis de référencer votre documentation, plus récente, sur mon billet (que vous citez, c'était pour une version 9.1, à l'époque !).

Bonne continuation,
Bastien.

#5 Gérald Niel a dit :

@bastien : Merci pour le lien en retour.
Ayant déménagé le site, l'url a changé. J'ai placé une redirection, ça devrait normalement être transparent.
Et pour info, la méthode fonctionne aussi pour la version 10 de FreeBSD.

#6 xico a dit :

Il manque un / entre .org et article30 dans la redirection.

#7 Gérald Niel a dit :

@xico : Merci, je corrige…

#8 GreenBlood a dit :

Merci pour ce tuto, clairement, je galérais tellement avant.

Écrire un commentaire

Quelle est la dernière lettre du mot fucu ? :