Tags

arm bin_sh blocage blosxom bsd bsdfrance cblog certification chroot cluster dg834 dhcp dns dnsmasq fail-over fail2ban firefox freebsd ftp git install ipv6 jail kernel kimsufi libre linutop makefile netbook netbsd nginx ntp ntp.org openntpd openrd openwrt proxy python reverse rmll route rrdcgi sl2009 ssd symon update usb var_empty vimperator world xen zfs

Powered by

blOg
maRkdown
awK
shEll

14/05/2010

[ freebsd openrd arm ]

201005141356 freebsd openrd arm

OpenRD et FreeBSD

Il y a quelques temps, j'ai craqué pour un OpenRD (bon, j'ai aussi pris un GuruPlug mais il n'est toujours pas arrivé).

La bête a rapidement ingéré un disque sata 2.5, il ne lui manquait plus qu'un FreeBSD et c'est là que ça se gâte.

La documentation officielle propose une installation sur NFS mais dans mon cas, c'est impossible car le FreeBSD que j'utilise est derrière une connexion ADSL. Il va donc falloir ruser. Je me dis que si j'arrive à obtenir un kernel avec une image disque contenant ce qu'il faut pour l'installation c'est gagné (un peu à la sauce OpenBSD et son bsd.rd).

Après quelques essais infructueux à base de (Pico/Nano)BSD, j'explore la voie du "rescue". Je finis par réaliser que le "rescue" se construit très bien avec le "make buildworld" et que je fais d'une pierre deux coups. Cette opération pouvant durer un certain temps, je désactive un maximum de chose dans /etc/src.conf. De plus, je vire de la compile ifmcstat dans /usr/src/usr.sbin/Makefile.

U-Boot permet aussi de booter sur une clef usb et je prépare le plan suivant:

Est-il utile de préciser que ça ne va pas se passer comme une lettre à la poste ?

C'est parti :

# setenv DESTDIR /zfs/arm/chroot
# make buildworld TARGET_ARCH=arm
# make installworld TARGET_ARCH=arm
# make distrib-dirs TARGET_ARCH=arm
# make distribution TARGET_ARCH=arm
# tar cjvp -f /tmp/arm.tbz -C /zfs/arm/chroot/ .

Je prépare mon image disque:

# dd if=/dev/zero of=/tmp/mfs_image bs=1k count=4096
# mdconfig -a -t vnode -f /tmp/mfs_image -u 0
# fdisk -B /dev/md0
#   Do you want to change the boot code? [n]
#   Should we write new partition table? [n] y
# disklabel -Brw /dev/md0
# newfs -O1 -o space -m 0 /dev/md0a
# mount /dev/md0a /mnt
# cd /mnt
# mkdir rescue dev key disk
# cd rescue
# rsync -H /zfs/arm/chroot/rescue/* .
# cd
# umount /dev/md0a
# mdconfig -d -u 0

Je compile deux kernels:

# cp /usr/src/sys/arm/conf/DB-88F6XXX /usr/src/sys/arm/conf/OPENRD-MFS
# cp /usr/src/sys/arm/conf/DB-88F6XXX /usr/src/sys/arm/conf/OPENRD
# vi /usr/src/sys/arm/conf/OPENRD-MFS
 
ident           OPENRD-MFS
...
options         SCHED_4BSD              #4BSD scheduler
options         INET                    #InterNETworking
options         INET6                   #IPv6 communications protocols
options         FFS                     #Berkeley Fast Filesystem
options         MSDOSFS                 # MSDOS Filesystem
options         MD_ROOT                 # MD is a potential root device
options         MD_ROOT_SIZE=4096 # 4M
makeoptions     MFS_IMAGE=/tmp/mfs_image
options         ROOTDEVNAME=\"ufs:/dev/md0a\"
 
options         SYSVSHM                 #SYSV-style shared memory
options         SYSVMSG                 #SYSV-style message queues
...
 
# cd /usr/src
# make buildkernel TARGET_ARCH=arm KERNCONF=OPENRD-MFS
# cp /usr/obj/arm/usr/src/sys/OPENRD/kernel.bin /tmp/mfs.bin
# vi /usr/src/sys/arm/conf/OPENRD
 
ident           OPENRD
...
options         SCHED_4BSD              #4BSD scheduler
options         INET                    #InterNETworking
options         INET6                   #IPv6 communications protocols
options         FFS                     #Berkeley Fast Filesystem
options         MSDOSFS                 # MSDOS Filesystem
options         ROOTDEVNAME=\"ufs:/dev/ad0s1a\"
 
options         SYSVSHM                 #SYSV-style shared memory
options         SYSVMSG                 #SYSV-style message queues
...
 
# cd /usr/src
# make buildkernel TARGET_ARCH=arm KERNCONF=OPENRD
# cp /usr/obj/arm/usr/src/sys/OPENRD/kernel.bin /tmp/

Depuis ma Debian, je prépare ma clef usb:

$ sudo mkfs.msdos -c -F 16 /dev/sdb1
$ sudo mount -t msdos /dev/sdb1 /mnt
$ cp arm.tbz *.bin /mnt
$ ls -l /mnt
-rw-r--r-- 1 dsx dsx 24243563 mai 13 08:27 arm.tbz
-rwxr-xr-x 1 dsx dsx  2950452 mai 13 19:15 kernel.bin
-rwxr-xr-x 1 dsx dsx  7145076 mai 12 19:47 mfs.bin

