====== Installation de FreeBSD 6.1 sur une Dédibox ====== [[http://freebsdedibox.vigilan.net/doku.php|Source]] ===== Introduction ===== Ce document présente une méthode alternative à celle de JC Michot ((http://www.bsdedibox.net/)) pour installer [[http://www.FreeBSD.org|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. Ce petit papier n'a rien à voir avec la société Dédibox. Ne demandez pas d'assistance à la société Dédibox sur la procédure présentée ici, vous risquez de ne pas en obtenir. ===== Principes de construction ===== La construction du système est basée sur les principes suivants : * Un périphérique md de type vnode (fichier) porte l'image du système à installer. * Le périphérique md contient deux slices : la première constitue le mode rescue FreeBSD, la seconde contient le FreeBSD utilisé en exploitation. Le passage en mode rescue FreeBSD est réalisé grace au fdisk du mode rescue Linux suivi d'un redémarrage en mode normal. * Une fois l'image constituée, l'installation est réalisée sur la Dédibox en utilisant une méthode similaire à celle existant, à savoir une combinaison de wget/dd depuis le mode rescue Linux. ===== Pré-requis ===== La construction du système nécessite les éléments suivants : * un système FreeBSD autre que la Dédibox de destination disposant d'environ 3Go d'espace disque. * un CD d'installation de FreeBSD 6.1 ou l'image ISO du disque 1 * un serveur HTTP ou FTP pouvant abriter l'image finale afin de permettre l'installation. ===== Construction du système ===== ==== Création du périphérique md ==== 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 ==== Création de la table des slices ==== 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) Le message de warning peut être ignoré dans la mesure où nos 2 slices figurent dans les 1024 premiers cylindres (cf man fdisk) 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: The data for partition 4 is: ==== Mise en place de la slice rescue ==== === Ecriture des labels et du bootstrap === 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 === Création et montage du système de fichiers racine === 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 === Installation de FreeBSD === 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 === Customisation de l'installation === == Créer le fichier fstab == 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 == Un prompt discriminateur == 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# " == Donner un mot de passe solide au compte root == 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 == Une configuration réseau minimum == 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" Remplacez bien sur par les valeurs qui conviennent le nom d'hôte, la passerelle par défaut et l'adresse IP == Configurer la résolution de noms DNS == 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 == Configuration de la zone locale == 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 == Configurer sshd == 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 ==== Mise en place de la slice d'exploitation ==== 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é. === Ecriture des labels et du bootstrap === 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 Le partitionnement ainsi défini est bien sûr discutable. Adaptez-le à vos besoins. La raison pour laquelle le système de fichiers racine fait 1Go est que cela nous permet de constituer une image totale de 2Go et d'utiliser le mode rescue pour, une fois l'installation terminée, déplacer /var et /usr sur des partitions séparées. === Création et montage du système de fichiers racine === 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 === Installation de FreeBSD === 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 === Customisation de l'installation === == Créer le fichier fstab == 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 Les 2 lignes concernant les systèmes de fichiers /var et /usr sont en commentaires dans la mesure où nous n'avons pas la place de les créer dans le fichier image. Nous pourrons les créer et déplacer les fichiers à partir du mode rescue FreeBSD une fois l'installation terminée. == Remettre le prompt par défaut du compte root == 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 ==== Installation de l'image sur la Dedibox ==== 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 Si vous choisissez de ne pas gzipper l'image, vous risquez de rencontrer un problème avec la version de wget installée dans le mode rescue (1.9.1) qui semble avoir quelques difficultés avec les fichiers de 2Go. Personnellement, j'ai rencontré le message suivant :\\ wget: retr.c: 292: calc_rate: Assertion `bytes >= 0' failed.\\ Aborted 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... ==== Créer les systèmes de fichiers /var et /usr ==== 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 votre système ne démarre plus ==== 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. ===== Références ===== 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) ===== Conclusion ===== 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