Tags

arm arpaname autoinstall bin_sh blocage blosxom bsd bsdfrance cblog certification chroot cluster dg834 dhcp diffusion dns dnsmasq dom0 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 routage 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

30/04/2016

[ openbsd domU autoinstall ]

201604300915 openbsd domU autoinstall

Dans un précédent billet, j'ai décrit l'environnement d'un dom0 NetBSD. Voyons maintenant l'installation automatique d'un domU OpenBSD.

Le principe

D'après ma configuration DHCP/DNS, un domU avec une interface ayant pour adresse MAC 00:16:3e:00:10:00 démarrant en pxe sera configuré de la manière suivante:

TFTP

Extrait de /etc/inetd.conf:

dom0.vpro.bsdsx.fr:tftp    dgram   udp   wait        root    /usr/libexec/tftpd  tftpd -l -s /home/dsx/xen/tftpboot

Le répertoire /home/dsx/xen/tftpboot est peuplé comme suit:

dsx@vpro>ls -lR /home/dsx/xen/tftpboot/
lrwxr-xr-x  1 dsx  wheel       15 Dec 31 15:50 auto_install -> openbsd_pxeboot
lrwxr-xr-x  1 dsx  wheel        8 Feb 13 08:41 bsd.rd -> bsd58.rd
-rw-r--r--  1 dsx  wheel  7642500 Dec 31 10:23 bsd58.rd
drwxr-xr-x  2 dsx  wheel      512 Jan 24 11:34 etc
-rw-r--r--  1 dsx  wheel    81092 Dec 31 10:24 openbsd_pxeboot

/home/dsx/xen/tftpboot/etc:
-rw-r--r--  1 dsx  wheel  48 Dec 29 16:10 boot.conf
-rw-r--r--  1 dsx  wheel  16 Apr 30 09:45 random.seed

dsx@vpro>cat /home/dsx/xen/tftpboot/etc/boot.conf 
stty com0 115200
set tty com0
boot tftp:/bsd.rd

La documentation d'autoinstall nous indique que la prochaine étape sera de répondre à l'url http://172.18.0.1/00:16:3e:00:10:00-install.conf?path=5.8/amd64.

HTTP

Extrait de /etc/inetd.conf:

dom0.vpro.bsdsx.fr:http stream tcp nowait:600 _httpd /usr/libexec/httpd httpd -V -C conf /home/dsx/xen/http/_cgi-bin/conf.sh -v /home/dsx/xen/http /home/dsx/xen/http/_default

Petites explications:

Les sets d'installation d'OpenBSD se trouvent dans un hôte virtuel:

dsx@vpro>ls xen/http/openbsd.vpro.bsdsx.fr/pub/OpenBSD/5.8/amd64/
INSTALL.amd64         bsd                   game58.tgz            site58-open-10.tgz    xshare58.tgz
SHA256                bsd.mp                index.txt             xbase58.tgz
SHA256.sig            bsd.rd                man58.tgz             xfont58.tgz
base58.tgz            comp58.tgz            pxeboot               xserv58.tgz

conf.sh

Ce script est le coeur de l'installation automatique. A partir de l'url http://172.18.0.1/00:16:3e:00:10:00-install.conf?path=5.8/amd64, il va:

Configuration d'un domU

dsx@vpro>cat -n xen/etc/open-10.cfg
 1  builder='hvm'
 2  memory=256
 3  name='open-10'
 4  vif=[ 'mac=00:16:3e:00:10:00, bridge=bridge0, model=virtio', 'mac=00:16:3e:01:10:00, bridge=bridge1, model=virtio' ]
 5  disk=[ '/dev/vg_sata/open-10-sata,,hda' ]
 6  boot='c'
 7  serial='pty'
 8  vnc=0
 9  on_poweroff='destroy'