Pour obtenir la console rendez-vous ici, et au départ j'ai utilisé un serveur tftp afin de préserver ma clef usb. Il sera lancé en mode standalone (sudo in.tftpd -L -s /home/dsx/).

$ sudo screen -c /dev/null /dev/ttyUSB1 115200

Marvell>> setenv ipaddr 192.168.1.1
Marvell>> setenv serverip 192.168.1.116
Marvell>> tftpboot 900000 mfs.bin
Using egiga0 device
TFTP from server 192.168.1.116; our IP address is 192.168.1.1
Filename 'mfs.bin'.
Load address: 0x900000
Loading: T #################################################################
         ...
         ###################
done
Bytes transferred = 7084148 (6c1874 hex)
Marvell>> go 900000
[ snip boot ]
May  9 18:30:18 init: login_getclass: unknown class 'daemon'
/etc/rc: Can't open /etc/rc: No such file or directory
Enter full pathname of shell or RETURN for /rescue/sh: 
Cannot read termcap database;
using dumb terminal settings.
# ls
.snap   dev     disk    key     rescue

On retrouve nos différents répertoires qui nous serviront de point de montage:

# mount_msdos /dev/da0a /key

Si ici vous prenez des erreurs, vérifiez la présence de "options MSDOSFS" dans le fichier de configuration du kernel, ça peut faire gagner une après-midi. On peut ensuite supprimer le partitionnement du disque dur à grands coups de gpart delete et gpart destroy.

J'y ai passé plusieurs soirées mais impossible de créer une partition FAT avec gpart afin d'y placer kernel.bin. Le linux fourni ne m'a pas aidé non plus, pas de dosfstools d'installé.

# gpart show ad0
gpart: No such geom: ad0.
# gpart create -s mbr ad0
ad0 created
# gpart show ad0
=>      63  78165297  ad0  MBR  (37G)
        63  78165297       - free -  (37G)
# gpart add -t freebsd ad0
ad0s1 added
# gpart create -s BSD ad0s1
ad0s1 created
# gpart show ad0s1
=>       0  78165297  ad0s1  BSD  (37G)
         0  78165297         - free -  (37G)
# gpart add -i 1 -s 4G -t freebsd-ufs ad0s1
ad0s1a added
# gpart show ad0s1
=>       0  78165297  ad0s1  BSD  (37G)
         0   8388608      1  freebsd-ufs  (4.0G)
   8388608  69776689         - free -  (33G)
# gpart add -i 2 -s 1G -t freebsd-swap ad0s1 
ad0s1b added
# gpart show ad0s1
=>       0  78165297  ad0s1  BSD  (37G)
         0   8388608      1  freebsd-ufs  (4.0G)
   8388608   2097152      2  freebsd-swap  (1.0G)
  10485760  67679537         - free -  (32G)
# gpart add -i 3 -s 1G -t freebsd-ufs ad0s1
gpart: index '3': File exists
# gpart add -i 4 -s 1G -t freebsd-ufs ad0s1
ad0s1d added
...
# gpart show ad0s1
=>       0  78165297  ad0s1  BSD  (37G)
         0   8388608      1  freebsd-ufs  (4.0G)
   8388608   2097152      2  freebsd-swap  (1.0G)
  10485760   2097152      4  freebsd-ufs  (1.0G)
  12582912   2097152      5  freebsd-ufs  (1.0G)
  14680064   2097152      6  freebsd-ufs  (1.0G)
  16777216  61388081      7  freebsd-ufs  (29G)
 
# newfs /dev/ad0s1a
# newfs /dev/ad0s1d
# newfs /dev/ad0s1e
# newfs /dev/ad0s1f
# newfs /dev/ad0s1g
# mount /dev/ad0s1a /disk/
# cd /disk
# mkdir tmp var home usr
# cp /key/arm.tbz .
# tar xjvpf arm.tbz

Pour la petite histoire, mon disque était un peu HS et freezait de temps en temps lors du tar. J'ai passé un temps fou à diagnostiquer le problème pour finir par acheter un disque neuf.

Bien, il reste à configurer le tout:

# echo '/dev/ad0s1a  /      ufs   rw,sync  1  1' >> etc/fstab
...
# echo '/dev/ad0s1g  /usr   ufs   rw,sync  2  2' >> etc/fstab
# echo 'hostname="openrd.bsdsx.fr"' >> etc/rc.conf
...
# echo 'ifconfig_mge0_ipv6="RTADV"' >> etc/rc.conf

Au passage, la syntaxe ipv6 du /etc.rc.conf a évolué et je m'en suis aperçu un peu tard (encore du temps de perdu). Dernière configuration, U-Boot:

Marvell>> setenv bootcmd 'usb start;fatload usb 0:1 900000 kernel.bin;go 900000'
Marvell>> saveenv

Le résultat:

openrd# uname -a
FreeBSD openrd.bsdsx.fr 9.0-CURRENT FreeBSD 9.0-CURRENT #8: Fri May 14 18:15:14 CEST 2010     root@k45.bsdsx.fr:/usr/obj/arm/usr/src/sys/OPENRD  arm

Pour les curieux les différents fichiers sont disponibles. Bon, c'est pas le tout mais maintenant j'ai un "make buildworld" à faire et des ports à installer (encore des bonnes soirées en perspective).

Update: WITHOUT_MAKE c'est pas une bonne idée.

Update2: Romain m'avait bien dit que l'option "sync" dans /etc/fstab était une bonne idée. Après une dizaine de csup -g -L 2 /root/current tous plus foireux les uns que les autres, je confirme.


Lien vers ce billet