Tags

arm arpaname bin_sh blocage blosxom bsd bsdfrance cblog certification chroot cluster dg834 dhcp diffusion dns dnsmasq domU dovecot fail-over fail2ban firefox fossil freebsd ftp git guruplug install ipv6 jail kernel kimsufi lex libre linutop liste makefile mikrotik ml150 mohawk nanojail netbook netbsd nginx ntp ntp.org openbsd openntpd openrd opensmtpd openwrt orke pkgng poudriere privee proxy pxe python rc.conf rescue reverse rmll route rrdcgi sendmail serial sieve sjail sl2009 ssd sshd symon unbound update usb var_empty vimperator world xen yacc zfs

Powered by

blOg
maRkdown
awK
shEll

02/10/2015

[ freebsd rc.conf ]

201510021800 freebsd rc.conf

Configurer FreeBSD

Pour autant que je me souvienne, la configuration d'un système FreeBSD s'est toujours faite en éditant un unique fichier: /etc/rc.conf.

Nom de la machine, configuration des interfaces réseau, type de clavier, listes des services à démarrer, tout y est, tout y passe.

Pourtant, depuis l'importation du système NetBSD 1.5 RC il y a plus de 14 ans, il était possible de séparer la configuration dans différents fichiers au sein du répertoire /etc/rc.conf.d/.

532 	load_rc_config()
533 	{
534 	        _command=$1
535 	        if [ -z "$_command" ]; then
536 	                err 3 'USAGE: load_rc_config command'
537 	        fi
538
539 	        . /etc/rc.conf
540 	        if [ -f /etc/rc.conf.d/"$_command" ]; then
541 	                . /etc/rc.conf.d/"$_command"
542 	        fi
543 	}

Les afficionados des systèmes de contrôle de version (rcs, cvs, subversion, git, mercurial ...) et/ou des gestionnaires de configuration (puppet, chef, ansible, salt ...) y verront je pense un certain intéret:

La configuration d'un portable pourrait se faire comme suit:

/etc/rc.conf.d/hostname
hostname="n150.bsdsx.fr"

/etc/rc.conf.d/network
wlans_ath0="wlan0"
ifconfig_wlan0="WPA DHCP"

/etc/rc.conf.d/ntpd
ntpd_enable="YES"

/etc/rc.conf.d/powerd
powerd_enable="YES"

/etc/rc.conf.d/sendmail
sendmail_enable="NONE"

/etc/rc.conf.d/syscons
keymap="fr.iso.acc.kbd"

Mais depuis la révision 270392, il est possible de découper la configuration d'un service encore plus finement:

1292 	if [ -f /etc/rc.conf.d/"$_name" ]; then
1293 	        debug "Sourcing /etc/rc.conf.d/$_name"
1294 	        . /etc/rc.conf.d/"$_name"
1295 	elif [ -d /etc/rc.conf.d/"$_name" ] ; then
1296 	        local _rc
1297 	        for _rc in /etc/rc.conf.d/"$_name"/* ; do
1298 	                if [ -f "$_rc" ] ; then
1299 	                        debug "Sourcing $_rc"
1300 	                        . "$_rc"
1301 	                fi
1302 	        done
1303 	fi

La configuration d'un serveur pourrait se faire comme suit:

/etc/rc.conf.d/hostname
hostname="n150.bsdsx.fr"

/etc/rc.conf.d/ntpd
ntpd_enable="YES"

/etc/rc.conf.d/sendmail
sendmail_enable="NONE"

/etc/rc.conf.d/syscons
keymap="fr.iso.acc.kbd"

/etc/rc.conf.d/routing
defaultrouter="192.0.2.1"
ipv6_defaultrouter="2001:db8:0:dead:beef::1"

/etc/rc.conf.d/ipfw/ipfw
firewall_enable="YES"
firewall_type="/etc/rc.conf.d/ipfw/rules"

/etc/rc.conf.d/ipfw/log
firewall_logging="YES"
firewall_logif="YES"

/etc/rc.conf.d/network/cloned
cloned_interfaces="lo1 lo2"

/etc/rc.conf.d/network/bce0
ifconfig_bce0="inet 192.0.2.2 netmask 255.255.255.0"
ifconfig_bce0_ipv6="inet6 2001:db8:0:dead:beef::2 prefixlen 64"

/etc/rc.conf.d/network/lo1
ifconfig_lo1="inet 172.16.0.1 netmask 255.255.0.0"

/etc/rc.conf.d/network/lo2
ifconfig_lo2_ipv6="inet6 2001:db8:1337::1 prefixlen 64"

/etc/rc.conf.d/sshd/sshd
sshd_enable="YES"

/etc/rc.conf.d/sshd/flags
sshd_flags="-o UsePAM=no -o AllowGroups=wheel -o PermitRootLogin=without-password -o ListenAddress=localhost"

Et oui, attention aux routes par défaut, c'est bien dans routing et pas dans network.


Lien vers ce billet

01/11/2014

[ freebsd pxe serial ]

201411011200 freebsd pxe serial

FreeBSD, pxeboot et port série

Il est toujours utile d'avoir un pxeboot supportant le port série, pour au hasard installer freebsd en tant que domU hvm sans utiliser de console graphique.

J'ai à ma disposition:

Je commence par chercher les options supportées par le Makefile de pxeboot:

# find /usr/src/ -type d -name '*pxe*'
/usr/src/sys/boot/i386/pxeldr
# ls /usr/src/sys/boot/i386/pxeldr
Makefile        pxeboot.8       pxeldr.S
# grep '^.if ' /usr/src/sys/boot/i386/pxeldr/Makefile
.if defined(BOOT_PXELDR_PROBE_KEYBOARD)
.if defined(BOOT_PXELDR_ALWAYS_SERIAL)

Je prépare un petit script:

# cat $HOME/bin/serial_pxeboot.sh
#!/bin/sh

SRCCONF=$HOME/etc/pxe/src.conf
if [ ! -f "${SRCCONF}" ]; then
    "'${SRCCONF}': file not found. Exit"
    exit 1
fi

export SRCCONF

cd sys/boot/i386/pxeldr && make clean && make

J'active l'option kivabien:

# cat $HOME/etc/pxe/src.conf
BOOT_PXELDR_ALWAYS_SERIAL=yes

Permier essai:

# $HOME/bin/serial_pxeboot.sh
rm -f pxeboot pxeboot.tmp loader pxeldr pxeldr.o pxeboot.8.gz pxeboot.8.cat.gz
Warning: Object directory not changed from original /usr/src/sys/boot/i386/pxeldr
cc -O2 -pipe  -march=i386 -ffreestanding -mpreferred-stack-boundary=2  -mno-mmx -mno-3dnow -mno-sse -mno-sse2 -mno-sse3 -msoft-float -m32 -DALWAYS_SERIAL -I/usr/src/sys/boot/i386/pxeldr/../common -std=gnu99 -Qunused-arguments   -no-integrated-as  -m32 -c pxeldr.S
cc -O2 -pipe  -march=i386 -ffreestanding -mpreferred-stack-boundary=2  -mno-mmx -mno-3dnow -mno-sse -mno-sse2 -mno-sse3 -msoft-float -m32 -DALWAYS_SERIAL -I/usr/src/sys/boot/i386/pxeldr/../common -std=gnu99 -Qunused-arguments     -nostdlib -m elf_i386_fbsd -e start -Ttext 0x7c00 -Wl,-N,-S,--oformat,binary -o pxeldr pxeldr.o
gzip -cn pxeboot.8 > pxeboot.8.gz
make: don't know how to make /usr/src/sys/boot/i386/pxeldr/../loader/loader.bin. Stop

make: stopped in /usr/src/sys/boot/i386/pxeldr

Les options supportées pour la construction de loader.bin:

# grep '^.if ' /usr/src/sys/boot/i386/loader/Makefile
.if defined(LOADER_FIREWIRE_SUPPORT)
.if defined(LOADER_ZFS_SUPPORT)
.if defined(LOADER_TFTP_SUPPORT)
.if ${MK_FORTH} != "no"
.if defined(LOADER_BZIP2_SUPPORT)
.if !defined(LOADER_NO_GZIP_SUPPORT)
.if defined(LOADER_NANDFS_SUPPORT)
.if !defined(LOADER_ONLY)
.if !exists(${DESTDIR}/boot/loader.rc)
.if !exists(${DESTDIR}/boot/menu.rc)
.if ${MACHINE_CPUARCH} == "amd64"

A la lecture du Makefile je m'aperçois qu'il est question de /etc/make.conf. Pour faire simple, je vais utiliser un unique fichier avec mes options.

# cat $HOME/etc/pxe/src.conf
BOOT_PXELDR_ALWAYS_SERIAL=yes
LOADER_TFTP_SUPPORT=yes
WITHOUT_FORTH=yes
LOADER_BZIP2_SUPPORT=yes
LOADER_NO_GZIP_SUPPORT=yes

Le script:

#!/bin/sh

SRCCONF=$HOME/etc/pxe/src.conf
DIR=sys/boot/i386

if [ ! -f "${SRCCONF}" ]; then
    "'${SRCCONF}': file not found. Exit"
    exit 1
fi
__MAKE_CONF=${SRCCONF}
export SRCCONF __MAKE_CONF

if [ ! -d "${DIR}" ]; then
    echo "'${DIR}' not exists. Exit."
    exit 1
fi
cd ${DIR}

DIRS="loader pxeldr"

for dir in ${DIRS}; do
    cd ${dir} && make clean && cd ..
done
for dir in ${DIRS}; do
    cd ${dir} && make
    if [ $? -ne 0 ]; then
        echo "Can't make '${dir}'. Exit"
        exit 1
    fi
    cd ..
done

Deuxième essai:

# $HOME/bin/serial_pxe.sh
[ snip des trucs ]
cc: error: no such file or directory: '/usr/src/sys/boot/i386/loader/../btx/lib/crt0.o'
cc: error: no such file or directory: '/usr/src/sys/boot/i386/loader/../libi386/libi386.a'
*** Error code 1

Stop.
make: stopped in /usr/src/sys/boot/i386/loader
Can't make 'loader'. Exit

On devine qu'il nous manque libi386 et btx. Leur Makefile respectif ne semble pas définir d'option particulière.

Je rajoute les répertoires dans mon script:

# grep ^DIRS $HOME/bin/serial_pxeboot.sh
DIRS="libi386 btx loader pxeldr"

Au résultat:

# $HOME/bin/serial_pxeboot.sh
[ snip des trucs ]
cat pxeldr loader > pxeboot.tmp
dd if=pxeboot.tmp of=pxeboot obs=2k conv=osync
369+1 records in
93+0 records out
190464 bytes transferred in 0.001461 secs (130362911 bytes/sec)
rm pxeboot.tmp
# ls -l sys/boot/i386/pxeldr/pxeboot
-rw-r--r--  1 root  wheel  190464 Nov  1 07:46 sys/boot/i386/pxeldr/pxeboot
# sha256 sys/boot/i386/pxeldr/pxeboot
SHA256 (sys/boot/i386/pxeldr/pxeboot) = 8ac08d2af6df8ebc3b0701efd0867daa413c08775dac5073735c9f1cd5e4b476

Pour les plus attentifs, il est inutile de désactiver les drapeaux en relation avec les disques durs et les partitions (-DLOADER_DISK_SUPPORT -DLOADER_GPT_SUPPORT -DLOADER_MBR_SUPPORT) sous prétexte que notre pxe charge le noyau par le réseau. Le code du loader était là bien avant l'arrivée du pxe et, pour avoir essayé, désactiver ces drapeaux rend le code invalide.

Il ne reste plus qu'à configurer le tftp de mon dom0 NetBSD:

$ ifconfig tap4 | grep 'inet '
    inet 10.40.20.1 netmask 0xffffff00 broadcast 10.40.20.255
$ dig dom0-gw +short
10.40.20.1
$ grep tftp /etc/inetd.conf
dom0-gw:tftp            dgram   udp     wait    root    /usr/libexec/tftpd      tftpd -l -s /xen/tftpboot
$ cd /xen/tftpboot
$ ftp -o freepxeboot http://download.bsdsx.fr/freebsd/pxeboot

ainsi que le dhcpd:

$ cat /etc/dhcpd.conf
[ snip ]
host freebsd-001 { hardware ethernet 00:16:3e:00:11:04; fixed-address 10.40.20.11;
     filename "freepxeboot";
     next-server 10.40.20.1;
}
[ snip ]

et préparer un domU:

$ cd /xen/disks
$ ftp ftp://ftp.fr.freebsd.org/pub/FreeBSD/snapshots/VM-IMAGES/11.0-CURRENT/amd64/Latest/FreeBSD-11.0-CURRENT-amd64.raw.xz
$ unxz FreeBSD-11.0-CURRENT-amd64.raw.xz
$ cat /xen/etc/freebsd-hvm-current.cfg
builder = 'hvm'
memory = 256
name = 'freebsd-001.bsdsx.fr'
nicks = 2
vif = [ 'mac=00:16:3e:00:11:04, bridge=bridge4', 'mac=00:16:3e:00:11:06, bridge=bridge6' ]
disk = [
	'file:/xen/disks/FreeBSD-11.0-CURRENT-amd64.raw,hda,rw'
]
boot = 'c'
serial = 'pty'
vnc = 0
on_reboot="destroy"

Permier démarrage:

$ sudo xl create /xen/etc/freebsd-hvm-current.cfg -c "boot = 'n'"
Parsing config from /xen/etc/freebsd-hvm-current.cfg
xc: info: VIRTUAL MEMORY ARRANGEMENT:
  Loader:        0000000000100000->0000000000171de4
  TOTAL:         0000000000000000->000000000f800000
  ENTRY ADDRESS: 0000000000100000
xc: info: PHYSICAL MEMORY ALLOCATION:
  4KB PAGES: 0x0000000000000200
  2MB PAGES: 0x000000000000007b
  1GB PAGES: 0x0000000000000000
Daemon running with PID 1563
net0: 00:16:3e:00:11:04 on PCI00:04.0 (open)
  [Link:up, TX:0 TXE:0 RX:0 RXE:0]
DHCP (net0 00:16:3e:00:11:04).... ok
net0: 10.40.20.11/255.255.255.0 gw 10.40.20.1
Booting from filename "freepxeboot"
tftp://10.40.20.1/freepxeboot. ok
Consoles: serial port  
BIOS drive C: is disk0

PXE version 2.1, real mode entry point @9ab9:0344
BIOS 618kB/251496kB available memory

FreeBSD/x86 bootstrap loader, Revision 1.1
(root@blade.bsdsx.xxx, Sat Nov  1 07:46:48 CET 2014)
pxe_open: server addr: 10.40.20.1
pxe_open: server path: /
pxe_open: gateway ip:  10.40.20.1
\
can't load 'kernel'

Type '?' for a list of commands, 'help' for more detailed help.
OK 

Un petit tour dans les logs:

$ tail /var/log/messages
Nov  1 08:13:35 dom0 tftpd[3539]: 10.40.20.11: read request for /boot/loader.rc.bz2: File not found
Nov  1 08:13:35 dom0 tftpd[10540]: 10.40.20.11: read request for /boot/loader.rc: File not found
Nov  1 08:13:35 dom0 tftpd[6888]: 10.40.20.11: read request for /boot/boot.conf.bz2: File not found
Nov  1 08:13:35 dom0 tftpd[3215]: 10.40.20.11: read request for /boot/boot.conf: File not found
Nov  1 08:13:35 dom0 tftpd[25944]: 10.40.20.11: read request for /boot/kernel/kernel.ko.bz2: File not found
Nov  1 08:13:35 dom0 tftpd[29596]: 10.40.20.11: read request for /boot/kernel/kernel.ko: File not found
Nov  1 08:13:35 dom0 tftpd[3591]: 10.40.20.11: read request for /boot/kernel/kernel.bz2: File not found
Nov  1 08:13:35 dom0 tftpd[9980]: 10.40.20.11: read request for /boot/kernel/kernel: File not found
Nov  1 08:13:35 dom0 tftpd[20777]: 10.40.20.11: read request for /boot/kernel/kernel.debug.bz2: File not found
Nov  1 08:13:35 dom0 tftpd[14883]: 10.40.20.11: read request for /boot/kernel/kernel.debug: File not found
Nov  1 08:13:35 dom0 tftpd[10770]: 10.40.20.11: read request for /boot/modules/kernel.ko.bz2: File not found
Nov  1 08:13:35 dom0 tftpd[28441]: 10.40.20.11: read request for /boot/modules/kernel.ko: File not found
Nov  1 08:13:35 dom0 tftpd[9190]: 10.40.20.11: read request for /boot/modules/kernel.bz2: File not found
Nov  1 08:13:35 dom0 tftpd[25233]: 10.40.20.11: read request for /boot/modules/kernel: File not found
Nov  1 08:13:35 dom0 tftpd[28245]: 10.40.20.11: read request for /boot/modules/kernel.debug.bz2: File not found
Nov  1 08:13:35 dom0 tftpd[16295]: 10.40.20.11: read request for /boot/modules/kernel.debug: File not found

Je place un kernel au bon endroit:

$ cd /xen/tftpboot
$ ftp ftp://ftp.fr.freebsd.org/pub/FreeBSD/snapshots/amd64/11.0-CURRENT/kernel.txz
$ tar -x --xz -f kernel.txz ./boot/kernel/kernel

Le deuxième essai se termine par:

loader variables:

manual root filesystem specification:
  <fstype>:<device> [options]
      mount <device> using filesystem <fstype>
      and with the specified (optional) option list.

    eg. ufs:/dev/da0s1a
        zfs:tank
        cd9660:/dev/acd0 ro
          (which is equivalent to: mount -t cd9660 -o ro /dev/acd0 /)

  ?               list valid disk boot devices
  .               yield 1 second (for background tasks)
  <empty line>    abort manual input

mountroot> 

Un oeil aux logs:

nov  1 11:23:40 dom0 tftpd[631]: 10.40.20.11: read request for /etc/fstab.bz2: file not found
nov  1 11:23:40 dom0 tftpd[762]: 10.40.20.11: read request for /etc/fstab: file not found

Il y aurait donc moyen de passer le fstab par tftp. Reste à définir son contenu:

mountroot> ?

list of geom managed disk devices:
  ufsid/544bb9f742228653 gptid/5a8b65b7-5c57-11e4-a093-002564f96db2 gpt/rootfs gptid/5a8b65a9-5c57-11e4-a093-002564f96db2 gpt/swapfs gptid/5a8b6586-5c57-11e4-a093-002564f96db2 gpt/bootfs ada0p3 ada0p2 ada0p1 ada0

Ce qui donne:

$ mkdir /xen/tftpboot/etc
$ cat >> /xen/tftpboot/etc/fstab
# Device          Mountpoint      FStype  Options Dump    Pass#
/dev/gpt/rootfs   /               ufs     rw      1       1
/dev/gpt/swapfs   none            swap    sw      0       0
^D

On peut se passer de cette étape en saisissant depuis l'invite:

mountroot> ufs:/dev/gpt/rootfs

Dernier essai:

[ snip des trucs ]
root@:~ # uname -a
FreeBSD  11.0-CURRENT FreeBSD 11.0-CURRENT #0 r273635: Sat Oct 25 14:23:40 UTC 2014     root@grind.freebsd.org:/usr/obj/usr/src/sys/GENERIC  amd64

Reste à configurer l'utilisation du port série:

root@:~ # echo 'console="comconsole"' > /boot/loader.conf

On peut désormer lancer le domU normalement:

$ sudo xl create /xen/etc/freebsd-hvm-current.cfg -c
[ snip des trucs ]
root@:~ # uname -a
FreeBSD  11.0-CURRENT FreeBSD 11.0-CURRENT #0 r273635: Sat Oct 25 14:23:40 UTC 2014     root@grind.freebsd.org:/usr/obj/usr/src/sys/GENERIC  amd64

Pour éviter les mauvaises surprises, ne pas oublier de faire un peu de nettoyage dans /xen/tftpboot.


Lien vers ce billet

30/12/2012

[ freebsd xen domU rescue ]

201212301200 freebsd xen domU rescue

Un domU à la sauce FreeBSD

J'ai à ma disposition un ordinateur portable Dell Latitude D810 généreusement doté de 2 Go de ram, d'un disque accueuillant de 40 Go, le tout propulsé par un unique mais véloce Pentium Mobile se déplaçant à la vitesse supersonique de 1.73 GHz. Tout ça à la portée du premier quidam venu c'est fou, non ?

Devant cette débauche de puissance, on ne peut que s'incliner. Et installer un NetBSD 6.0 i386 parce que les serviettes oranges ça roxe. Quelles sont les origines de cette roxitude ? Une déscendance directe avec Unix (le vrai, le seul et l'unique, sorti des entrailles d'un PDP 11 il y a plus de 40 ans) ? 20 ans d'histoire (sans compter sa longue gestion au sein du CSRG, hébergé par l'University of Berkeley, California) ? Une accointance particulière avec le projet Xen ? Son récent support de LVM ? Une communauté française particulièrement impliquée (de par ses contributions de qualité et de ses rassemblements de haut niveau) ?

Nul doute que nous sommes en présence d'un OS du bien. Il est aisé de trouver moultes documentations relatives à son installation (dans le cas contraire n'hésitez pas à vous procurer le Gnu Linux Magazine France n°115) et l'ajout de Xen (version 4.1) est trivial. Mais un OS du bien c'est bien, deux c'est mieux. Je me propose donc de détailler les différentes étapes menant à l'obtention d'un domU FreeBSD 9.0.

Les caractéristiques de la machine et une volonté de parcourir des chemins peu fréquentés expliquent les choix suivants:

Le projet FreeBSD ne proposant pas de kernel xenifié tout prêt, il va falloir passer par les sources. Une machine (même virtuelle) avec un FreeBSD i386 (le kernel compilé depuis une machine X86_64 n'était pas reconnu comme PAE, pré-requis indispensable à l'utilisation de Xen 4.1), la bible sous les yeux, les sources en version 9.0 fraichement récupérés et nous voilà prêt à compiler 2 kernels:

Point de compilation sans configuration et un peu de lecture. Inutile de compiler l'ensemble des modules, les divers périphériques disponibles dans un domU sont tous identifiés et intégrés dans le kernel. Seul bémol: la présence des options de debug. On peut, sans être trop téméraire, s'en passer aisément (tout comme de nfs dont je ne suis pas un fervent adepte):

# cat /usr/src/sys/i386/conf/XEN_PROD
include XEN

ident           XEN_PROD

makeoptions     DEBUG=
makeoptions     MODULES_OVERRIDE=

nooptions       SCTP                    # Stream Control Transmission Protocol
nooptions       NFSCL                   # New Network Filesystem Client
nooptions       NFSD                    # New Network Filesystem Server
nooptions       NFSLOCKD                # Network Lock Manager
nooptions       NFS_ROOT                # NFS usable as /, requires NFSCL

# Debugging for use in -current
nooptions       KDB                     # Enable kernel debugger support.
nooptions       DDB                     # Support DDB.
nooptions       GDB                     # Support remote GDB.
nooptions       DEADLKRES               # Enable the deadlock resolver
nooptions       INVARIANTS              # Enable calls of extra sanity checking
nooptions       INVARIANT_SUPPORT       # Extra sanity checks of internal structures, required by INVARIANTS
nooptions       WITNESS                 # Enable checks to detect deadlocks and cycles
nooptions       WITNESS_SKIPSPIN        # Don't run witness on spinlocks for speed
# cd /usr/src
# make buildkernel KERNCONF=XEN_PROD
# ls -l /usr/obj/usr/src/sys/XEN_PROD/kernel
-rwxr-xr-x  1 root  wheel  3962117 Dec 28 17:27 /usr/obj/usr/src/sys/XEN_PROD/kernel

J'ai dit mollo sur l'espace disque. Je n'utiliserais donc pas les supports habituels (oui môssieur, même les 130 Mo du bootonly sont encore trop pour moi :)

FreeBSD-9.0-RELEASE-i386-bootonly.iso    131 582 KB
FreeBSD-9.0-RELEASE-i386-disc1.iso       513 882 KB
FreeBSD-9.0-RELEASE-i386-dvd1.iso      2 191 632 KB
FreeBSD-9.0-RELEASE-i386-memstick.img    547 752 KB

Pour comprendre la suite des évènements, passons en revue les étapes de l'installation d'un OS du bien:

  1. boot du kernel
  2. obtention d'un shell
  3. préparation du support de destination
  4. installation du système
  5. configuration

Les étapes 2 à 5 sont souvent dévolues à un programme d'installation (le vénérable sysinstall ou le récent bsdinstall). Afin de mimer OpenBSD ou NetBSD, je souhaite construire un kernel contenant de quoi installer ma boule de geisha. Ce kernel contiendra un ramdisk, idéalement peuplé du programme d'installation. Mais là où le bât blesse, c'est que la page de manuel de sysinstall est claire:

 This product is currently at the end of its life cycle and will eventually be replaced.

bsdinstall est quant à lui un script shell faisant appel à d'autres scripts ou programmes:

# ls -l /usr/libexec/bsdinstall/
total 200
-r-xr-xr-x  1 root  wheel   1570 Jan  3  2012 adduser
-r-xr-xr-x  1 root  wheel   7356 Jan  3  2012 auto
-r-xr-xr-x  2 root  wheel  39888 Jan  3  2012 autopart
-r-xr-xr-x  1 root  wheel   2591 Jan  3  2012 checksum
-r-xr-xr-x  1 root  wheel   1680 Jan  3  2012 config
-r-xr-xr-x  1 root  wheel   8436 Jan  3  2012 distextract
-r-xr-xr-x  1 root  wheel   8452 Jan  3  2012 distfetch
-r-xr-xr-x  1 root  wheel   3446 Jan  3  2012 docsinstall
-r-xr-xr-x  1 root  wheel   2053 Jan  3  2012 hostname
-r-xr-xr-x  1 root  wheel   3851 Jan  3  2012 jail
-r-xr-xr-x  1 root  wheel   1747 Jan  3  2012 keymap
-r-xr-xr-x  1 root  wheel   8663 Jan  3  2012 mirrorselect
-r-xr-xr-x  1 root  wheel   2225 Jan  3  2012 mount
-r-xr-xr-x  1 root  wheel   6253 Jan  3  2012 netconfig
-r-xr-xr-x  1 root  wheel   3496 Jan  3  2012 netconfig_ipv4
-r-xr-xr-x  1 root  wheel   4543 Jan  3  2012 netconfig_ipv6
-r-xr-xr-x  2 root  wheel  39888 Jan  3  2012 partedit
-r-xr-xr-x  1 root  wheel   1635 Jan  3  2012 rootpass
-r-xr-xr-x  1 root  wheel   2895 Jan  3  2012 services
-r-xr-xr-x  1 root  wheel   1477 Jan  3  2012 time
-r-xr-xr-x  1 root  wheel   1810 Jan  3  2012 umount
-r-xr-xr-x  1 root  wheel   4700 Jan  3  2012 wlanconfig

Il serait assez laborieux de faire la liste de tous les binaires (et de leurs dépendances respectives) utilisés, car même s'ils sont tous compris dans "base", je ne vais pas faire rentrer la moitié de "base" dans un kernel.

Mes précédentes aventures m'ont fait découvrir le "rescue" et j'ai décidé d'approfondir cette piste. Un rapide coup d'oeil à "/rescue" nous apprend 2 choses:

Les plus perspicaces auront remarqué l'absence de fetch, ftp ou nc. Aucun outil pour récupérer un fichier (au hasard base.txz). Casse la tienne comme dit si bien mon ami Béru, on va phalanger ça.

Après lecture de librescue/Makefile et rescue/Makefile, je configure la compilation de "rescue" de la sorte:

# cat /root/etc/src_xen_install.conf
WITHOUT_RCMDS="yes"
WITHOUT_TCSH="yes"
WITHOUT_ATM="yes"
#WITHOUT_INET6_SUPPORT="yes"
WITHOUT_IPFILTER="yes"
WITHOUT_IPX="yes"
WITHOUT_ZFS="yes"
WITHOUT_NIS="yes"
WITHOUT_HESIOD="yes"
#WITHOUT_OPENSSL="yes"

Au résultat:

# cd /usr/src/rescue/
# make SRCCONF=/root/etc/src_xen_install.conf obj
# make SRCCONF=/root/etc/src_xen_install.conf
# ls -l /usr/obj/usr/src/rescue/rescue/rescue
-rwxr-xr-x  1 root  wheel  3778132 Dec 29 08:53 /usr/obj/usr/src/rescue/rescue/rescue

Pour rajouter un binaire à notre "rescue", il faut malheureusement éditer rescue/Makefile. Inutile de sortir la tronçonneuse pour alléger la partie CRUNCH_PROGS_bin=, le gain ne serait que de quelques centaines de Ko. Si certains esprits chafouins avaient l'idée saugrenue d'objecter que fetch serait plus approprié, je leur souhaite bon courage avec la lib ssl.

# diff -u rescue/Makefile.orig rescue/Makefile
--- rescue/Makefile.orig        2012-12-29 09:01:22.000000000 +0100
+++ rescue/Makefile     2012-12-29 12:50:24.000000000 +0100
@@ -206,6 +206,7 @@
 CRUNCH_PROGS_usr.bin+= id
 CRUNCH_ALIAS_id= groups whoami
 
+CRUNCH_PROGS_usr.bin+= ftp
 ##################################################################
 # Programs from stock /usr/sbin
 #

Au résultat:

# ls -l /usr/obj/usr/src/rescue/rescue/rescue
-rwxr-xr-x  1 root  wheel  3897468 Dec 29 12:52 /usr/obj/usr/src/rescue/rescue/rescue

Le "rescue" est prêt, reste à l'intégrer à notre kernel:

# dd if=/dev/zero of=/tmp/mfs_image bs=1M count=5
5+0 records in
5+0 records out
5242880 bytes transferred in 0.017344 secs (302287859 bytes/sec)
# mdconfig -a -t vnode -f /tmp/mfs_image -u 0
# gpart create -s gpt md0
md0 created
# gpart add -t freebsd-ufs md0
md0p1 added
# newfs -O1 -o space -m 0 md0p1
/dev/md0p1: 5.0MB (10168 sectors) block size 32768, fragment size 4096
        using 2 cylinder groups of 4.00MB, 128 blks, 256 inodes.
super-block backups (for fsck -b #) at:
 64, 8256
# mount /dev/md0p1 /mnt
# mkdir /mnt/{rescue,dev,disk}
# cd /usr/src/rescue/
# make SRCCONF=/root/etc/src_xen_install.conf DESTDIR=/mnt DONTSTRIP=1 install
# cat /usr/src/sys/i386/conf/XEN_INSTALL 
include XEN_PROD

ident           XEN_INSTALL

options         MD_ROOT                 # MD is a potential root device
options         MD_ROOT_SIZE=5120 # 5M
makeoptions     MFS_IMAGE=/tmp/mfs_image
options         ROOTDEVNAME=\"ufs:/dev/md0p1\"
# umount /mnt
# mdconfig -d -u 0
# cd /usr/src
# make buildkernel KERNCONF=XEN_INSTALL
[ snip des trucs ]
>>> Kernel build for XEN_INSTALL completed on Sat Dec 29 13:40:32 CET 2012
--------------------------------------------------------------
# ls -l /usr/obj/usr/src/sys/XEN_INSTALL/kernel
-rwxr-xr-x  1 root  wheel  9205179 Dec 29 13:40 /usr/obj/usr/src/sys/XEN_INSTALL/kernel

Il est temps d'immortaliser tout ce travail:

$ md5 freebsd*
MD5 (freebsd-INSTALL_XEN_DOMU) = e763357ad52622ba5f5b2dcba9c5d373
MD5 (freebsd_XEN_DOMU) = 77d01b45d09e23a05962119f07765505
$ sha256  freebsd*
SHA256 (freebsd-INSTALL_XEN_DOMU) = 9a2f935cbc6acebdd1a165d9b390822a303ad6db41db7c11ae5862e8e78ff9dd
SHA256 (freebsd_XEN_DOMU) = d4fd2a4061ebe507e760ec4241354dbfaeafd97457faa17eba1b57b874e7e024

Une fois tout ce beau monde copié sur notre dom0, on peut passer à la configuration du domU freebsd. Je rappelle que LVM est désormais disponible sur nos serviettes oranges, autant en profiter (vg00 est mon volume group principal):

# lvm lvcreate --size 10G -n lv_freebsd vg00
  Logical volume "lv_freebsd" created
# lvm lvdisplay /dev/vg00/lv_freebsd
  --- Logical volume ---
  LV Name                /dev/vg00/lv_freebsd
  VG Name                vg00
  LV UUID                E2ReS2-e9mh-D1KB-EHXg-PcKz-QYbt-rRLIw6
  LV Write Access        read/write
  LV Status              available
  # open                 0
  LV Size                10.00 GiB
  Current LE             2560
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     0
  Block device           169:2

La configuration du domU pour l'installation:

# cat /root/etc/freebsd.cfg 
kernel      = '/root/xen/freebsd-INSTALL_XEN_DOMU'
memory      = '256'
disk        = [ 'phy:/dev/mapper/vg00-lv_freebsd,hda,w' ]
name        = 'xenfree.bsdsx.fr'
vif         = [ 'mac=00:16:3e:00:00:51,bridge=bridge0', 'mac=00:16:3e:00:01:51,bridge=bridge1' ]
on_poweroff = 'destroy'
on_reboot   = 'restart'
on_crash    = 'restart'
extra       = 'console=hvc0,boot_verbose,kern.hz=100,vfs.root.mountfrom=ufs:/dev/md0p1'
  1. mots concernant le réseau:

J'utilise xen en mode brouteur et pleins d'interfaces, une adaptation à votre propre utilisation est sans doute nécessaire.

Même si tout semble prévu, il n'est pas possible, depuis le rescue, d'utiliser dhclient. Cette possibilité nous aurait permis d'avoir un accès réseau "complet" (passerelle, serveurs de noms ...) et de pouvoir récupérer base.txz depuis les sites officiels. Il faudra donc se contenter de configurer manuellement une interface réseau (xn0) et utiliser des adresses ip en lieu et place de nom d'hôte. Je vais donc servir base.txz en utilisant les outils disponibles sur le dom0 (inetd et /usr/libexec/httpd):

$ grep ^http /etc/inetd.conf 
http            stream  tcp     nowait:600      _httpd  /usr/libexec/httpd      httpd /var/www
$ ls -l /var/www/freebsd/9.0/
total 105792
-rw-r--r--  1 root  wheel  54107736 Dec 17 21:47 base.txz
# pkill -HUP inetd

Dernière recommandation: ne pas tenir compte du message suivant:

[XEN] hypervisor wallclock nudged; nudging TOD.

Il est temps de rentrer dans le vif du sujet:

# xm create /home/dsx/etc/freebsd.cfg -c
Using config file "/home/dsx/etc/freebsd.cfg".
Started domain xenfree.bsdsx.fr (id=23)
                                       WARNING: loader(8) metadata is missing!
Copyright (c) 1992-2012 The FreeBSD Project.
Copyright (c) 1979, 1980, 1983, 1986, 1988, 1989, 1991, 1992, 1993, 1994
        The Regents of the University of California. All rights reserved.
FreeBSD is a registered trademark of The FreeBSD Foundation.
FreeBSD 9.0-RELEASE-p5 #5: Sat Dec 29 16:45:44 CET 2012
    dsx@dsxbsd001:/usr/obj/usr/src/sys/XEN_INSTALL i386
Xen reported: 1729.021 MHz processor.
Timecounter "ixen" frequency 1953125 Hz quality 0
CPU: Intel(R) Pentium(R) M processor 1.73GHz (1729.02-MHz 686-class CPU)
  Origin = "GenuineIntel"  Id = 0x6d8  Family = 6  Model = d  Stepping = 8
  Features=0xafe1fbff<FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,DTS,ACPI,MMX,FXSR,SSE,SSE2,SS,TM,PBE>
  Features2=0x180<EST,TM2>
  AMD Features=0x100000<NX>
real memory  = 268435456 (256 MB)
avail memory = 251011072 (239 MB)
[XEN] IPI cpu=0 irq=128 vector=RESCHEDULE_VECTOR (0)
[XEN] IPI cpu=0 irq=129 vector=CALL_FUNCTION_VECTOR (1)
[XEN] xen_rtc_probe: probing Hypervisor RTC clock
rtc0: <Xen Hypervisor Clock> on motherboard
[XEN] xen_rtc_attach: attaching Hypervisor RTC clock
xenstore0: <XenStore> on motherboard
xc0: <Xen Console> on motherboard
Event timer "ixen" quality 600
Timecounters tick every 10.000 msec
[XEN] hypervisor wallclock nudged; nudging TOD.
xenbusb_front0: <Xen Frontend Devices> on xenstore0
xn0: <Virtual Network Interface> at device/vif/0 on xenbusb_front0
xn0: Ethernet address: 00:16:3e:00:00:51
xn1: <Virtual Network Interface> at device/vif/1 on xenbusb_front0
xn1: Ethernet address: 00:16:3e:00:01:51
xenbusb_back0: <Xen Backend Devices> on xenstore0
xctrl0: <Xen Control Device> on xenstore0
xbd0: 10240MB <Virtual Block Device> at device/vbd/768 on xenbusb_front0
xbd0: attaching as ad0
xn0: backend features:
xn1: backend features:
Timecounter "TSC" frequency 1729021000 Hz quality 800
Trying to mount root from ufs:/dev/md0p1 []...
rtc0: [XEN] xen_rtc_gettime
rtc0: [XEN] xen_rtc_gettime: wallclock 1355568504 sec; 833095242 nsec
rtc0: [XEN] xen_rtc_gettime: uptime 1291968 sec; 51658017 nsec
rtc0: [XEN] xen_rtc_gettime: TOD 1356860472 sec; 884753259 nsec
Dec 30 09:41:13 init: login_getclass: unknown class 'daemon'
cannot open /etc/rc: No such file or directory
Enter full pathname of shell or RETURN for /rescue/sh: [XEN] hypervisor wallclock nudged; nudging TOD.

Cannot read termcap database;
using dumb terminal settings.

# gpart create -s gpt ad0
ad0 created
# gpart add -t freebsd-swap -s 1G  ad0
ad0p1 added
# gpart add -t freebsd-ufs  ad0
ad0p2 added
# newfs ad0p2
/dev/ad0p2: 9216.0MB (18874296 sectors) block size 32768, fragment size 4096
        using 13 cylinder groups of 740.00MB, 23680 blks, 47360 inodes.
super-block backups (for fsck -b #) at:
 192, 1515712, 3031232, 4546752, 6062272, 7577792, 9093312, 10608832, 12124352,
 13639872, 15155392, 16670912, 18186432
newfs: Cannot retrieve operator gid, using gid 0.
# mount /dev/ad0p2 /disk
# ifconfig xn0 up
xn0: link state changed to DOWN
xn0: link state changed to UP
# ifconfig xn0 inet 10.30.12.51 netmask 255.255.255.0
# ping -c 2 10.30.12.1
PING 10.30.12.1 (10.30.12.1): 56 data bytes
64 bytes from 10.30.12.1: icmp_seq=0 ttl=255 time=0.442 ms
64 bytes from 10.30.12.1: icmp_seq=1 ttl=255 time=0.146 ms

--- 10.30.12.1 ping statistics ---
2 packets transmitted, 2 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.146/0.294/0.442/0.148 ms
# cd /disk
# ftp -4 http://10.30.12.1/freebsd/9.0/base.txz
ftp: Can't lookup `10.30.12.1:http': servname not supported for ai_socktype
# ftp -4 http://10.30.12.1:80/freebsd/9.0/base.txz
Requesting http://10.30.12.1:80/freebsd/9.0/base.txz
54107736 bytes retrieved in 00:04 (11.12 MiB/s)
# md5 base.txz 
MD5 (base.txz) = 38d2dca70b768f6992e1cf11af663f0b
# tar xzpf base.txz
# echo '# Device               Mountpoint      FStype  Options         Dump    Pass#' > /disk/etc/fstab
# echo '/dev/ad0p1             none            swap    sw              0       0' >> /disk/etc/fstab 
# echo '/dev/ad0p2             /               ufs     rw              1       1' >> /disk/etc/fstab
# sed -i '' '/^ttyv/d' /disk/etc/ttys
# echo 'xc0     "/usr/libexec/getty Pc"         vt100   on  secure' >> /disk/etc/ttys

Le premier ftp est juste là pour montrer que sans /etc/services, il faut connaitre les numéros de port par coeur :) Arrivé à ce stade, on peut se caresser le pubis. Le plus dur est fait, il nous reste l'étape 5 (configuration). On peut:

Je préfère personnellement la dernière solution, même si elle implique un reboot supplémentaire.

Le fichier de configuration final:

#kernel      = '/home/dsx/xen/freebsd-INSTALL_XEN_DOMU'
kernel      = '/home/dsx/xen/freebsd_XEN_DOMU'
memory      = '256'
disk        = [ 'phy:/dev/mapper/vg00-lv_freebsd,hda,w' ]
name        = 'xenfree.bsdsx.fr'
vif         = [ 'mac=00:16:3e:00:00:51,bridge=bridge0', 'mac=00:16:3e:00:01:51,bridge=bridge1' ]
on_poweroff = 'destroy'
on_reboot   = 'restart'
on_crash    = 'restart'
#extra       = 'console=hvc0,boot_verbose,kern.hz=100,vfs.root.mountfrom=ufs:/dev/md0p1'
extra       = 'console=hvc0,boot_verbose,kern.hz=100,vfs.root.mountfrom=ufs:/dev/ad0p2'

Pour conclure:

L'automatisation de l'installation peut se faire depuis un fichier /etc/rc que l'on aura pris soin de placer dans le ramdisk (attention à bien tout tester). Pour ma part, j'ai appris plein de trucs, donc mission accomplie :) Et cerise sur le gâteau, FreeBSD 9.1 est disponible !

Ps: les kernels sont disponibles ici.


Lien vers ce billet

27/05/2010

[ freebsd guruplug arm ]

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:

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=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

Lien vers ce billet

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

05/05/2009

[ update freebsd openwrt blosxom ]

200905052004 update freebsd openwrt blosxom

Mises à jour diverses et variées

Il y a des périodes comme ça, on a envie/besoin de changement(s). Petit récapitulatif:

kimsufi

Passage de FreeBSD 7.1 en 7.2. A moi les joies des jails multi ipv4/ipv6 !

fon2200

Passage d' OpenWRT 7.09 en 8.09. Toujours aussi simple une fois que l'on a accès à la console.

dg834g

Récupération d'un petit boitier modem/routeur wifi qui a rapidement ingurgité un OpenWrt 8.09. Seule ombre au tableau:

root@dg384g:~# df -h
Filesystem                Size      Used Available Use% Mounted on
rootfs                    1.2M      1.2M         0 100% /
/dev/root                 1.2M      1.2M         0 100% /rom
tmpfs                     6.2M    736.0k      5.5M  12% /tmp
tmpfs                   512.0k         0    512.0k   0% /dev
/dev/mtdblock4            1.8M    760.0k      1.1M  41% /jffs
mini_fo:/jffs             1.2M      1.2M         0 100% /

Un rootfs de 1.2 Mo rempli à 100% et un /tmp qui ne sert pas beaucoup. Je dois revoir ma copie.

shuttle K45

J'ai mis en place un petit NAS pour sauvegarder les photos et vidéos familiales. Au menu:

Un prochain billet décrira plus en détail l'histoire de cette machine.

Le blog

Il n'aura échappé à personne le changement radical de ce blog. On m'a fait découvrir blosxom et je suis tombé sous le charme de ces 444 lignes de perl. Du perl, rien que du perl, pas de dépendance. Le style est un peu brut de décoffrage mais j'y travaille :)

A venir:

Bon, c'est pas le tout mais j'ai du boulot :)

Ps: pour les adeptes des flux rss/atom, c'est en cours.


Lien vers ce billet

16/06/2008

[ freebsd kimsufi install jail ]

200806160800 freebsd kimsufi install jail

Mon premier billet

Prélude

Pour mon premier billet, je vais décrire l'installation de mon serveur. Après avoir pris un domaine chez gandi.net, j'ai commandé mon serveur dédié chez ovh (livré avec un peu de retard :) avec FreeBSD 7.0. Installation de la version 32 bits par défaut et un partitionnement des plus simple:

ks34581# cat /etc/fstab 
# Device                Mountpoint      FStype  Options         Dump    Pass#
/dev/ad4s1a             /               ufs             rw      1       1
/dev/ad4s1b             /home           ufs             rw      2       2
/dev/ad4s1d             swap            swap            sw      0       0
proc                    /proc           procfs  rw              0       0

Depuis le manager je réinstalle la version 64 bits. J'en profite pour activer mon compte de backup.

Configuration de base

Modification du mot de passe root

ks34581# passwd

Suppression des getty inutiles

ks34581# grep "getty Pc" /etc/ttys
ttyv0   "/usr/libexec/getty Pc"         cons25  on  secure
ttyv1   "/usr/libexec/getty Pc"         cons25  off secure
ttyv2   "/usr/libexec/getty Pc"         cons25  off secure
ttyv3   "/usr/libexec/getty Pc"         cons25  off secure
ttyv4   "/usr/libexec/getty Pc"         cons25  off secure
ttyv5   "/usr/libexec/getty Pc"         cons25  off secure
ttyv6   "/usr/libexec/getty Pc"         cons25  off secure
ttyv7   "/usr/libexec/getty Pc"         cons25  off secure
ks34581# kill -HUP 1

Heure locale

ks34581# cp /usr/share/zoneinfo/Europe/Paris /etc/localtime

Désactivation du module linux

ks34581# kldunload linux
ks34581# echo 'linux_enable="NO"' >> /etc/rc.conf

Activation de ZFS

ks34581# kldload zfs
ks34581# echo 'zfs_enable="YES"' >> /etc/rc.conf

Activation de lo1 (pour les jails)

ks34581# ifconfig lo1 create
ks34581# ifconfig lo1 inet 172.16.0.254 netmask 255.255.255.0
ks34581# echo 'network_interfaces="lo0 vr0 lo1"'
ks34581# echo '/sbin/ifconfig lo1 create' > /etc/start_if.lo1
ks34581# echo 'ifconfig_lo1="inet 172.16.0.254 netmask 255.255.255.0"' >> /etc/rc.conf
ks34581# echo '172.16.0.254 kimsufi.mondomaine.tld' >> /etc/hosts

ssh sur interface publique

ks34581# echo 'sshd_flags="-o ListenAddress=mon.ip.publique"' >> /etc/rc.conf

syslog en mode local

ks34581# echo 'syslogd_flags="-ss"' >> /etc/rc.conf

named ip v4 only

ks34581# echo 'named_flags="-4"' >> /etc/rc.conf

named sur interface privée

ks34581# grep 172.16.0.254 /etc/named/named.conf
listen-on       { 127.0.0.1; 172.16.0.254; };

Sauvegarde

Pour l'instant, un simple backup ftp fera l'affaire. Je commence par automatiser l'accès au backup:

ks34581# cat >> /root/.netrc
machine backup
login votre_login
password votre_mot_de_passe
^D
ks34581# chmod 600 /root/.netrc
ks34581# echo "adresse.ip.du.backup backup" >> /etc/hosts

Un script sans prétention:

ks34581# cat /root/bin/backup.sh
#!/bin/sh
set -- $(date "+%Y%m%d")
TBZ=kimsufi-$1.tbz
tar cjf $HOME/tmp/$TBZ -T $HOME/etc/backup.cfg 2>/dev/null
cd $HOME/tmp
echo "put $TBZ" | ftp -V backup

Un fichier de configuration minimal:

ks34581# cat /root/etc/backup.cfg
/etc/rc.conf
/etc/ttys
/etc/start_if.lo1
/etc/namedb/named.conf
/root/.netrc
/root/etc/backup.cfg
/root/bin/backup.sh

Tous les jours à 2h45 du matin:

ks34581# echo '45 2 * * *  $HOME/bin/backup.sh' >> /root/.crontab
ks34581# crontab .crontab
ks34581# echo '/root/.crontab' >> /root/etc/backup.cfg

Courriel

Pour l'instant, l'installation de base de FreeBSD me permet d'envoyer des courriels. J'ajuste la configuration de sendmail pour que les jails puissent en profiter. Une jail smtp est prévue pour plus tard.

ks34581# cd /etc/mail
ks34581# echo 'root: une.adresse@email.valide' >> aliases
ks34581# make aliases

Pour pouvoir être utilisé par les jails, sendmail doit écouter sur 172.16.0.254:

ks34581# sed -I'.orig' -e 's/^DS/DS[172.16.0.254]/' /etc/mail/submit.cf
ks34581# echo 'sendmail_submit_flags="-L sm-mta -bd -q30m -ODaemonPortOptions=Addr=172.16.0.254"' >> /etc/rc.conf
ks34581# echo '/etc/mail/submit.cf' >> $HOME/etc/backup.cfg

Il doit aussi accepter de relayer les jails:

ks34581# cat /etc/mail/relay-domains
ks34581.kimsufi.com
localhost
127.0.0.1
.mondomaine.tld

ks34581# make restart
ks34581# echo '/etc/mail/relay-domains' >> /root/etc/backup.cfg

Packet filter

Les jails seront sur le réseau 172.16.0.x, interface lo1. Pour accèder à ces jails du NAT s'impose:

ks34581# echo 'pf_enable="YES"' >> /etc/rc.conf
ks34581# echo 'pflog_enable="YES"' >> /etc/rc.conf

Un (trop) simple /etc/pf.conf:

ext_if="vr0"
int_if="lo1"
set block-policy return
set loginterface $ext_if
set skip on lo0
scrub in
nat on $ext_if from !($ext_if) -> ($ext_if:0)
block log on $ext_if
antispoof quick for { lo0 $int_if }
pass in on $ext_if inet proto tcp from any to ($ext_if) port ssh
pass quick on $int_if
pass out on $ext_if

Seul le ssh du kimsufi est accessible. Je rajouterai les règles rdr et pass au fur et à mesure. Je croise les doigts (un pf.conf qui bloque est si vite arrivé :) et hop:

ks34581# pfctl -n -f /etc/pf.conf
ks34581# /etc/rc.d/pf start
ks34581# echo '/etc/pf.conf' >> /root/etc/backup.cfg

Jail et Zfs

J'utilise Zfs pour définir les partitions de mes jails. N'ayant qu'une seule partition physique à ma disposition, je ne peux pas utiliser les fonctions mirror, raid, raidz ... Je ne compte que sur mes backup !

ks34581# umount /home
ks34581# cat /etc/fstab
# Device                Mountpoint      FStype  Options         Dump    Pass#
/dev/ad4s1a             /               ufs             rw      1       1
#/dev/ad4s1b            /home           ufs             rw      2       2
/dev/ad4s1d             swap            swap            sw      0       0
proc                    /proc           procfs  rw              0       0

ks34581# zpool create zfs /dev/ad4s1b
ks34581# zfs create zfs/jail

J'active les jails. jail_list est volontairement vide afin de ne pas démarer automatiquement une jail tant qu'elle n'est pas validée (un reboot du serveur est si vite arrivé :)

ks34581# cat >> /etc/rc.conf
jail_enable="YES"
jail_list=""
jail_set_hostname_allow="NO"
# pour postgresql et symon
jail_sysvipc_allow="YES"
^D

Un script pour simplifier l'installation d'une jail:

ks34581# cat /root/bin/mk_jail.sh
 1  #!/bin/sh
 2  
 3  JROOT=zfs/jail
 4  FTP=ftp://ftp.fr.freebsd.org/pub/FreeBSD
 5  CFG=$HOME/tmp/sysinstall.cfg
 6  IFNAME=lo1
 7  
 8  NAME=$1
 9  SIZE=$2
10  HOSTNAME=$3
11  IP=$4
12  
13  zfs create -o quota=${SIZE}M $JROOT/$NAME
14  zfs create -o quota=512M $JROOT/$NAME/tmp
15  zfs create -o quota=512M $JROOT/$NAME/var
16  
17  cat <<EOF > $CFG
18  installRoot=/$JROOT/$NAME
19  _ftpPath=$FTP
20  mediaSetFTP
21  dists=base
22  distSetCustom
23  installCommit
24  EOF
25  
26  sysinstall configFile=$CFG loadConfig
27  
28  cat <<EOF >> /etc/rc.conf
29  jail_${NAME}_rootdir=/$JROOT/$NAME
30  jail_${NAME}_hostname=$HOSTNAME
31  jail_${NAME}_ip=$IP
32  jail_${NAME}_interface=$IFNAME
33  jail_${NAME}_devfs_enable="YES"
34  jail_${NAME}_devfs_ruleset="devfsrules_jail"
35  EOF
36  
37  echo "$IP $HOSTNAME" >> /etc/hosts
38  
39  cat <<EOF > /$JROOT/$NAME/etc/rc.conf
40  sshd_enable="YES"
41  sshd_flags="-o ListenAddress=$IP"
42  syslogd_flags="-ss"
43  sendmail_enable="NONE"
44  EOF
45  
46  cat <<EOF >> /$JROOT/$NAME/etc/hosts
47  $IP $HOSTNAME
48  213.251.173.2 backup
49  172.16.0.254 kimsufi.mondomaine.tld
50  EOF
51  
52  cat <<EOF > /$JROOT/$NAME/etc/resolv.conf
53  nameserver 172.16.0.254
54  EOF
55  
56  sed -I'.orig' -e 's/^DS/DS[172.16.0.254]/' /$JROOT/$NAME/etc/mail/submit.cf
57  
58  cp /etc/localtime /$JROOT/$NAME/etc

Et c'est parti:

ks34581# /root/bin/mk_jail.sh toto 4096 toto.mondomaine.tld 172.16.0.1

Je vérifie que tout se passe bien à coup de:

Tout est OK, je peux activer cette jail au démarrage du serveur:

ks34581# grep jail_list /etc/rc.conf
jail_list="toto"

Si toto.mondomaine.tld pointe bien vers l'adresse publique du serveur, il ne reste plus que la configuration de pf:

ks34581# cat /etc/pf.conf
[ snip ]

rdr pass on $ext_if proto tcp to port 65080 -> 172.16.0.1 port ssh
rdr pass on $ext_if proto tcp to port http -> 172.16.0.1 port http

pass quick on $ext_if inet proto tcp from any to 172.16.0.1 port ssh
pass quick on $ext_if inet proto tcp from any to 172.16.0.1 port http
[ snip ]

Ici la jail ayant pour ip 172.16.0.1 fait tourner un serveur web et son serveur ssh est accessible depuis ip.publique.du.kimsufi port 65080

A faire


Lien vers ce billet