Ce document présente une méthode alternative à celle de JC Michot 1) pour installer FreeBSD 6.1 sur une Dédibox. La méthode doit être relativement simplement transposable pour une autre version de FreeBSD et sur une autre plateforme que Dédibox mais le procédé décrit ici a été réalisé à partir de la version 6.1 et pour une Dédibox.
Pourquoi une méthode alternative ?
Tout d’abord, pour maitriser la source, la provenance et le contenu de ce que l’on installe. Pour éviter tout risque de stress inutile, je dois dire que je n’ai absolument rien contre JC Michot que je ne connais pas, je tenais simplement à pouvoir installer FreeBSD et quelques applications depuis la source officielle, en comprenant ce que je fais et en choisissant ce que j’installe. Ce document est donc une procédure qui permet, pas à pas, à qui le souhaite, de batir son propre système FreeBSD, il ne remplace ni ne concurrence en aucun cas la méthode ultra-rapide proposée actuellement.
La seconde raison qui m’a poussé à effectuer ce travail est l’absence de mode rescue pour FreeBSD sur la Dédibox. La méthode présentée ici inclut l’installation d’un pseudo mode rescue qui permet de ne pas se retrouver dehors lors d’un manipulation maladroite sur les règles du pare-feu, d’une mise à jour du système qui échoue ou d’un système de fichiers qui nécessite réparation.
La construction du système est basée sur les principes suivants :
La construction du système nécessite les éléments suivants :
Nous commençons par créer un fichier de 2Go environ (1Go pour la slice rescue et 1Go pour la slice d’exploitation) :
# dd if=/dev/zero of=freebsdedibox.img bs=512 count=4194304
Nous créons maintenant le périphérique md0 sur lequel nous allons réaliser les installations :
# mdconfig -a -t vnode -f freebsdedibox.img -u 0
L’objet de cette étape est de définir, pour le pseudo-disque md0, une table des slices reprenant les caractéristiques du disque de la dédibox. Le fdisk du mode rescue Linux nous indique le découpage suivant : 19457 cylindres, 255 têtes et 63 secteurs par piste.
D’autre part, nous souhaitons affecter 1Go pour la slice du mode rescue FreeBSD, le reste de l’espace disponible à la slice d’exploitation et enfin rendre la seconde partition active par défaut.
Pour cela, nous créons le petit fichier de paramètres slicetable.tmp suivant :
# Geometry g c19457 h255 s63 # Rescue Slice p 1 165 63 2072322 # Normal Slice p 2 165 2072385 310472190 # Normal Slice activation by default a 2
et nous créons la table des slices à l’aide de la commande fdisk :
# fdisk -iv -f slicetable.tmp /dev/md0 ******* Working on device /dev/md0 ******* fdisk: invalid fdisk partition table found fdisk: WARNING line 2: number of cylinders (19457) may be out-of-range (must be within 1-1024 for normal BIOS operation, unless the entire disk is dedicated to FreeBSD)
Nous pouvons maintenant vérifier que nos 2 slices ont bien été créé :
# ls /dev/md0* /dev/md0 /dev/md0s1 /dev/md0s2
et que notre table des slices est correcte :
# fdisk /dev/md0 ******* Working on device /dev/md0 ******* parameters extracted from in-core disklabel are: cylinders=261 heads=255 sectors/track=63 (16065 blks/cyl) parameters to be used for BIOS calculations are: cylinders=261 heads=255 sectors/track=63 (16065 blks/cyl) Media sector size is 512 Warning: BIOS sector numbering starts with sector 1 Information from DOS bootblock is: The data for partition 1 is: sysid 165 (0xa5),(FreeBSD/NetBSD/386BSD) start 63, size 2072322 (1011 Meg), flag 0 beg: cyl 0/ head 1/ sector 1; end: cyl 128/ head 254/ sector 63 The data for partition 2 is: sysid 165 (0xa5),(FreeBSD/NetBSD/386BSD) start 2072385, size 310472190 (151597 Meg), flag 80 (active) beg: cyl 129/ head 0/ sector 1; end: cyl 1022/ head 254/ sector 63 The data for partition 3 is: <UNUSED> The data for partition 4 is: <UNUSED>
Nous commençons par installer un label BSD avec un bootstrap :
# bsdlabel -w -B /dev/md0s1
puis, nous créons le fichier de label labelrescue.tmp définissant une partition unique (/) occupant la totalité de la slice md0s1 :
#--------------------------------BSDLABEL-----------------------------# 8 partitions: # size offset fstype [fsize bsize bps/cpg] # ==== ====== ====== ===================== a: * 0 4.2BSD c: * * unused 0 0 #---------------------------------------------------------------------#
et nous appliquons le label ainsi défini :
# bsdlabel -R /dev/md0s1 labelrescue.tmp
Une petite vérification en passant :
# ls /dev/md0s1* /dev/md0s1 /dev/md0s1a /dev/md0s1c
Nous pouvons maintenant créer le système de fichiers racine du mode rescue :
# newfs -U /dev/md0s1a /dev/md0s1a: 1011.9MB (2072304 sectors) block size 16384, fragment size 2048 using 6 cylinder groups of 183.77MB, 11761 blks, 23552 inodes. with soft updates super-block backups (for fsck -b #) at: 160, 376512, 752864, 1129216, 1505568, 1881920
et le monter afin de pouvoir installer FreeBSD dessus :
# mount /dev/md0s1a /mnt
La commande df nous permet de vérifier que nous disposons bien d’environ 1Go d’espace libre sur la partition racine de la slice rescue :
# df -h | grep md0 /dev/md0s1a 977M 4.0K 899M 0% /mnt
Plusieurs méthodes sont disponibles pour installer FreeBSD. On peut notamment utiliser le système hôte et effectuer une séquence complète de make buildworld, buildkernel, installkernel, installworld, … dans /mnt. Nous avons choisi, dans ce document, de réaliser une installation de base (base binaire+noyau générique) en partant du CDROM d’installation de la version 6.1 en utilisant les commandes d’extraction contenues dans les différents scripts install.sh du CD. Libre à vous d’adapter la méthode présentée à ce qui vous convient le mieux.
Nous commençons par monter l’image ISO du CDROM d’installation dans le répertoire /cdrom :
# mdconfig -a -t vnode -f 6.1-RELEASE-i386-disc1.iso -u 1 # mount_cd9660 /dev/md1 /cdrom
puis, nous installons la distribution binaire de base :
# cat /cdrom/6.1-RELEASE/base/base.?? | tar --unlink -xpzf - -C /mnt
et le noyau GENERIC :
# cat /cdrom/6.1-RELEASE/kernels/generic.?? | tar --unlink -xpzf - -C /mnt/boot # rmdir /mnt/boot/kernel # mv /mnt/boot/GENERIC /mnt/boot/kernel
Afin de monter le système de fichiers racine au démarrage de la machine, nous créons le fichier /mnt/etc/fstab suivant :
# Device Mountpoint FStype Options Dump Pass # ========= ========== ====== ======= ==== ==== /dev/ad4s1a / ufs rw 0 0
Afin de visualiser le fait que nous nous trouvons en mode rescue, nous modifions le prompt de l’utilisateur root. Pour cela, nous remplaçons la ligne suivante du fichier /mnt/root/.cshrc :
set prompt = "`/bin/hostname -s`# "
par :
set prompt = "`/bin/hostname -s`-rescue# "
La méthode présentée ici prévoit, comme le mode rescue Dedibox, un accès ssh pour le compte root, il est donc important, au minimum, de mettre un mot de passe costaud à ce compte. Vous pouvez aussi adapter cette installation de façon à ne pas permettre un accès ssh pour le compte root, mettre en place l’authentification par clés DSA/RSA…
Pour changer le mot de passe de root qui est vide par défaut, nous utilisons la commande suivante :
echo "MonMotdePasseCostaud" | pw -V /mnt/etc/ usermod root -h 0
Afin de disposer d’un clavier en français, de donner un nom à notre système, de configurer le réseau et d’activer le daemon sshd au démarrage de la machine, nous créons le fichier /mnt/etc/rc.conf minimum suivant :
keymap="fr.iso.acc" hostname="MaDediboxQueJai.MonDomaine.tld" defaultrouter="a.b.c.d" ifconfig_vge0="inet a.b.c.z netmask 255.255.255.0" sshd_enable="YES"
Nous créons, pour cela, un fichier /mnt/etc/resolv.conf de ce type :
domain MonDomaine.tld nameserver 88.191.254.60 nameserver 88.191.254.70
Pour configurer la zone locale, il suffit de copier le fichier de zone concerné dans /etc/localtime par exemple ici :
# cp /mnt/usr/share/zoneinfo/Europe/Paris /mnt/etc/localtime
Lors de son premier lancement, le script rc du daemon sshd crée les différentes clés RSA et DSA du serveur et demande, sur la console, à l’utilisateur de saisir un pleine page de caractères au hasard pour optimiser le fonctionnement du moteur d’entropie. Afin d’éviter ce qui bloquerait le démarrage du système, nous créons au préalable ces différentes clés :
# /usr/bin/ssh-keygen -t rsa1 -b 1024 -f /mnt/etc/ssh/ssh_host_key -N '' # /usr/bin/ssh-keygen -t dsa -f /mnt/etc/ssh/ssh_host_dsa_key -N '' # /usr/bin/ssh-keygen -t rsa -f /mnt/etc/ssh/ssh_host_rsa_key -N ''
puis, nous permettons le login de root via ssh :
# mv /mnt/etc/ssh/sshd_config /mnt/etc/ssh/sshd_config.orig # echo "PermitRootLogin yes" > /mnt/etc/ssh/sshd_config
Voilà, c’est tout pour la slice du mode rescue. Vous pouvez maintenant démonter /mnt :
# umount /mnt
La mise en place de la slice d’exploitation est assez similaire à celle de la slice rescue, seuls diffèrent le partitionnement et ce qui est installé.
Nous commençons par installer un label BSD avec un bootstrap :
bsdlabel -w -B /dev/md0s2
puis, nous créons le fichier de label label.tmp définissant le partitionnement de la slice d’exploitation :
#--------------------------------BSDLABEL-----------------------------# 8 partitions: # size offset fstype [fsize bsize bps/cpg] # # ==== ====== ====== ===================== # a: 1024M 0 4.2BSD # / b: 1024M * swap # swap c: * * unused 0 0 # e: 2048M * 4.2BSD # /var f: * * 4.2BSD # /usr #---------------------------------------------------------------------#
et nous appliquons le label ainsi défini :
# bsdlabel -R /dev/md0s2 label.tmp
Nous pouvons maintenant créer le système de fichiers racine :
# newfs -U /dev/md0s2a /dev/md0s2a: 1024.0MB (2097152 sectors) block size 16384, fragment size 2048 using 6 cylinder groups of 183.77MB, 11761 blks, 23552 inodes. with soft updates super-block backups (for fsck -b #) at: 160, 376512, 752864, 1129216, 1505568, 1881920
et le monter :
# mount /dev/md0s2a /mnt
L’installation de FreeBSD est assez simple si l’on décide d’installer le minimum, c’est à dire la même chose que dans la partition racine de la slice rescue, ce qui est le cas ici. Voici une méthode parmi d’autres :
# cd /mnt # dump -0 -Lauf - /dev/md0s1a | restore -rf - # cd /
Personnellement, j’aime bien avoir les pages de man sous la main alors je les ajoute :
# cat /cdrom/6.1-RELEASE/manpages/manpages.?? | tar --unlink -xpzf - -C /mnt
Afin de monter le système de fichiers racine au démarrage de la machine et de disposer d’une swap d’1 Go, nous créons le fichier /mnt/etc/fstab suivant :
# Device Mountpoint FStype Options Dump Pass # ========= ========== ====== ======= ==== ==== /dev/ad4s2a / ufs rw 0 0 /dev/ad4s2b none swap sw 0 0 #/dev/ad4s2e /var ufs rw 0 2 #/dev/ad4s2f /usr ufs rw 0 2
Afin de bien voir que nous sommes sur la slice d’exploitation, nous remettons le prompt par défaut dans le fichier /mnt/root/.cshrc à savoir :
set prompt = "`/bin/hostname -s`# "
Voilà, c’est tout pour la slice d’exploitation, nous pouvons maintenant démonter /mnt :
# umount /mnt
et détacher le disque md0
# mdconfig -d -u 0
Nous commençons par copier l’image constituée (freebsdedibox.img) sur un URL accessible depuis notre Dedibox, par exemple : ftp://ftp.mondomaine.tld/, par la gézipper pour que le transfert soit plus rapide puis nous redémarrons notre dédibox en mode rescue et nous utilisons la commande suivante pour installer l’image :
# wget -O - ftp://ftp.mondomaine.tld/freebsdedibox.img.gz | gunzip | dd of=/dev/sda bs=1M
Voilà, vous pouvez maintenant redémarrer votre Dedibox en mode normal et au bout de quelques minutes, vous devriez pouvoir vous connecter en ssh avec le compte root. Personnellement, la première chose que je fais une fois le système redémarré est de créer un compte utilisateur dans le groupe wheel, installer sa clé publique et interdire le login ssh pour le compte root. Bien évidemment, vous faites comme vous voulez…
Le plus simple pour réaliser cette opération est de redémarrer en mode rescue FreeBSD, pour cela, procédez comme suit :
# fdisk -a ... Partition 2 is marked active Do you want to change the active partition? [n] y Supply a decimal value for "active partition" [2] 1 Are you happy with this choice [n] y ... Should we write new partition table? [n] y # shutdown -r now
Au bout de quelques minutes, nous pouvons vous connecter via ssh sur le mode rescue FreeBSD avec le compte root et créer les systèmes de fichiers manquants :
rescue# newfs -U /dev/ad4s2e /dev/ad4s2e: 2048.0MB (4194304 sectors) block size 16384, fragment size 2048 using 12 cylinder groups of 183.77MB, 11761 blks, 23552 inodes. with soft updates super-block backups (for fsck -b #) at: ... rescue# newfs -U /dev/ad4s2f /dev/ad4s2f: 147501.7MB (302083580 sectors) block size 16384, fragment size 2048 using 803 cylinder groups of 183.77MB, 11761 blks, 23552 inodes. with soft updates super-block backups (for fsck -b #) at: ...
puis, déplacer les actuels /var et /usr, par exemple de la façon suivante :
rescue# mount /dev/ad4s2a /mnt rescue# mount /dev/ad4s2e /mnt/mnt rescue# cd /mnt/var rescue# pax -rw -p e . /mnt/mnt rescue# umount /mnt/mnt rescue# cd / rescue# rm -rf /mnt/var/* rescue# mount /dev/ad4s2f /mnt/mnt rescue# cd /mnt/usr rescue# pax -rw -p e . /mnt/mnt rescue# umount /mnt/mnt rescue# cd / rescue# chflags -R noschg /mnt/usr/ rescue# rm -rf /mnt/usr/*
modifier le fichier /mnt/etc/fstab comme suit :
# Device Mountpoint FStype Options Dump Pass # ========= ========== ====== ======= ==== ==== /dev/ad4s2a / ufs rw 0 0 /dev/ad4s2b none swap sw 0 0 /dev/ad4s2e /var ufs rw 0 2 /dev/ad4s2f /usr ufs rw 0 2
démonter /dev/ad4s2a :
# umount /mnt
remettre la slice 2 active à l’aide de la commande “fdisk -a” et redémarrer la Dedibox. Voilà, vous disposez maintenant d’un système FreeBSD 6.1 de base
Si pour une raison quelconque, votre système ne redémarre pas, utilisez le mode rescue Dédibox pour activer le mode rescue FreeBSD de la façon suivante :
BusyBox v1.01 (2005.12.06-16:10+0000) Built-in shell (ash) Enter 'help' for a list of built-in commands. # fdisk /dev/sda The number of cylinders for this disk is set to 19457. There is nothing wrong with that, but this is larger than 1024, and could in certain setups cause problems with: 1) software that runs at boot time (e.g., old versions of LILO) 2) booting and partitioning software from other OSs (e.g., DOS FDISK, OS/2 FDISK) Command (m for help): p Disk /dev/sda: 160.0 GB, 160041885696 bytes 255 heads, 63 sectors/track, 19457 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/sda1 1 129 1036161 a5 FreeBSD /dev/sda2 * 130 19455 155236095 a5 FreeBSD Command (m for help): a Partition number (1-4): 2 Command (m for help): a Partition number (1-4): 1 Command (m for help): p Disk /dev/sda: 160.0 GB, 160041885696 bytes 255 heads, 63 sectors/track, 19457 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System /dev/sda1 * 1 129 1036161 a5 FreeBSD /dev/sda2 130 19455 155236095 a5 FreeBSD Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks. #
Puis, redémarrez la Dédibox en mode normal.
Les différentes lectures qui ont permis la rédaction de cette article :
http://www.freebsd.org/doc/fr_FR.ISO8859-1/books/handbook/ : le manuel de référence de FreeBSD
http://www.ultradesic.com/?section=125 : minibsd pour FreeBSD 6.x (la partition rescue FreeBSD pourrait être installée en suivant ce principe)
http://www.daemonology.net/depenguinator/ : Comme son nom l’indique… un outil pour remplacer Linux par FreeBSD (ne semble pas marcher avec les versions 6.x de FreeBSD)
http://freebsd.bebik.net/wiki/index.php/Utilisateur:Marck : Un papier en cours d’élaboration sur la création d’un live CD FreeBSD (m’a permis de pointer le rôle des scripts install.sh dans l’installation de FreeBSD)
http://sig9.com/articles/freebsd-on-bochs : FreeBSD on Bochs (Utilisation des périphériques md)
http://ezine.daemonnews.org/200111/growfs.html : Growing FreeBSD’s filesystems with growfs(8) (Un super papier de Marc Fonvielle sur les slices, partitions, labels BSD, …)
http://www.bsdedibox.net/wakka.php?wiki=FreeBSD : Installation automatique de FreeBSD 6.1 sur Dedibox (la version originale)
Voilà, j’espère que ce petit papier sera utile à quelques uns… Merci de l’avoir lu jusqu’au bout. N’hésitez pas à utiliser le formulaire de discussion pour tous commentaires, critiques, corrections, suggestions… Je ne garantis pas de réponses dans la seconde, mais je ferai de mon mieux.
Jean-Loic Tignon - 21/06/2006