10  on_reboot='destroy'
11  autodisklabel=[ '/ 100M-* 75%', 'swap 10M-* 25%' ]
12  packages='fossil--'
13  install_site=[
14      'echo "sndiod_flags=NO" >> /etc/rc.conf.local',
15      'echo "permit nopass :wheel" >> /etc/doas.conf'
16  ]
17  # !!! ACHTUNG !!!
18  # les commentaires en fin de fichier sinon eval va pas marcher
19  # http://xenbits.xen.org/docs/unstable/misc/xl-disk-configuration.txt
20  # http://xenbits.xen.org/docs/unstable/misc/vbd-interface.txt

Fichier de réponse

Voici le fichier de réponse généré par conf.sh:

System hostname = $name
Network interfaces = em0
IPv4 address for em0 = $REMOTE_ADDR
Default IPv4 route = $HTTP_HOST
IPv6 address for em0 = $IPV6::$lastdigit
IPv6 default router = $IPV6::1
Password for root = '*************'
Start sshd(8) by default = yes
Do you expect to run the X Window System = no
Change the default console to com0 = yes 
Which speed should com0 use = 115200
Setup a user = dsx
Full name for user = Admin user
Password for user = *************
Allow root ssh login = no
Public ssh key for user = $ssh_key
What timezone are you in = Europe/Paris
Location of sets = http 
HTTP Server = openbsd.$SERVER_NAME
URL to autopartitioning template = http://$HTTP_HOST/autodisklabel.conf?mac=$mac&version=$version
Checksum test for site${version}-${name}.tgz failed. Continue anyway = yes
Unverified sets: site${version}-${name}.tgz. Continue without verification = yes

On peut voir que l'url de l'autopartitioning est aussi gérée par conf.sh. Notons que par design, on ne peut configurer qu'une seule interface réseau. La configuration de mes 2 interfaces se fait à l'aide de site${version}-${name}.tgz qui ne contient qu'un fichier install.site.

install.site

Ce fichier contient les instructions pour finaliser l'installation:

#!/bin/sh
set -x

ln /etc/hostname.em0 /etc/hostname.vio0
sed 's/\.0\./\.1\./' /etc/hostname.vio0 > /etc/hostname.vio1

sed '/^ttyC/ s/on/off/' /etc/ttys > /tmp/ttys.serial && mv /tmp/ttys.serial /etc/ttys

export ftp_proxy=http://dom0:3128
export http_proxy=http://dom0:3128
export PKG_PATH=ftp://ftp2.fr.openbsd.org/pub/OpenBSD/`uname -r`/packages/`uname -m`
pkg_add -r tcsh vim--no_x11 rsync-- fossil--
usermod -s /usr/local/bin/tcsh dsx
echo "sndiod_flags=NO" >> /etc/rc.conf.local
echo "permit nopass :wheel" >> /etc/doas.conf

Démarrage pxe

Le fichier de configuration du domU ne permet pas en l'état de booter en pxe. Le script suivant effectue les modifications nécessaires et démarre le domU avec les bonnes options:

 1  #!/bin/sh
 2  
 3  DOMU_CONFIG_PATH=/home/dsx/xen/etc
 4  
 5  TYPE=${1:-open}
 6  NUMBER=${2:-10}
 7  
 8  config_file=$DOMU_CONFIG_PATH/$TYPE-$NUMBER.cfg
 9  
10  if [ ! -f $config_file ]; then
11      echo "'$config_file': file not found. Exit."
12      exit 1
13  fi
14  
15  sudo xl list | grep --quiet --max-count=1 "$TYPE-$NUMBER"
16  if [ $? -eq 0 ]; then
17      echo "'$TYPE-$NUMBER' is running. Exit."
18      exit 1
19  fi
20  
21  sed -e 's/virtio/e1000/g' $config_file > /tmp/pxe_$TYPE-$NUMBER.cfg
22  
23  sudo xl create /tmp/pxe_$TYPE-$NUMBER.cfg -c 'boot="n"'

Les fichiers

conf.sh est disponible ici, le template d'install.site est et le résulat est .

Script started on Sun May  1 09:19:38 2016
...
Script done on Sun May  1 09:24:08 2016

Moins de 5 minutes, pas mal non ?

A faire

Passer en OpenBSD 5.9 :)


Lien vers ce billet

09/04/2016

