FreeBSD 9.2 en Full ZFS sur un Kimsufi PS 4G
Rédigé par Gérald Niel - - 8 commentaires
Beatsie - FreeBSD
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é :
- Installation d'une kimsufi sous FreeBSD en full-ZFS
- Installation de FreeBSD 9.1 avec ZFS sur un serveur distant
- Installation minimal d’un Kimsufi sous FreeBSD 9.1 en full ZFS
- Installation of a FreeBSD 9.2 system with ZFS-on-root over GELI
- Installing FreeBSD Root on ZFS using GPT
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
- En premier lieu, il faut évidement installer FreeBSD 9.2 depuis le manager OVH.
- Récupérer le contenu de rc.conf qui sera utile plus tard.
- Mettre le boot en rescue-pro depuis le manager.
- 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