27/05/2010
201005271934 freebsd guruplug arm
GuruPlug Server Plus et FreeBSD
Mon GuruPlug Server Plus a fini par arriver. Maintenant que mon OpenRD est opérationnel, j'ai pensé que le GuruPlug me ferait moins de misère. Et bien pas du tout. Pour les futurs acquéreurs: le GuruPlug JTAG Board c'est pas une option.
Pourtant mon plan était simple:
- une clef usb de 4Go (1 partition FAT + 1 slice FreeBSD contenant une simple partition)
- un make installword depuis l'OpenRD
- configuration du U-Boot
- joie et bonheur
Après plusieurs tentatives, j'ai fini par comprendre que ma clef était reconnue en tant que da2. Je recompile mon kernel avec l'option kivabien (options ROOTDEVNAME=\"ufs:/dev/da2s2a\").
Reboot et paf: re-fail. Le kernel boote, tente de mounter la racine mais, voire MAIS, la clef n'est pas encore détectée. Une première piste me conduit vers une impasse. Le grand Ternet étant fait de clickas et de clickous (de fil en aiguille quoi) je tombe sur ce patch. Mon ami Murphy en profite pour le rendre incompatible avec un FreeBSD 9.0 CURRENT. Je retrousse mes manches et c'est parti pour une scéance de $EDITOR (belle esquive de troll :).
Un reboot pour la route et je touche au but:guruplug# uname -srm FreeBSD 9.0-CURRENT arm
Il ne me reste plus qu'à rajouter un user, configurer le réseau et je vois la fin du tunnel. Et ben non. Murphy(ou un de ses potes) décide que le rj45/gigabit n'est pas compatible avec un boot. Il faut le voir pour le croire, ou alors et encore là. Et comme pour l'instant j'utilise un câble croisé entre mon portable (carte réseau giga) et le guruplug, re-re-fail.
Lueur d'espoir: mon switch est en 100Mbits donc je repousse la mise à jour d'une version plus récente de U-Boot.
Pour finir, la configuration du U-Boot:
Marvell>> printenv
bootcmd=setenv ethact egiga0; ${x_bootcmd_ethernet}; setenv ethact egiga1; ${x_bootcmd_ethernet}; ${x_bootcmd_usb}; ${x_bootcmd_kernel}; setenv bootargs ${x_bootargs} ${x_bootargs_root}; bootm 0x6400000;
bootdelay=3
baudrate=115200
x_bootcmd_ethernet=ping 192.168.2.1
x_bootcmd_usb=usb start
x_bootcmd_kernel=nand read.e 0x6400000 0x100000 0x400000
x_bootargs=console=ttyS0,115200
x_bootargs_root=ubi.mtd=2 root=ubi0:rootfs rootfstype=ubifs
Marvell>> setenv bootcmd 'usb start;fatload usb 1 900000 kernel.bin;go 900000'
Marvell>> saveenv
Au chapitre des mauvaises nouvelles, le GuruPlug peut servir de chauffage d'appoint, mge1 est aux abonnés absents mais c'est en cours. Le lecteur de carte SD, la carte wifi, le bluetooth, ma clef usb fâchée avec le cache me réservent encore de belles soirées.
Dernier re-re-re-fail pour la route: si le GuruPlug JTAG Board est uniquement branché au GuruPlug, le bousin ne démarre pas.
Pour les curieux, un dmesg kivabien.
Update: c'est qui l'enfant de salaud qui m'a piqué mon adresse MAC ? Preuve que l'ipv6 c'est magique.> ifconfig mge0 mge0: flags=8843Update 2:metric 0 mtu 1500 options=8000b ether 00:00:00:00:00:00 inet 192.168.0.2 netmask 0xffffff00 broadcast 192.168.0.255 inet6 fe80::845:3302:619b:ed0b%mge0 prefixlen 64 scopeid 0x1 inet6 2001:470:ca75:10:845:3302:619b:ed0b prefixlen 64 autoconf nd6 options=23 media: Ethernet autoselect (100baseTX ) status: active d531:~> ping6 -c 1 2001:470:ca75:10:845:3302:619b:ed0b PING 2001:470:ca75:10:845:3302:619b:ed0b(2001:470:ca75:10:845:3302:619b:ed0b) 56 data bytes 64 bytes from 2001:470:ca75:10:845:3302:619b:ed0b: icmp_seq=1 ttl=63 time=11.9 ms --- 2001:470:ca75:10:845:3302:619b:ed0b ping statistics --- 1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 11.969/11.969/11.969/0.000 ms
> grep mge0 /etc/rc.conf ifconfig_mge0="ether 00:50:43:aa:aa:aa" ifconfig_mge0_alias0="inet 192.168.0.2 netmask 255.255.255.0 broadcast 192.168.0.255" ifconfig_mge0_ipv6="RTADV" > ifconfig mge0 mge0: flags=8843metric 0 mtu 1500 options=8000b ether 00:50:43:aa:aa:aa inet6 fe80::250:43ff:feaa:aaaa%mge0 prefixlen 64 scopeid 0x1 inet 192.168.0.2 netmask 0xffffff00 broadcast 192.168.0.255 inet6 2001:470:ca75:10:250:43ff:feaa:aaaa prefixlen 64 autoconf nd6 options=23 media: Ethernet autoselect (100baseTX ) status: active
14/05/2010
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:
- make builworld + installworld
- make buildkernel avec un mfs
- make buildkernel
- sur une clef usb, copier les deux kernel + un tbz de l'arborescence du installworld
- booter sur le kernel mfs
- partitionner/formater le disque dur
- détar du tbz, copie du kernel
- configurer U-Boot
- prier
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 0Je 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.binPour 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.confAu 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>> saveenvLe 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.
![Validate my Atom 1.0 feed [Valid Atom 1.0]](/valid-atom.png)
![Validate my RSS feed [Valid RSS]](/valid-rss-rogers.png)