FreeBSD

From Grid5000
Jump to: navigation, search
Warning.png Warning

To update Not necessarily up-to-date

This page tries to gather information about the use of FreeBSD on Grid5000. This is not a tutorial. For the tutorial on FreeBSD deployment, see this page.

From FreeBSD.org : FreeBSD® is an advanced operating system for x86 compatible (including Pentium® and Athlon™), amd64 compatible (including Opteron™, Athlon 64, and EM64T), UltraSPARC®, IA-64, PC-98 and ARM architectures. It is derived from BSD, the version of UNIX® developed at the University of California, Berkeley.

Contents

Useful links

Astuces

Récupérer les sources avec cvsup

Depuis les noeuds, impossible de se connecter vers l'extérieur. Il faut utiliser un tunnel SSH (ssh -R) sur le port 5999. Ca fonctionne sans problème.

Accès au web pour l'installation des ports

Certaines tâches (une installation de ports sous FreeBSD par exemple) nécessitent d'avoir un accès complet à des serveurs HTTP ou FTP, ce qui n'est évidemment pas possible depuis les noeuds de Grid5000. Une solution pour contourner ce problème est d'utiliser un proxy HTTP sur votre poste de travail, puis de faire un tunnel SSH vers ce proxy.

L'installation d'un proxy sur son poste de travail est assez simple (durée estimée : 20 mins). Vous avez le choix entre squid et Apache 1 ou 2 (en existe-t-il d'autres, plus légers ?). Squid est très lourd, Apache est bien plus facile à configurer et peut être utilisé sans cache (pas forcément utile).

Une fois le proxy configuré, il suffit de positionner la variable d'environnement http_proxy vers l'URL du proxy (http://localhost:80 par exemple) pour que cela fonctionne avec la plupart des applications. Vérifier que cela fonctionne avec wget -O /dev/stdout http://www-id.imag.fr/.

Pour utiliser le proxy depuis les noeuds, il suffit de créer un tunnel SSH (ssh -R 8080:localhost:80 gdx0111.orsay.g5k par exemple).

Remarques :

  • Contrairement à l'habitude, il faut écrire http_proxy, pas HTTP_PROXY, sinon wget ignore la variable d'environnement.

Voir aussi la FAQ.

Various notes about installation and configuration

UFS et UFS2

FreeBSD utilisait le système de fichier UFS jusqu'aux versions 4.X. A partir de FreeBSD 5.0, UFS2 est utilisé. Voir la Little UFS2 FAQ

Grub et UFS

C'est possible, que ce soit avec UFS ou UFS2.

Cohabitation Linux / FreeBSD

Le support en lecture d'UFS est présent dans Linux depuis longtemps et a l'air stable. Le support en écriture est apparemment expérimental (récit sur un blog datant de novembre 2004).

Le support d'UFS2 ne permet que la lecture, pas l'écriture.

FreeBSD et partitions

FreeBSD doit obligatoirement etre installé sur une partition primaire. A l'intérieur de cette partition primaire (appelée slice en terminologie FreeBSD), il crée une ou plusieurs partitions (en terminologie FreeBSD). Le système ressemble fortement au principe des partitions étendues.

Nommage des partitions FreeBSD sous Linux

Le Howto Linux+FreeBSD soulève un probleme. Si on a le schéma : hda: hda1 hda2 hda3 hda4 < hda5 hda6 > Et qu'on utilise hda3, comme slice FreeBSD, en y ajoutant des partitions FreeBSD, on pourrait se retrouver avec :

 hda: hda1 hda2 hda3 < hda5 hda6 hda7 hda8 > hda4 < hda9 hda10 >

Ce qui pose un gros problème, puisque le numéro des partitions Linux étendues n'est plus constant ! Heureusement, ce n'est plus le cas (testé avec un noyau 2.4.26, pas trouvé depuis quand le problème est résolu). Au boot, on a qqchose comme :

 Partition check:
   hda: hda1 hda2 hda3 hda4 < hda5 hda6 hda7 hda8 hda9 hda10 hda11 hda12 hda13 hda14 >
   hda3: <bsd: hda15 hda16 >

Ouf !

Partage du Swap entre FreeBSD et Linux

C'est possible, d'après le mini-HOWTO Linux+FreeBSD.

Sous FreeBSD, rien de spécial à faire (pas de mkswap), il suffit de lui dire d'utiliser /dev/ad0s2 (par exemple) comme partition de swap. FreeBSD peut utiliser n'importe quel type de partition comme partition de Swap.

Par contre sous Linux, il faut faire un mkswap avant de pouvoir utiliser la partition.

Le plus simple est peut-etre de refaire un mkswap à la fin de chaque réservation de type déploiement ?

 proposition de jleduc
   On pourrait, comme proposé dans le mini-HOWTO faire un mkswap systématique ou conditionnel
   sur la partition de swap lors du boot du système de base, ca devrait être suffisant.
   Un test (à définir) sur la partition de swap permettrait d'optimiser un peu mieux la fréquence
   des formatages.
   Il suffit pour celà de modifier la postinstall du système de base.

Notes about the first install

Doing the first install is tricky. It was done like that :

  • get a node with deploy rights.
  • ask a cluster admin to give you the right to deploy on sda2 (partition used by the reference environment)
  • deploy debian4all on this partition
  • install qemu and get the FreeBSD ISO
  • start qemu and boot the CDROM using the real hard drive
qemu-system-x86_64 -hda /dev/sda -cdrom 6.1-RELEASE-amd64-disc1.iso -boot d -serial vc -serial vc -serial vc -serial vc
  • Install freebsd on sda3
  • Reboot using qemu
qemu-system-x86_64 -hda /dev/sda -boot c -serial vc -serial vc -serial vc -serial vc -net nic -net tap
  • Configure host networking
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 222 -j DNAT --to 192.168.0.1:22
  • Configure what needs to be configured (get sources using cvsup, enable ssh, enable serial console)
  • Reboot to the FreeBSD system using the real machine. You need to get into grub during boot and choose the right partition by entering something like :
root (hd0,2)
chainloader +1
boot
  • When everything is perfect, reboot the node on the deployment kernel using
kareboot -d -m node
  • Then, from the head node :
rsh -l root node "dd if=/dev/sda3" | pv | gzip > Freebsd-image.dd.gz

Notes About the kaenvironment

  • fdisktype must be A5 (FreeBSD)
  • kernelpath is chainload
  • no kernelparam
  • no initrdpath
  • size can be 0
  • filesystem can be ext2

Example of karecordenv file (to be used with karecordenv -fe ...):

author = your@mail
filebase = file://path/to/image.dd.gz
filesite = 
size = 0
initrdpath = 
kernelpath = chainload
kernelparam = 
fdisktype = A5
filesystem = ext2
siteid = 1
optsupport = 0

Ancienne procédure de déploiement, avec système de déploiement intermédiaire

En résumé

Pour déployer FreeBSD sur un noeud de Grid5000, on utilise la procédure suivante :

  • On boote sur le noyau de déploiement
  • On écrit au début d'une grande partition (par exemple 20 Go) avec dd un système FreeBSD minimal (qu'on appellera par la suite "FreeBSD de déploiement"). Comme on n'écrit que ce qui est nécessaire (= que le début de la partition), ça prend quelques secondes. (Le FreeBSD de déploiement tient sans problèmes sur 300 Mo).
  • On boote sur ce FreeBSD de déploiement.
  • Depuis ce FreeBSD de déploiement, on édite le disklabel pour rajouter une partition. On crée le système de fichiers sur cette partition avec newfs, puis on détarre notre FreeBSD de travail.
  • On reboote sur le FreeBSD de travail.

En détail

Dans les commandes suivantes, TARGET vaut par exemple node38-007.

Dans l'exemple ci-dessous, on se sert de /dev/hda3 comme slice FreeBSD. Dedans, on va installer un FreeBSD de déploiement sur 300 Mo, et un FreeBSD de travail sur le reste.

Création de l'image du FreeBSD de déploiement

  • On boote le noyau de déploiement (kareboot -d -m $TARGET). On fait un modprobe serverworks suivi d'un hdparm -c1 -d1 /dev/hda. Puis, on écrit des 0 sur la partition pour minimiser la taille de l'image ensuite : dd if=/dev/zero of=/dev/hda3 bs=350M.
  • On installe un FreeBSD de manière classique (avec CD, ou par netinstall) sur une partition /dev/ad0s3a de 300 Mo.
  • On paramètre tout ce qu'il y a à paramétrer :
    • Interfaces en DHCP
    • inetd activé avec rshd activé
    • rshd modifié pour permettre le login en root sans authentification (/home/grenoble/lnussbaum/rshd-custom-freebsd.c)
    • sendmail désactivé

Voici le /etc/rc.conf qui va bien :

hostname="freebsd-deploy"
ifconfig_em0="DHCP"
ifconfig_bge0="DHCP"
inet_enable="YES"
sendmail_enable="NONE"
  • Ensuite, on retourne sur le noyau de déploiement. modprobe, hdparm, ... Puis rsh -l root $TARGET "dd if=/dev/hda3 bs=1M count=350 | gzip" > image_freebsddeploy.dd.gz (laisser un peu de marge n'a jamais fait de mal ...)

Déploiement du FreeBSD de déploiement sur un autre noeud

  • On boote sur le noyau de déploiement. modprobe, hdparm, ...
  • On définit le type de la partition 3 :
echo "t
3
a5
w
" | rsh -l root $TARGET "fdisk /dev/hda"
  • Puis on peut écrire l'image :
cat image_freebsddeploy.dd.gz | rsh -l root $TARGET "cat | gzip -d | dd of=/dev/hda3 bs=1M; sync"
  • Ensuite, il faut rebooter sous FreeBSD. Là, deux cas :
    • L'image du FreeBSD de déploiement vient d'un système où elle était au même endroit sur le disque :
Dans ce cas, Grub s'y retrouve, et on peut faire dans Grub, par exemple :
root (hd0,2,a)
kernel /boot/loader
boot
    • Toute autre situation : c'est plus compliqué, car Grub ne trouve pas la table des partitions. Dans Grub, on boote avec :
root (hd0,2)
chainloader +1
boot

Ensuite, il faut générer une table des partitions valide avec disklabel. Seule la taille de la premiere partition est importante, un label comme celui la fonctionne donc très bien :

# /dev/ad0s3:
8 partitions:
#        size   offset    fstype   [fsize bsize bps/cpg]
  a:   614400        *    4.2BSD

On transfère le label sur la machine, puis on l'écrit.

cat emptybsdlabel |rsh root@$TARGET "cat > emptybsdlabel"
rsh root@$TARGET "disklabel -R /dev/ad0s3 emptybsdlabel"

On peut vérifier que le label est bien pris en compte :

rsh root@$TARGET "disklabel /dev/ad0s3"

ce qui devrait donner (la taille totale du disque étant récupérée par disklabel) :

# /dev/ad0s3:
8 partitions:
#        size   offset    fstype   [fsize bsize bps/cpg]
  a:   614400        0    4.2BSD        0     0     0 
  c: 10486224        0    unused        0     0         # "raw" part, don't edit

Si on reboote à ce moment là (conseillé pour vérifier), on peut utiliser la méthode décrite ci-dessus dans grub.

Note: si on veut automatiser la configuration des partitions, on peut s'inspirer de ce script :

dl=$(mktemp)
for i in $M; do
   ssh root@$i disklabel /dev/ad0s3 |head -3 > $dl
   echo "  a: 614400 0 4.2BSD" >> $dl
   echo "  c: * * unused" >> $dl
   cat $dl | ssh root@$i "cat > /tmp/dl"
   ssh root@$i "disklabel -R /dev/ad0s3 /tmp/dl"
   ssh root@$i disklabel /dev/ad0s3 |head -5 > $dl
   echo "  d: * * 4.2BSD" >> $dl
   cat $dl | ssh root@$i "cat > /tmp/dl"
   ssh root@$i "disklabel -R /dev/ad0s3 /tmp/dl"
done
rm -f $dl

Création d'une archive d'un FreeBSD de travail

  • En ayant booté le FreeBSD de déploiement
  • rsh -l root $TARGET "mkdir -p /cible"
  • rsh -l root $TARGET "mount /dev/ad0s3d /cible"
  • rsh -l root $TARGET "cd /cible ; tar -czf - ." > freebsdtravail.tgz
  • (Vérifier avec tar tzf freebsdtravail.tgz)

Déploiement d'une archive d'un FreeBSD de travail

  • En ayant booté le FreeBSD de déploiement
  • Il faut commencer par écrire le disklabel. Voici un exemple de description de disklabel permettant d'utiliser tout l'espace disponible sur un disque :
# /dev/ad0s3:
8 partitions:
#        size   offset    fstype   [fsize bsize bps/cpg]
  a:   614400        0    4.2BSD     2048 16384 38408 
  c: 40965750        0    unused        0     0         # "raw" part, don't edit
  d:        *        *    4.2BSD

Cet exemple fonctionne tel quel sur les machines de Grenoble. Pour GDX, avec installation également sur hda3, utiliser :

# /dev/ad0s3:
8 partitions:
#        size   offset    fstype   [fsize bsize bps/cpg]
  a:   614400        0    4.2BSD     2048 16384 38408 
  c: 10486224        0    unused        0     0         # "raw" part, don't edit
  d:        *        *    4.2BSD

Pour écrire ce disklabel, on commence par transférer le fichier de description du disklabel : cat mylabel | rsh -l root $TARGET "cat > mylabel"

  • Puis on écrit effectivement le disklabel : rsh -l root $TARGET "bsdlabel -R /dev/ad0s3 mylabel"
  • On crée ensuite le système de fichier : rsh -l root $TARGET "newfs /dev/ad0s3d" ou rsh -l root $TARGET "newfs -O /dev/ad0s3d" dans le cas d'un freeBSD 4.x (cf man)
  • On crée un point de montage et on monte le système de fichier nouvellement créé : rsh -l root $TARGET "mkdir -p /cible" et rsh -l root $TARGET "mount /dev/ad0s3d /cible"
  • On détarre : cat tar.tgz | rsh -l root $TARGET "cd /cible ; tar xzf -"
  • Penser à vérifier /etc/fstab
  • Il n'y a plus qu'à rebooter sur le FreeBSD de travail.

Note: pour automatiser cette étape, on peut s'inspirer de ce script :

for i in $M; do ssh root@$i "newfs /dev/ad0s3d && mkdir -p /cible && mount /dev/ad0s3d /cible"; done

Création d'un premier système FreeBSD de travail

  • Depuis le FreeBSD de déploiement, créer une partition et la monter comme pour le déploiement d'un FreeBSD de travail.
  • Puis, dans sysinstall, dans les options, modifier la Target (mettre /cible) et installer le système.

Configuration d'une console série

La procédure décrite sur cette page ne fonctionne PAS. Pour avoir la console dès le boot loader, il faut faire un echo "console=comconsole" >> /boot/loader.conf. Attention, cela active une console en 9600 bauds. Si vous la voulez en 38400 bauds, il faut recompiler le boot loader après avoir édité /etc/make.conf :

echo BOOT_COMCONSOLE_SPEED=38400 >> /etc/make.conf
cd /usr/src/sys/boot
make clean
make
make install

Pour activer un login prompt sur la console série, il faut éditer /etc/ttys et modifier la ligne de ttyd0 :

ttyd0   "/usr/libexec/getty std.38400"  dialup  on secure

(ou laisser 9600 si vous la voulez en 9600 bauds)

Experiences Opterons

FreeBSD 32 bits

Sur GDX un FreeBSD 4.1 32bits a été installé (detarré depuis le BSD de déploiement) sans problème. Il faut juste faire attention à bien formatter le système de fichiers en UFS1.

FreeBSD on IBM e326m

Installing from FreeBSD 5 CDROM

  • check that the e326m BIOS has "USB legacy" and "Onboard VGA" options enabled ; check also that the "CDROM" has priority over other media in the "BIOS Start Options"
  • if you use an RSA II management card, unplug it from the PCI-X slot (it will still be usable to reboot the e326m through telnet ou http!!!...) in order to reactivate the e326m onboard VGA output
  • plug your video to the e326m onboard VGA and your keyboard to one onboard USB slot
  • boot onto the FreeBSD 5 CDROM
  • at the beastie loader menu, choose "2" (no ACPI) otherwise the system will hang at some PCI detection phase
  • when you get the BSD install menu, unplug and replug your USB keyboard in order to activate the BSD driver
  • you may now install BSD! but...


Network

Network chip: Broadcom 5780.

http://www.freebsd.org/cgi/cvsweb.cgi/src/sys/dev/bge/if_bgereg.h

http://www.freebsd.org/cgi/cvsweb.cgi/src/sys/dev/bge/if_bge.c

No driver included as of 04/01/06

Broadcom vendor ID seems to be 0x166A (see pciconf -l)

Patch seems trivial for FreeBSD 4.X/5.X/6.X.

Linux patchs to the tg3 driver regarding BCM 5780 :

Searching for FreeBSD problem reports :

NetBSD bge driver :

OpenBSD bge driver :

After patching, 3 NICs are detected on boot (the PCI-X one + the 2 integrated ones driven by a single chip)

bge0: <Broadcom BCM5703 Gigabit Ethernet, ASIC rev. 0x1002> mem 0xe8200000-0xe820ffff irq 11 at device 2.0 on pci3
miibus0: <MII bus> on bge0
brgphy0: <BCM5703 10/100/1000baseTX PHY> on miibus0
brgphy0:  10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, 1000baseTX, 1000baseTX-FDX, auto
bge0: Ethernet address: 00:10:18:0b:e2:c2
pcib4: <PCI-PCI bridge> at device 7.0 on pci0
pci4: <PCI bus> on pcib4
bge1: <Broadcom BCM5780 Gigabit Ethernet, ASIC rev. 0x8003> mem 0xe8300000-0xe830ffff,0xe8310000-0xe831ffff irq 7 at device 4.0 on pci4 
miibus1: <MII bus> on bge1
ukphy0: <Generic IEEE 802.3u media interface> on miibus1
ukphy0:  10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, 1000baseT, 1000baseT-FDX, auto
bge1: Ethernet address: 00:11:25:c4:18:64
bge2: <Broadcom BCM5780 Gigabit Ethernet, ASIC rev. 0x8003> mem 0xe8320000-0xe832ffff,0xe8330000-0xe833ffff irq 10 at device 4.1 on pci4
miibus2: <MII bus> on bge2
ukphy1: <Generic IEEE 802.3u media interface> on miibus2
ukphy1:  10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, 1000baseT, 1000baseT-FDX, auto
bge2: Ethernet address: 00:11:25:c4:18:65

After assigning an IP, the interface can be pinged, but if I try to transfer a large file :

bge1: discard frame w/o leading ethernet header (len 4294967292 pkt len 4294967292)
Fatal trap 12: page fault while in kernel mode
fault virtual address   = 0x28
fault code              = supervisor write, page not present
instruction pointer     = 0x8:0xffffffff80227802
stack pointer           = 0x10:0xffffffffb1b00b80
frame pointer           = 0x10:0xffffffffb1f3a020
code segment            = base 0x0, limit 0xfffff, type 0x1b
                        = DPL 0, pres 1, long 1, def32 0, gran 1
processor eflags        = interrupt enabled, resume, IOPL = 0
current process         = 18 (irq7: bge1)
trap number             = 12
panic: page fault
Uptime: 1m57s
Cannot dump. No dump device defined.
Automatic reboot in 15 seconds - press a key on the console to abort

ACPI

ACPI: need to be disabled in order to boot automatically without manual selection at the beastie loader menu.

Add

hint.acpi.0.disabled=1

to /boot/loader.conf

(documented on acpi(4) man page)

Lucas: What are the downsides of disabling ACPI like that??

Phil: This is typical of very recent hardware that are not well supported by current kernels... I had the same problem with debian & ubuntu onto my Turion64 laptop (the internal clock runs too fast by a factor of two unless ACPI is disabled)! Generally, disabling ACPI prevents further usage of power related functions and monitoring (can be annoying with a laptop, not so much with servers... Julien is using ACPI on debianized e325 to cleanly shutdown the OS when a reboot command is issued via IPMI or RSA, but actually it does not work since the power is really suspended too quickly for the OS shutdown to complete). Hence my answer would be : no real drawback.

Lucas: Warning: disabling ACPI makes SMP detection fail. e326m boot FreeBSD 6 without problems with ACPI enabled.

Personal tools
Namespaces

Variants
Actions
Public Portal
Users Portal
Admin portal
Wiki special pages
Toolbox