[ netbsd dom0 dns dhcp ]

201604090915 netbsd dom0 dns dhcp

Dans un précédent billet, j'ai proposé une recette de domU OpenBSD à ma façon. Aujourd'hui, je passe la vitesse suprérieure.

La machine

Le réseau

$ cat /etc/ifconfig.re0
inet 31.216.24.225 netmask 255.255.255.192
inet6 2a02:27d0:0:dead:beef::225 prefixlen 80
$ cat /etc/ifconfig.bridge0
up
$ cat /etc/ifconfig.bridge1
up
$ cat /etc/ifconfig.tap0
up
inet 172.18.0.1 netmask 255.255.255.0
inet6 2a02:27d0:1337:f225::1 prefixlen 64
!brconfig bridge0 add $int
$ cat /etc/ifconfig.tap1
up
inet 172.18.1.1 netmask 255.255.255.0
!brconfig bridge1 add $int

Le stockage

Le système NetBSD 7.0 est installé simplement (/, swap et /home) sur le disque wd0. Les 2 autres disques sont sous le contrôle de LVM:

$ sudo lvm pvdisplay -s
  Device "/dev/rwd2d" has a capacity of 445.76 GiB
  Device "/dev/rwd1d" has a capacity of 425.76 GiB
$ sudo lvm vgdisplay -s
  "vg_ssd" 465.76 GiB [20.00 GiB used / 445.76 GiB free]
  "vg_sata" 465.76 GiB [40.00 GiB used / 425.76 GiB free]

L'objectif

Installer des domU de différents types le plus simplement possible: NetBSD, FreeBSD, OpenBSD, DragonflyBSD. Je n'ai pas l'intention d'avoir plus d'une dizaine de domUs par type, je peux donc préparer mon plan d'adressage:

DNS

Fervent partisant de toujours utiliser ce qui est disponible de base, un cas de conscience se pose: bind ou pas bind ? Comme seuls les domUs l'interrogent et qu'il ne répond pas sur l'interface externe, je peux l'utiliser sans risque (la mémoire ne peut pas en dire autant :)

Je ne sais pas si c'est une bonne idée mais j'ai décidé de créer une zone du même nom que l'hôte. Ici l'hôte vpro.bsdsx.fr gère la zone vpro.bsdsx.fr où il est référencé en tant que dom0 (plus quelques alias)

$ cat /etc/named.conf
options {
        directory "/etc/namedb";
        allow-recursion { localhost; localnets; };

        listen-on { 127.0.0.1; 172.18.0.1; 172.18.1.1; };
        listen-on-v6 { ::1; };

        forwarders {
                31.216.24.205;
                31.216.24.223;
        };
};

[ snip zones locales ]

zone "vpro.bsdsx.fr" {
    type master;
    file "vpro.bsdsx.fr";
};

zone "0.18.172.IN-ADDR.ARPA" {
    type master;
    file "172.18.0";
};

zone "1.18.172.IN-ADDR.ARPA" {
    type master;
    file "172.18.1";
};

zone "5.2.2.f.7.3.3.1.0.d.7.2.2.0.a.2.ip6.arpa" {
    type master;
    file "2a02_27d0_1337_f225__64";
};

$ cat /etc/namedb/vpro.bsdsx.fr
$TTL 3600
@           SOA vpro.bsdsx.fr. root.bsdsx.fr. (
                    2016031901 ; serial
                    8H         ; refresh
                    2H         ; retry
                    1W         ; expire
                    1D )       ; minimum seconds
                 NS     vpro.bsdsx.fr.
                 A      31.216.24.225
                 AAAA   2a02:27d0:0:dead:beef::225
dom0             A      172.18.0.1
dom0             AAAA   2a02:27d0:1337:f225::1
openbsd          CNAME  dom0
netbsd           CNAME  dom0
freebsd          CNAME  dom0
dflybsd          CNAME  dom0

$GENERATE 10-19 open-$   A 172.18.0.$
$GENERATE 20-29 net-$    A 172.18.0.$
$GENERATE 30-39 free-$   A 172.18.0.$
$GENERATE 40-49 dfly-$   A 172.18.0.$

