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