09/06/2010
[ cblog ]
bapt: spéciale dédicace. Il est pas beau ce CBlog 0.1 ?
Update: 0.1.1
27/05/2010
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 le lire ici, là 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=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=8000b<RXCSUM,TXCSUM,VLAN_MTU,LINKSTATE>
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<PERFORMNUD,ACCEPT_RTADV,AUTO_LINKLOCAL>
media: Ethernet autoselect (100baseTX <full-duplex>)
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
Update 2:
> 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=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=8000b<RXCSUM,TXCSUM,VLAN_MTU,LINKSTATE>
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<PERFORMNUD,ACCEPT_RTADV,AUTO_LINKLOCAL>
media: Ethernet autoselect (100baseTX <full-duplex>)
status: active
14/05/2010
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 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.
26/04/2010
[ certification bsd ]
Quelle que soit l'importance que l'on peut accorder à une certification, je pense que tous les moyens sont bons pour promouvoir les BSD. Il n'y a pas matière à faire le fier mais le résultat est arrivé ce matin et je dois reconnaitre que cela fait bien plaisir.
J'en profite pour remercier les gentils organisateurs et souhaiter un bon courage à tous ceux qui (re)passeront cette certification.
20/04/2010
Dans un précédent billet, je décrivais ma configuration xen. Il ne me manquait qu'une seule chose: l'ipv6. Je dois bien avouer que ça ne s'est pas fait en un jour.
J'ai commencé par configurer mon routeur:
root@fonera# route -A inet6 add 2001:470:ca75:100::/64 gw 2001:470:ca75:20:224:1ff:fe0f:f84c
Où 2001:470:ca75:100::/64 est le réseau dédié aux hosts xen et 2001:470:ca75:20:224:1ff:fe0f:f84c l'ipv6 du dongle wifi du portable. Qui dit routage dit forwarding:
root@d531# grep forwarding= /etc/sysctl.conf
net.ipv6.conf.all.forwarding=1
Et pour éviter un message désagréable au boot:
root@d531# echo 'ipv6' >> /etc/modules
J'ai cru avoir une bonne idée en utilisant eth0 (qui me sert très peu) mais c'est vraiment une très mauvaise idée:
root@d531# tail -n 8 /etc/network/interfaces
auto eth0
iface eth0 inet static
address 192.168.1.116
netmask 255.255.255.0
iface eth0 inet6 static
address 2001:470:ca75:100::1
netmask 64
root@d531# ifconfig eth0 | grep inet6
adr inet6: 2001:470:ca75:100::1/64 Scope:Global
root@d531# ping6 -c 1 -W 1 2001:470:ca75:100::1
PING 2001:470:ca75:100::1(2001:470:ca75:100::1) 56 data bytes
--- 2001:470:ca75:100::1 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms
L'absence d'adresse lien-local ne doit pas être innocente dans cette affaire. Une (lllooonnnggggguuuuueeee) série de ping, reboot, man, google, ifup/ifdown plus tard, une idée me traverse la tête: pourquoi ne pas utiliser une interface virtuelle ?
root@d531# tail -n 8 /etc/network/interfaces
auto dummy0
iface dummy0 inet static
address 10.0.0.1
netmask 255.255.255.0
iface dummy0 inet6 static
address 2001:470:ca75:100::1
netmask 64
root@d531# ifconfig dummy0 | grep inet6
adr inet6: 2001:470:ca75:100::1/64 Scope:Global
adr inet6: fe80::9082:a4ff:fe06:92bc/64 Scope:Lien
root@d531# ping6 -c 1 -W 1 2001:470:ca75:100::1
PING 2001:470:ca75:100::1(2001:470:ca75:100::1) 56 data bytes
64 bytes from 2001:470:ca75:100::1: icmp_seq=1 ttl=64 time=0.030 ms
--- 2001:470:ca75:100::1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.030/0.030/0.030/0.000 ms
root@linuto# ping6 -n -c 1 2001:470:ca75:100::1
PING6(56=40+8+8 bytes) 2001:470:ca75:10:214:bff:fe80:337b --> 2001:470:ca75:100::1
16 bytes from 2001:470:ca75:100::1, icmp_seq=0 hlim=63 time=7.855 ms
--- 2001:470:ca75:100::1 ping6 statistics ---
1 packets transmitted, 1 packets received, 0.0% packet loss
round-trip min/avg/max/std-dev = 7.855/7.855/7.855/nan ms
It works! Passons à la configuration de xen. Le script vif-route ne prend pas en compte l'ipv6. Heureusement, je ne suis pas seul: http://notes.benv.junerules.com/all/software/xen-and-routed-ipv6/.
J'en profite pour proposer une version perless ici. On précise à xen qu'on utilise une autre interface qu'eth0:
root@d531# grep '\-route' /etc/xen/xend-config.sxp
(network-script 'network-route netdev=dummy0')
(vif-script 'vif-route netdev=dummy0')
Un dernier reboot pour vérifier que le tout survit à un redémarrage et c'est parti:
root@d531# grep vif /etc/xen/openwrt.bsdsx.fr.cfg
vif = [ 'ip=10.0.0.33 2001:470:ca75:100::33,mac=00:16:3E:6D:BB:94' ]
root@d531# xm create -c openwrt.bsdsx.fr.cfg
[ snip boot ]
root@OpenWrt:/# ifconfig br-lan|grep inet6
inet6 addr: 2001:470:ca75:100::33/64 Scope:Global
inet6 addr: fe80::ac65:afff:fed8:dcc4/64 Scope:Link
Et ça marche ?
root@linutop# traceroute6 -n 2001:470:ca75:100::33
traceroute6 to 2001:470:ca75:100::33 (2001:470:ca75:100::33) from 2001:470:ca75:10:214:bff:fe80:337b, 64 hops max, 12 byte packets
1 2001:470:ca75:10::1 1.761 ms 1.73 ms 1.324 ms
2 2001:470:ca75:20:224:1ff:fe0f:f84c 4.317 ms 9.467 ms 10.127 ms
3 *^C
Hum, pas trop. Un coup de tcpdump plus tard et je me rends compte qu'il manque une route par défaut sur l'invité:
root@OpenWrt:/# ip -6 ro add default via 2001:470:ca75:100::1
root@OpenWrt:/# ping6 -c 1 www.kame.net
PING www.kame.net (2001:200:0:8002:203:47ff:fea5:3085): 56 data bytes
64 bytes from 2001:200:0:8002:203:47ff:fea5:3085: seq=0 ttl=52 time=314.763 ms
--- www.kame.net ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 314.763/314.763/314.763 ms
Un dernier tour sur http://wiki.openwrt.org/doc/uci/network pour enregistrer la route:
root@OpenWrt:/# tail -n 4 /etc/config/network
config 'route6'
option 'interface' 'lan'
option 'target' 'default'
option 'gateway' '2001:470:ca75:100::1'
Et voilà, c'est bon, servez chaud. Bon appétit.
03/04/2010
Depuis quelques temps, ce billet me trottait dans la tête. Petit récapitulatif:
- le dom0 est une debian lenny 64 bits qui accède au réseau grâce au wifi
- mon routeur est une fonera sous openwrt
- j'ai envie de faire le foufou avec openwrt et des configs ultralight
Une recherche avec xen bridge wifi et me voila à configurer mes domU en mode routeur:
d531:~> grep script /etc/xen/xend-config.sxp | grep -v "^#"
(network-script network-route)
(vif-script vif-route)
Mon interface eth0 ne me sert (presque) à rien:
d531:~> /sbin/ifconfig eth0 | grep 'inet adr'
inet adr:10.0.0.1 Bcast:10.255.255.255 Masque:255.0.0.0
Afin que mes domU puissent accéder au nain ternet, j'ajoute une route sur mon routeur:
root@fonusb# route add -net 10.0.0.0 netmask 255.255.255.0 gw 172.16.10.116
root@fonusb# tail -n 5 /etc/config/network
config 'route' 'xen'
option 'interface' 'wpa'
option 'target' '10.0.0.0'
option 'netmask' '255.255.255.0'
option 'gateway' '172.16.10.116'
Où 10.0.0.0 est le réseau de mes domU, 172.16.10.116 l'ip de mon dom0 et wpa le nom logique de mon interface. Voir ici pour la configuration d'une route sous openwrt.
Concernant openwrt, mes tentatives de compilation sur ma machine 64 bits se sont soldées par un cuisant échec. J'ai opté pour une solution simple: un chroot 32 bits. La documentation ne manque pas, je ne vais pas détailler l'opération.
Une fois dans mon chroot et l'installation des paquets nécessaires, on peut commencer à jouer:
bsdsx@chroot> svn co svn://svn.openwrt.org/openwrt/trunk/
bsdsx@chroot> cd trunk
bsdsx@chroot> ./script/feeds update
bsdsx@chroot> make prereq
Et c'est parti pour une partie de coche-mi coche-moi:
Target System
[x] x86
Subtarget
[x] Xen Paravirt Guest
Global build settings
[ ] Compile the kernel with Debug Filesystem enabled
Kernel modules
Xen paravirtualized guest support
[x] kmod-xen-evtchn
[ ] kmod-xen-fbdev
[x] kmod-xen-fs
[x] kmod-xen-kbddev
[x] kmod-xen-netdev
Une fois le make terminé, on installe le tout:
dsx@d531> sudo cp /usr/local/src/x86_32/home/bsdsx/src/svn/openwrt/trunk/bin/x86/openwrt-x86-ext2.fs /usr/local/xen/
dsx@d531> sudo cp /usr/local/src/x86_32/home/bsdsx/src/svn/openwrt/trunk/bin/x86/openwrt-x86-vmlinuz /usr/local/xen/
La configuration du domU:
dsx@d531:/etc/xen> cat /etc/xen/openwrt.bsdsx.fr.cfg
kernel = '/usr/local/xen/openwrt-x86-vmlinuz'
memory = '32'
root = '/dev/xvda1 rw'
disk = [ 'file:/usr/local/xen/openwrt-x86-ext2.fs,xvda1,w', ]
name = 'openwrt.bsdsx.fr'
vif = [ 'ip=10.0.0.33,mac=00:16:3E:6D:BB:94' ]
gateway = '10.0.0.1'
on_poweroff = 'destroy'
on_reboot = 'restart'
on_crash = 'restart'
extra = 'console=hvc0 xencons=tty'
Et c'est parti (attention c'est rapide !):
dsx@d531> sudo xm create -c openwrt.bsdsx.fr.cfg
[ snip boot ]
root@OpenWrt:/# cat /proc/version
Linux version 2.6.32.10 (dsx@d531.bsdsx.fr) (gcc version 4.1.2) #5 SMP Sat Apr 3 08:56:39 UTC 2010
root@OpenWrt:/# tail -n 7 /etc/config/network
config interface lan
option ifname eth0
option proto static
option ipaddr 10.0.0.33
option netmask 255.255.255.0
option gateway 10.0.0.1
option dns 172.16.10.254
On retrouve dans la configuration:
- 10.0.0.1 l'ip de eth0 du dom0
- 172.16.10.254 l'ip du routeur où tourne un dnsmasq
Et ça marche ?
root@OpenWrt:/# ping -c 1 www.google.fr
PING www.google.fr (209.85.229.147): 56 data bytes
64 bytes from 209.85.229.147: seq=0 ttl=53 time=34.268 ms
--- www.google.fr ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 34.268/34.268/34.268 ms
28/03/2010
[ cblog chroot nginx reverse proxy ]
Pour ceux qui ne connaissent pas, cblog est un moteur de blog écrit en C. J'y contribue un peu et je vais donc décrire comment je l'utilise.
Une fois les dépendances installées (clearsilver, fcgi-devkit et tinycdb), on peut récupérer cblog:
dsx@devel> git clone git://brokk.etoilebsd.net/CBlog.git
dsx@devel> cd CBlog
dsx@devel> make
On peut définir le chemin vers le fichier cblog.cdb:
dsx@devel> make CDB_PATH=/var/db
Pour vérifier ce chemin (utile pour le chroot):
dsx@devel> ./cli/cblogctl path
/var/db/cblog.cdb
Les chroot c'est bien mais il est très facile d'oublier un fichier. Pas de soucis ici:
dsx@devel> sudo ./chroot_cblog.sh
chroot_cblog.tgz contient tout ce qu'il nous faut. On ne peut pas utiliser Freebsd et zfs sans faire de jail. J'utilise pour ce faire deux petits scripts de ma composition:
root@kimsufi# ./mk_template medium
root@kimsufi# ./mk_template large
root@kimsufi# ./mk_jail medium proxy 'lo1|172.16.0.1'
root@kimsufi# ./mk_jail large blog 'lo1|172.16.0.2'
Une jail 'proxy' avec un nginx servira de reverse proxy tandis qu'une jail 'blog' fera tourner cblog dans un chroot.
Je commence par faire mon package 'nginx':
dsx@compil> cd /usr/ports/www/nginx-devel
dsx@compil> sudo make config
[x] ipv6
[x] http_module
[x] http_cache_module
[x] http_rewrite_module
[x] http_ssl_module
[x] www
dsx@compil> sudo make
dsx@compil> sudo make package
Je configure mon reverse proxy:
dsx@proxy> sudo pkg_add /tmp/nginx-devel-0.8.34.tbz
dsx@proxy> sudoedit /usr/local/etc/nginx/nginx.conf
[ snip ]
server {
listen 80;
server_name blog.bsdsx.fr;
access_log off;
location / {
proxy_pass http://172.16.0.2/;
proxy_set_header Host $host;
}
}
Attention au 'access_log' à 'off', c'est uniquement pour ne pas logguer plusieurs fois les requêtes. On passera à off une fois le reverse proxy correctement configuré (chemin, adresse ip...). Pour ceux qui se demande pourquoi un reverse proxy la réponse est simple: si je peux multiplier les jails, il n'en est pas de même avec mes ipv4. Tout le traffic http sur ipv4 arrive sur le reverse proxy qui dispatche vers la bonne jail (qui elle est accessible aussi en ipv6). De plus si un jour le besoin de cache se fait sentir, quelques directives 'proxy_cache_* et 'fastcgi_cache_*' et le tour est joué.
Pour finir le gros morceau: la jail 'blog' avec son chroot.
root@blog# pkg_add -r spawn-fcgi
Fetching ftp://ftp.fr.freebsd.org/pub/FreeBSD/ports/amd64/packages-8.0-release/Latest/spawn-fcgi.tbz... Done.
root@blog# mkdir /usr/local/chroot/bsdsx
root@blog# tar xzvf /tmp/chroot_cblog.tgz -C /usr/local/chroot/bsdsx
Et c'est parti pour la lecture de chroot.txt.
13/02/2010
Une fois que l'on a goûté aux jails, il devient difficile de s'en passer. Un nouveau projet, le test d'une configuration, tout est prétexte à un /etc/rc.d/jail start manouvellejail
Pour les loutres qui pensent que la solution officielle est un peu overkill, que le principe de lien+nullfs de ezjail ne correspond pas à leur besoin, je vous propose une solution à base de zfs, car zfs c'est le bien.
Bien qu'une telle solution me trottait dans la tête depuis un certain temps, je me suis largement inspiré de ce courriel.
On commence par télécharger le tgz-ki-va-bien.
> tar tzf jail.tgz
./jail/
./jail/tiny.jail
./jail/mk_template.sh
./jail/mk_jail.sh
./jail/medium.jail
./jail/large.jail
./jail/jail.common
Un rapide coup d'oeil dans mk_template.sh et jail.common nous apprend qu'il faut commencer par récupérer les sets base et manpages, sans doute la partie la plus difficile :).
Une fois cette délicate opération réalisée, à nous les joies de la création de jail:
> sudo ./mk_template.sh medium
Create 'medium' template
Create 'medium' fs
Populate 'medium'
Configure /etc/rc.conf for jail 'medium'
Configure 'medium'
Configure 'medium' /etc/rc.conf
Configure 'medium' /etc/ssh/sshd_config
Configure 'medium' /etc/resolv.conf
Configure 'medium' /etc/mail/submit.cf
Configure 'medium' /etc/periodic.conf
Configure 'medium' /etc/csh.cshrc
Configure 'medium'
'medium': done
Template medium is ready to snapshot
Next step:
- /etc/rc.d/jail start medium
- jexec medium /bin/csh
configure medium
add users (dsx)
add packages (sudo, rsync, vim, tmux ...)
...
- /etc/rc.d/jail stop medium
mk_jail medium www "lo1|172.16.0.1"
mk_jail medium www2 "lo1|172.16.0.2,em0|2001:a:b:c:d:e:f:80" /=5G
mk_jail medium www3 "vr0|2001:a:b:c:d:e:f:80" /=5G /tmp=1024M
Une jail de base est créée à partir de medium.jail. Une fois cette jail configurée on peut utiliser les fonctionnalités de zfs (snapshot + clone):
> sudo ./mk_jail.sh medium ldap "em0|2001:7a8:820:0:216:3eff:fe11:2231" /=1G /tmp=512M /var=1G
Create 'medium' snapshot
Done
Create 'medium' clone
Done
'ldap' is ready to start: /etc/rc.d/jail start ldap
Le tout est sous licence demerdeuneziziche et les modifications éventuelles sous licence larache. Enjoy :)
Update:
git clone git://repo.bsdsx.fr/mk_jail
Ou alors repo.bsdsx.fr
08/02/2010
Firefox, vimperator et netbook
[ firefox vimperator netbook ]
La résolution des écrans de netbook étant ce quelle est (1024x600 pour ma part), un firefox avec moultes barres pouetpouet réduit très vite la surface d'affichage des pages web. Pour aller à l'essentiel, vimperator est notre ami. Mais ce n'est pas assez à mon goût.
Un petit tour dans about:config
browser.tabs.closeButtons => 2
Direction $HOME/.mozilla/firefox/répertoire-qui-va-bien/chrome/userChrome.css
/* Le vilain + pour ajouter un onglet */
.tabs-newtab-button { display: none; }
/* La vilaine zone de liste a droite de la barre d'onglet */
.tabs.alltabs-button { display: none; }
/* Les vilaines favicon */
.tab-icon { display: none; }
/* si .tab-icon pamarche */
/* .tab-icon-image { display:none !important; } */
/* On peut enfin diminuer la taille des onglets */
tab { font:size: 6px; }
Vimperator: hauteur limitée
$ echo "colorscheme tiny" >> $HOME/.vimperatorrc
$ cat $HOME/.vimperator/colors/tiny.vimp
hi CmdLine font-size: 10px;
hi StatusLine font-size: 10px;
Pour la route: désactiver toutes les mises à jour automatiques c'est vraiment pas mal quand il faut redémarrer firefox plusieurs fois de suite.
31/01/2010
Pour faire suite à l'article sur le blocage de site paru dans le GLMF n° 124, je vous propose sa déclinaison OpenWRT.
/etc/config/dhcp:
config dnsmasq
[ snip config ]
list address '/ads.google.com/127.0.0.1'
list address '/google-analytics.com/127.0.0.1'
list address '/smartadserver.com/127.0.0.1'
list address '/adsense.com/127.0.0.1'
list address '/adsense.fr/127.0.0.1'
list address '/doubleclick.net/127.0.0.1'
L'option address n'étant pas encore reconnue par le script d'init de dnsmasq (/etc/init.d/dnsmasq), on va lui rajouter une fonction et une ligne de commande supplémentaire.
OpenWRT 8.09 (et antérieur)
dhcp_address_add() {
local cfg="$1"
config_get address "$cfg" address
for o in $address; do
append args "--address=$o"
done
}
start() {
[ snip config_foreach ... ]
config_foreach dhcp_address_add dnsmasq # appel de notre fonction
/usr/sbin/dnsmasq $args && {
OpenWRT 8.09.1 (et ultérieur)
append_address() {
append args "--address=$1"
}
dnsmasq() {
[ snip append ... ]
config_list_foreach "$cfg" "server" append_server
config_list_foreach "$cfg" "interface" append_interface
config_list_foreach "$cfg" "address" append_address # appel de notre fonction
append_parm "$cfg" "leasefile" "-l"
...
Et un restart plus tard:
dsx@linutop>host www.adsense.com
www.adsense.com has address 127.0.0.1
Rss