$GENERATE 10-19 open-int-$   A 172.18.1.$
$GENERATE 20-29 net-int-$    A 172.18.1.$
$GENERATE 30-39 free-int-$   A 172.18.1.$
$GENERATE 40-49 dfly-int-$   A 172.18.1.$

$GENERATE 10-19 open-$   AAAA 2a02:27d0:1337:f225::$
$GENERATE 20-29 net-$    AAAA 2a02:27d0:1337:f225::$
$GENERATE 30-39 free-$   AAAA 2a02:27d0:1337:f225::$
$GENERATE 40-49 dfly-$   AAAA 2a02:27d0:1337:f225::$

$ cat /etc/namedb/172.18.0
$TTL 3600
@           IN SOA vpro.bsdsx.fr. root.bsdsx.fr. (
                    2016020402 ; serial
                    8H         ; refresh
                    2H         ; retry
                    1W         ; expire
                    1D )       ; minimum seconds
            IN NS   dom0.vpro.bsdsx.fr.
1           IN PTR  dom0.vpro.bsdsx.fr.

$GENERATE 10-19 $   IN PTR open-$.vpro.bsdsx.fr.
$GENERATE 20-29 $   IN PTR net-$.vpro.bsdsx.fr.
$GENERATE 30-39 $   IN PTR free-$.vpro.bsdsx.fr.
$GENERATE 40-49 $   IN PTR dfly-$.vpro.bsdsx.fr.

cat /etc/namedb/172.18.1 
$TTL 3600
@           IN SOA vpro.bsdsx.fr. root.bsdsx.fr. (
                    2016020402 ; serial
                    8H         ; refresh
                    2H         ; retry
                    1W         ; expire
                    1D )       ; minimum seconds
            IN NS   dom0.vpro.bsdsx.fr.
1           IN PTR  dom0.vpro.bsdsx.fr.

$GENERATE 10-19 $   IN PTR open-int-$.vpro.bsdsx.fr.
$GENERATE 20-29 $   IN PTR net-int-$.vpro.bsdsx.fr.
$GENERATE 30-39 $   IN PTR free-int-$.vpro.bsdsx.fr.
$GENERATE 40-49 $   IN PTR dfly-int-$.vpro.bsdsx.fr.

$ cat /etc/namedb/2a02_27d0_1337_f225__64
$TTL 3600
@           IN SOA vpro.bsdsx.fr. root.bsdsx.fr. (
                    2016031902 ; serial
                    8H         ; refresh
                    2H         ; retry
                    1W         ; expire
                    1D )       ; minimum seconds
            IN NS   dom0.vpro.bsdsx.fr.
1           IN PTR  dom0.vpro.bsdsx.fr.

$GENERATE 0-9 $.1.0.0.0.0.0.0.0.0.0.0.0.0.0.0   IN PTR open-1$.vpro.bsdsx.fr.
$GENERATE 0-9 $.2.0.0.0.0.0.0.0.0.0.0.0.0.0.0   IN PTR net-2$.vpro.bsdsx.fr.
$GENERATE 0-9 $.3.0.0.0.0.0.0.0.0.0.0.0.0.0.0   IN PTR free-3$.vpro.bsdsx.fr.
$GENERATE 0-9 $.4.0.0.0.0.0.0.0.0.0.0.0.0.0.0   IN PTR dfly-4$.vpro.bsdsx.fr.

Avec un plan d'adressage fixe et simple, je peux user (et abuser :) de GENERATE. Attention avec les reverse ipv6, il y a une petite astuce: le GENERATE ne s'occupe que des unités, je fixe les dizaines en dur.

DHCP

Il sera surtout utilisé pour les démarrages à travers le réseau (boot pxe). Extraits du /etc/dhcpd.conf:

default-lease-time 604800;
max-lease-time 604800;

class "bridge0_open" {
    match if (substring(hardware, 1, 5) = 00:16:3e:00:10);
    filename "auto_install";
    next-server 172.18.0.1;
}
class "bridge1_open" {
    match if (substring(hardware, 1, 5) = 00:16:3e:01:10);
}

class "bridge0_net" {
    match if (substring(hardware, 1, 5) = 00:16:3e:00:20);
}
class "bridge1_net" {
    match if (substring(hardware, 1, 5) = 00:16:3e:01:20);
}
...

subnet 172.18.0.0 netmask 255.255.255.0 {
    option routers 172.18.0.1;
    option domain-name-servers 172.18.0.1;
    option subnet-mask 255.255.255.0;
    option domain-name "vpro.bsdsx.fr";

    pool {
        range 172.18.0.10 172.18.0.19;
        allow members of "bridge0_open";
    }

    host open-10 { hardware ethernet 00:16:3e:00:10:00; }
    ...
    host open-19 { hardware ethernet 00:16:3e:00:10:09; }

    pool {
        range 172.18.0.20 172.18.0.29;
        allow members of "bridge0_net";
    }

    host net-20 { hardware ethernet 00:16:3e:00:20:00; }
    ...
    host net-29 { hardware ethernet 00:16:3e:00:20:09; }
    
    ...
}
subnet 172.18.1.0 netmask 255.255.255.0 {
...
}

Pour une MAC 00:16:3e:AA:BB:CC:

Avec ce découpage, je peux facilement définir des classes correspondant au couple type d'OS/interface afin de préciser certaines options et de les placer dans les bons pools.


Lien vers ce billet

17/10/2015

[ ipv6 routage ]

201510171800 ipv6 routage

Le réseau ipv6 de mon chez moi de moi que j'ai personnellement moi-même

Mon FAI qui a tout compris me fournit un /61 soit 8 /64 (il n'a pas encore compris les bonnes pratiques d'attribution d'adresses ipv6). J'en ai fait l'usage suivant:

pouetbox 2a01:e35:zzz:f660::1/64
 |
mikrotik eth1 2a01:e35:zzz:f660::2/64
 |
 vlan10 2a01:e35:zzz:f661::2/64
 |
cisco sg300
 |   |   |
 |   |   linutop vlan630 2a01:e35:zzz:f663:214:bff:fe80:337b/64 (re0)
 |   |
 |   dell n7010 vlan640 2a01:e35:zzz:f664:40:15::1/64 (alc0)
 |      |
 |      tap6 2a01:e35:zzz:f665:40:15::1/96
 |
mac mini
 |  |  |
 |  |  vlan630 2a01:e35:zzz:f663::1/64 (gem0)
 |  |
 |  vlan640 2a01:e35:zzz:f664::1/64 (gem0)
 |
 gem0 2a01:e35:zzz:f661::22/64

2a01:e35:zzz:f660::/64

Le réseau entre ma pouetbox et mon routeur mikrotik. Oui, un /64 pour connecter 2 machines. Pas moyen de faire autrement.

2a01:e35:zzz:f661::/64

Le réseau entre mon routeur mikrotik et mon mac mini openbsd. Oui, un /64 pour connecter 2 machines. Mais c'est un prétexte pour faire mumuse avec les vlans (parce que cette engeance de cisco sg300 a beau être "ipv6 compliant", ce n'est qu'un client ipv6 tout juste capable d'accepter *UNE SEULE* adresse) et utiliser pf afin de sécuriser les autres /64.

Mes 2 fonera (dns) sont aussi dans ce réseau.

2a01:e35:zzz:f663::/64

Les machines de ce réseau n'offrent aucun service (excepté du ssh, oeuf corse).

2a01:e35:zzz:f664::/64

Les machines de ce réseau font de la virtualisation. Je réserve à chacune un /96 tiré de 2a01:e35:zzz:f665::/64. Exemple de configuration de 2a01:e35:zzz:f664:X:Y::1/64:

ospf

Le mac mini fait office de passerelle pour les réseaux 2a01:e35:zzz:f663::/64 et 2a01:e35:zzz:f663::/64. Il annonce ces réseaux par ospf:

$ cat /etc/ospf6.conf
redistribute connected

area 0.0.0.0 {
        interface gem0 {
        }
}

Côté mikrotik:

Flags: X - disabled, A - active, D - dynamic, C - connect, S - static, r - rip, o - ospf, b - bgp, 
U - unreachable 
 #      DST-ADDRESS             GATEWAY                  DISTANCE
 0 A S  ::/0                    fe80::f6ca:e5ff:fe5b:...        1
 1 ADC  2a01:e35:zzz:f660::/64  ether1-gateway                  0
 2 ADC  2a01:e35:zzz:f661::/64  vlan10                          0
 3 ADo  2a01:e35:zzz:f663::/64  fe80::20d:93ff:fe62:b...      110
 4 ADo  2a01:e35:zzz:f664::/64  fe80::20d:93ff:fe62:b...      110
 6 ADC  2a01:e35:zzz:f666::/64  wlan2                           0

ripng

Les machines de virtualisation annoncent leur /96 par ripng. Exemple d'un netbsd:

$ grep route6d /etc/rc.conf
route6d=YES
route6d_flags="-n -N lo0,alc0 -O 2a01:e35:zzz:f665:40:15::/96,tap6"

Le mac mini écoute les annonces ripng en provenance de vlan640:

$ grep route6d /etc/rc.conf.local
route6d=YES
route6d_flags="-N gem0,vlan630"

Reste à annoncer en ospf le réseau 2a01:e35:zzz:f665::/64:

$ cat /etc/ospf6.conf
redistribute connected
redistribute 2a01:e35:zzz:f665::/64

area 0.0.0.0 {
        interface gem0 {
        }
}

Extrait du pf.conf pour laisser passer toutes ces annonces:

# ospf
pass in quick on egress proto ospf
# routed
pass in quick on vlan inet6 proto udp to port 521

Trop beau pour être vrai

Seul petit point noir: route6d d'OpenBSD n'est pas fonctionnel (version 5.8 comprise). Mais c'est sans compter avec jca@ qui a magistralement corrigé le problème:

http://cvsweb.openbsd.org/cgi-bin/cvsweb/src/usr.sbin/route6d/route6d.c.diff?r1=1.67&r2=1.68

Un grand merci à lui.

Et en vrai ça marche ?

Côté mikrotik:

Flags: X - disabled, A - active, D - dynamic, C - connect, S - static, r - rip, o - ospf, b - bgp, 
U - unreachable 
 #      DST-ADDRESS              GATEWAY                  DISTANCE
 0 A S  ::/0                     fe80::f6ca:e5ff:fe5b:...        1
 1 ADC  2a01:e35:zzz:f660::/64  ether1-gateway                  0
 2 ADC  2a01:e35:zzz:f661::/64  vlan10                          0
 3 ADo  2a01:e35:zzz:f663::/64  fe80::20d:93ff:fe62:b...      110
 4 ADo  2a01:e35:zzz:f664::/64  fe80::20d:93ff:fe62:b...      110
 5 ADo  2a01:e35:zzz:f665:40... fe80::20d:93ff:fe62:b...      110
 6 ADC  2a01:e35:zzz:f666::/64  wlan2                           0

Depuis une machine extérieure:

dsx@blade>ping6 -c 3 2a01:e35:zzz:f664:40:15:0:1
PING6(56=40+8+8 bytes) 2a02:27d0:0:dead:beef::205 --> 2a01:e35:zzz:f664:40:15:0:1
16 bytes from 2a01:e35:zzz:f664:40:15:0:1, icmp_seq=0 hlim=53 time=24.744 ms
16 bytes from 2a01:e35:zzz:f664:40:15:0:1, icmp_seq=1 hlim=53 time=24.181 ms
16 bytes from 2a01:e35:zzz:f664:40:15:0:1, icmp_seq=2 hlim=53 time=24.472 ms

--- 2a01:e35:zzz:f664:40:15:0:1 ping6 statistics ---
3 packets transmitted, 3 packets received, 0.0% packet loss
round-trip min/avg/max/std-dev = 24.181/24.466/24.744/0.230 ms

Alors, c'est pas fun l'ipv6 ?


Lien vers ce billet

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