Installer OpenBSD sur un environnement distant avec systeme rescue

Ce document présente une méthode pour installer OpenBSD sur des serveurs sans accès console. Dedibox est une service français qui propose ce genre de serveurs à de faibles coûts.

Comme ces serveurs n'ont pas d'accès console, que se passe-t-il lorsqu'il y a une panne sur le serveur (fsck qui ne passe pas sans une intervention humaine lors du boot, …) ? Dedibox fournit pour les système linux un mode rescue qui est en fait un linux booté via BOOTP. Mais ce mode rescue linux n'est pas compatible avec des serveurs sous OpenBSD.

La solution est d'installer sur un même serveur deux instances d'OpenBSD. L'une, de petite taille, servira de rescue en cas de crash. Nous l'appelleront “rescue”. L'autre, qui occupera tout le reste du disque, servira d'OS de production. Nous l'appelleront “production”.

L'idée est d'utiliser YAIFO (Yet Another Installer For OpenBSD). Il permet de créer une image d'installation d'OpenBSD embarquant un serveur SSH. Une fois connecté, vous pourrez faire l'installation à la main.

Prérequis

  • Un système local avec la même version OpenBSD (4.6) dans notre cas. Personnellement je travaille énormément avec VmWare pour avoir des OS disponible facilement.
  • Les sources src.tar.gz et sys.tar.gz
$ ftp ftp://ftp.fr.openbsd.org/pub/OpenBSD/4.6/src.tar.gz
$ ftp ftp://ftp.fr.openbsd.org/pub/OpenBSD/4.6/sys.tar.gz
  • Les sources extraites dans le répertoire /usr/src
$ tar -xzvf src.tar.gz -C /usr/src
$ tar -xzvf sys.tar.gz -C /usr/src
  • Les sources de yaifo qu'on récupère par cvs
 $ cvs -d :pserver:anoncvs@yaifo.cvs.sourceforge.net:/cvsroot/yaifo co -P yaifo
  • Vos informations de box (adresse IP, netmask, route par défaut et DNS)

Création de l'image yaifo

Il faut dans un premier temps configurer yaifo pour notre serveur. Cela se fait en éditant le fichier “config”.

  • TYPE=remote
  • SNAPSHOT=no
  • DEVICE=
  • DEVICE2=
  • IP2=
  • NETMASK2=
  • DHCP=off
  • DNS=88.191.254.60
  • SEARCH=88.191.254.60 88.191.254.70
  • IP=88.191.XX.YY
  • NETMASK=255.255.255.0
  • GATEWAY=88.191.XX.1
  • SPECIAL=0

Ensuite il faut copier les clés pour le serveur SSH. On peut prendre celle de notre serveur de test. De toute façon leur utilisation n'est que temporaire.

  cp /etc/ssh/ssh_host_*_key* /path/to/yaifo

L'utilisation d'un mot de passe n'est pas géré par yaifo. Il faut donc lui donné une clé publique afin que l'on puisse s'y connecter.

  • Si ce n'est pas fait, vous pouvez vous créer une clé en local (ssh-keygen -t rsa)
  • Il faut ensuite copier la clé publique dans le répertoire de yaifo
cat ~/.ssh/id_rsa.pub > /path/to/yaifo/authorized_keys

Il ne reste plus qu'à compiler yaifo (attention ça peut prendre un peu de temps vu qu'il recompile un kernel pour l'occasion)

$ make cleanall
$ make obj
$ make

Si tout se passe correctement vous devriez avoir un fichier yaifo.fs et yaifo.rd qui ont été généré par la commande make.

C'est le fichier yaifo.fs qui nous intéresse.

Mise en place de l'image de yaifo sur notre serveur dédié

Redémarrez votre serveur en mode rescue puis téléchargez et installez le fichier yaifo.fs puis copiez le au début de votre disque dur pour qu'au boot suivant il se lance comme si c'était le système installé par défaut.

$ wget -O - http://serveur_où_se_trouve_yaifo.fs/yaifo.fs | dd of=/dev/sda bs=1M && sync

Quittez ensuite le mode rescue.

Installation d'OpenBSD via yaifo

Ca y est, notre serveur a rebooté et nous pouvons le pinger. Il est temps de s'y connecter en utilisant la clé privée correspondant à la clé publique configurée lors de la création de l'image yaifo.

$ ssh root@88.191.XX.YY
The authenticity of host '88.191.XX.YY (88.191.XX.YY)' can't be established.
RSA key fingerprint is 3b:14:2a:43:a9:41:74:cd:9d:e1:81:46:9b:46:0a:70.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '88.191.XX.YY' (RSA) to the list of known hosts.
Welcome to YAIFO: The network-based installer for OpenBSD.
 
Welcome to the OpenBSD/i386 4.6 installation program.
(I)nstall, (U)pgrade or (S)hell?

On lance l'install par I

Choose your keyboard layout ('?' or 'L' for list) [default] fr
System hostname? (short form, e.g. 'foo') foo
Password for root account? (will not echo) ********
Password for root account? (again) ********
Start sshd(8) by default? [yes] ↵
Start ntpd(8) by default? [no]Do you expect to run the X Window System? [yes] no
Change the default console to com0? [no] ↵
Setup a user? (enter a lower-case loginname, or 'no') [no] ↵
Which one is the root disk? (or 'done') [wd0] wd0
Do you want to zero out the first bytes of the disk? [no] no
Use (W)hole disk, use the (O)penBSD area, or (E)dit the MBR? [OpenBSD] E

On commence pour retirer toutes les partitions. Pour toutes les partitions qui n'ont pas un ID à 00, il faut faire:

fdisk: 1> e #id
Partition id ('0' to disable)  [0 - FF]: [A6] (? for help) 0
Ensuite on va créer **deux partitions**:

1 en tête de disque pour le rescue

fdisk: 1> e 0
Partition id ('0' to disable)  [0 - FF]: [0] (? for help) 10
Do you wish to edit in CHS mode? [n] ↵
offset: [0] 63 (On commence toujours la première partition à 63 secteurs, car les 63 premiers sont réservés pour le MBR)
size: [0] 1622502 (On prend qqc comme 700M, 1622502 * 512 = 792Mo)

1 juste après pour la production

fdisk:*1> e 1
Partition id ('0' to disable)  [0 - FF]: [A6] (? for help) A6
Do you wish to edit in CHS mode? [n] ↵
offset: [2097215] 1622565 (pour l'offset, on fait la somme de l'offset et de la taille de la partition précédente, 63 + 1622502 = 1622565)
size: [14680001] * (pour indiquer qu'on va prendre tout l'espace)

Il ne reste plus qu'à marquer la partition 1 (production) comme active

fdisk:*1> f 1
Partition 1 marked active.

On se retrouve avec la table de partition suivante:

                      #
                        fdisk:*1> p
                        Disk: wd0       geometry: 1044/255/63 [16777216 Sectors]
                        Offset: 0       Signature: 0xAA55
                                    Starting         Ending         LBA Info:
                         #: id      C   H   S -      C   H   S [       start:        size ]
                        -------------------------------------------------------------------------------
                         0: 10      0   1   1 -    100 254  63 [          63:     1622502 ] OPUS
                         1: A6    101   0   1 -   1044  85   1 [     1622565:    15154651 ] OpenBSD
                         2: 00      0   0   0 -      0   0   0 [           0:           0 ] unused
                         3: 00      0   0   0 -      0   0   0 [           0:           0 ] unused

On peut sauvegarder et quitter fdisk

                      # fdisk:*1> w
                      # Writing MBR at offset 0.
                      # fdisk:*1> q
                Use (A)uto layout, (E)dit auto layout, or create (C)ustom layout? [a] e
                
                  > p
                  OpenBSD area: 1622565-16777216; size: 15154651; free: 0
                  #                size           offset  fstype [fsize bsize  cpg]
                    a:           246550          1622565  4.2BSD   2048 16384    1 # /
                    b:           246550          1869115    swap
                    c:         16777216                0  unused
                    d:           378096          2115665  4.2BSD   2048 16384    1 # /tmp
                    e:           378886          2493761  4.2BSD   2048 16384    1 # /var
                    f:          1261884          2872647  4.2BSD   2048 16384    1 # /usr
                    g:          1098202          4134531  4.2BSD   2048 16384    1 # /usr/X11R6
                    h:          4277014          5232733  4.2BSD   2048 16384    1 # /usr/local
                    i:          1622502               63 unknown
                    j:          2146778          9509747  4.2BSD   2048 16384    1 # /usr/src
                    k:          2146778         11656525  4.2BSD   2048 16384    1 # /usr/obj
                    l:          2973913         13803303  4.2BSD   2048 16384    1 # /home

L'install nous a créé les labels au mieux. On peut le modifier. Dans le cadre ce ce tuto on s'en contentera. Il faut néanmoins supprimer le label i qui est accès à notre partition de rescue. Elle n'est pas utile sur le système de production.

                      # > d i

On conserve dans un coin cette table de labels de l'OS de production, elle nous permettra de retrouver nos petits depuis le serveur de production! On sauve et on quitte:

                      # > w
                      # > q

Il va formater les partitions définies. Maintenant nous allons pouvoir installer les sets que nous désirons:

                      # Location of sets? (disk ftp http or 'done') [ftp] ↵
                      # HTTP/FTP proxy URL? (e.g. 'http://proxy:8080', or 'none') [none] ↵
                      # Server? (hostname, list#, 'done' or '?') [ftp.fr.openbsd.org] ↵
                      # Server directory? [pub/OpenBSD/4.6/i386] ↵
                      # Login? [anonymous] ↵
                      # Dans le cadre d'un serveur, les packages x* ne sont pas utiles. On les vire donc:
                            *
                              Select sets by entering a set name, a file name pattern or 'all'. De-select
                              sets by prepending a '-' to the set name, file name pattern or 'all'. Selected
                              sets are labelled '[X]'.
                                  [X] bsd          [ ] bsd.mp       [X] etc46.tgz    [X] comp46.tgz   [X] game46.tgz   [X] xetc46.tgz   [X] xfont46.tgz
                                  [X] bsd.rd       [X] base46.tgz   [X] misc46.tgz   [X] man46.tgz    [X] xbase46.tgz  [X] xshare46.tgz [X] xserv46.tgz
                              Set name(s)? (or 'abort' or 'done') [done] -x*
                                  [X] bsd          [ ] bsd.mp       [X] etc46.tgz    [X] comp46.tgz   [X] game46.tgz   [ ] xetc46.tgz   [ ] xfont46.tgz
                                  [X] bsd.rd       [X] base46.tgz   [X] misc46.tgz   [X] man46.tgz    [ ] xbase46.tgz  [ ] xshare46.tgz [ ] xserv46.tgz
                              Set name(s)? (or 'abort' or 'done') [done] done
                      # L'installation des packages demandé se fait assez rapidement.
                            * Location of sets? (disk ftp http or 'done') [done] done
                            * What timezone are you in? ('?' for list) [Europe/Paris] Europe/Paris
                            * Do you want to copy the SSH Host Keys from the Yaifo image? [yes] no (on ne veut pas utilise les clés de serveur utilisé par yaifo, de nouvelles seront générées au premier boot)
                            *
                              Making all device nodes...done.

                              CONGRATULATIONS! Your OpenBSD install has been successfully completed!
                              To boot the new system, enter 'reboot' at the command prompt.
                              When you login to your new system the first time, please read your mail
                              using the 'mail' command.

L'OS de production est maintenant installé. On relance l'install pour faire du système de rescue:

                # install
                Choose your keyboard layout ('?' or 'L' for list) [default] fr
                System hostname? (short form, e.g. 'foo') [foo] rescue
                Password for root account? (will not echo) ********
                Password for root account? (again) ********
                Start sshd(8) by default? [yes]  ↵
                Start ntpd(8) by default? [no]  ↵
                Do you expect to run the X Window System? [yes] no
                Change the default console to com0? [no]  ↵
                Setup a user? (enter a lower-case loginname, or 'no') [no]  ↵
                Which one is the root disk? (or 'done') [wd0] wd0
                
                Do you want to zero out the first bytes of the disk? [no] no
                Use (W)hole disk, use the (O)penBSD area, or (E)dit the MBR? [OpenBSD] e

                  You will now create a single MBR partition to contain your OpenBSD data. This
                  partition must have an id of 'A6'; must *NOT* overlap other partitions; and
                  must be marked as the only active partition.  Inside the fdisk command, the
                  'manual' command describes all the fdisk commands in detail.

                  Disk: wd0       geometry: 1044/255/63 [16777216 Sectors]
                  Offset: 0       Signature: 0xAA55
                              Starting         Ending         LBA Info:
                   #: id      C   H   S -      C   H   S [       start:        size ]
                  -------------------------------------------------------------------------------
                   0: 10      0   1   1 -    100 254  63 [          63:     1622502 ] OPUS
                  *1: A6    101   0   1 -   1044  85   1 [     1622565:    15154651 ] OpenBSD
                   2: 00      0   0   0 -      0   0   0 [           0:           0 ] unused
                   3: 00      0   0   0 -      0   0   0 [           0:           0 ] unused
                  Enter 'help' for information

On va intervertir les ID des partition et marquer la partition 0 comme active:

                      # fdisk: 1> e 0
                            * Partition id ('0' to disable)  [0 - FF]: [10] (? for help) A6
                            * Do you wish to edit in CHS mode? [n] ↵
                            * offset: [63] ↵
                            * size: [1622502] ↵
                      # fdisk: 1> e 1
                            * Partition id ('0' to disable)  [0 - FF]: [A6] (? for help) 10
                            * Do you wish to edit in CHS mode? [n] ↵
                            * offset: [1622565] ↵
                            * size: [15154651] ↵
                      # fdisk:*1> f 0

On affiche la nouvelle table de partition:

                      #
                        fdisk:*1> p
                        Disk: wd0       geometry: 1044/255/63 [16777216 Sectors]
                        Offset: 0       Signature: 0xAA55
                                    Starting         Ending         LBA Info:
                         #: id      C   H   S -      C   H   S [       start:        size ]
                        -------------------------------------------------------------------------------
                        *0: A6      0   1   1 -    100 254  63 [          63:     1622502 ] OpenBSD
                         1: 10    101   0   1 -   1044  85   1 [     1622565:    15154651 ] OPUS
                         2: 00      0   0   0 -      0   0   0 [           0:           0 ] unused
                         3: 00      0   0   0 -      0   0   0 [           0:           0 ] unused

On sauve et on quitte:

                      # fdisk:*1> w
                      # fdisk: 1> q

L'installer nous propose les labels suivants:

                      #
                        The auto-allocated layout for wd0 is:
                        #                size           offset  fstype [fsize bsize  cpg]
                          a:           786.7M               63  4.2BSD   2048 16384    1 # /
                          b:             5.6M          1611123    swap
                          c:          8192.0M                0  unused
                          i:          7399.7M          1622565 unknown

Le système nos propose une partition / de 786Mo ce qui est suffisant et très peu de swap et ca nous va bien. Le label i correspond à la partition de production. On la laisse en l'état actuellement. On accepte donc cette configuration.

                      # Use (A)uto layout, (E)dit auto layout, or create (C)ustom layout? [a] a

On suit désormais la même procédure que pour le système de production. Pour le choix des sets, il faut se limiter au strict minimum:

                      # bsd, base46, etc46, misc46 et man46 (on peut se permettre de mettre le man qui est toujours très utile)

Les deux systèmes ont été installés. Si l'on reboot en l'état le serveur va démarrer sur le serveur de rescue. C'est très bien, on va commencer par le tweaker un peu.

                  # reboot

Tweak du système de rescue

Une fois que le système a redémarré, vous devriez pouvoir le pinger et vous logger en root avec le mot de passe que vous avez spécifier pendant l'install.

Si vous avez mis un mot de passe simple et temporaire il est temps de le changer.

La première chose à faire est de modifier le /etc/motd pour indiquer que l'on est sur le système de rescue:

# cat > /etc/motd
*********************
*                                  *
*          RESCUE              *
*       OpenBSD 4.6          *
*                                  *
*********************
^D

Disklabel

C'est le moment de configurer l'accès à nos labels du système de production. On reprend la table de label du système de production que nous avons sauvé:

OpenBSD area: 1622565-16777216; size: 15154651; free: 0
#                size           offset  fstype [fsize bsize  cpg]
  a:           246550          1622565  4.2BSD   2048 16384    1 # /
  b:           246550          1869115    swap
  c:         16777216                0  unused
  d:           378096          2115665  4.2BSD   2048 16384    1 # /tmp
  e:           378886          2493761  4.2BSD   2048 16384    1 # /var
  f:          1261884          2872647  4.2BSD   2048 16384    1 # /usr
  g:          1098202          4134531  4.2BSD   2048 16384    1 # /usr/X11R6
  h:          4277014          5232733  4.2BSD   2048 16384    1 # /usr/local
  i:          1622502               63 unknown
  j:          2146778          9509747  4.2BSD   2048 16384    1 # /usr/src
  k:          2146778         11656525  4.2BSD   2048 16384    1 # /usr/obj
  l:          2973913         13803303  4.2BSD   2048 16384    1 # /home

On va editer le disklabel du système de rescue:

# disklabel -E wd0
Label editor (enter '?' for help at any prompt)
> p
OpenBSD area: 63-1622565; size: 1622502; free: 0
#                size           offset  fstype [fsize bsize  cpg]
  a:          1611060               63  4.2BSD   2048 16384    1 # /
  b:            11442          1611123    swap
  c:         16777216                0  unused
  i:         15154651          1622565 unknown

On supprime le label i qui nous est inutile:

 > d i

On indique qu'on peut utiliser tout l'espace pour les labels:

> b
Starting sector: [63] 63
Size ('*' for entire disk): [1622502] *

Pour chaque label de production, nous avons un offset et une taille (size). On va donc ajouter un label sur notre système de rescue avec ces infos en commencant par le label d:

  • Partition de production / (wd0a, offset=1622565, size=246550)
            > a d
            offset: [1622565] 1622565
            size: [15154651] 246550
            FS type: [4.2BSD]
  • Partition de production /tmp (wd0d, offset=2115665, size=378096)
            > a e
            offset: [1622565] 2115665
            size: [15154651] 378096
            FS type: [4.2BSD]
  • Partition de production /var (wd0e, offset=2493761, size=378886)
            > a f
            offset: [1622565] 2493761
            size: [15154651] 378886
            FS type: [4.2BSD]
  • Partition de production /usr (wd0f, offset=2872647, size=1261884)
            > a g
            offset: [1622565] 2872647
            size: [15154651] 1261884
            FS type: [4.2BSD]
  • Partition de production /usr/X11R6 (wd0g, offset=4134531, size=1098202)
            > a h
            offset: [1622565] 4134531
            size: [15154651] 1098202
            FS type: [4.2BSD]
  • Partition de production /usr/local (wd0h, offset=5232733, size=4277014)
            > a i
            offset: [1622565] 5232733
            size: [15154651] 4277014
            FS type: [4.2BSD]
  • Partition de production /usr/src (wd0j, offset=9509747, size=2146778)
            > a j
            offset: [1622565] 9509747
            size: [15154651] 2146778
            FS type: [4.2BSD]
  • Partition de production /usr/obj (wd0k, offset=11656525, size=2146778)
            > a k
            offset: [1622565] 11656525
            size: [15154651] 2146778
            FS type: [4.2BSD]
  • Partition de production /home (wd0l, offset=13803303, size=2973913)
            > a l
            offset: [1622565] 13803303
            size: [15154651] 2973913
            FS type: [4.2BSD]

On se retrouve avec le disklabel suivant:

> p
OpenBSD area: 63-16777216; size: 16777153; free: 246550
#                size           offset  fstype [fsize bsize  cpg]
  a:          1611060               63  4.2BSD   2048 16384    1 # /
  b:            11442          1611123    swap
  c:         16777216                0  unused
  d:           246550          1622565  4.2BSD   2048 16384    1
  e:           378096          2115665  4.2BSD   2048 16384    1
  f:           378886          2493761  4.2BSD   2048 16384    1
  g:          1261884          2872647  4.2BSD   2048 16384    1
  h:          1098202          4134531  4.2BSD   2048 16384    1
  i:          4277014          5232733  4.2BSD   2048 16384    1
  j:          2146778          9509747  4.2BSD   2048 16384    1
  k:          2146778         11656525  4.2BSD   2048 16384    1
  l:          2973913         13803303  4.2BSD   2048 16384    1

wd0d est le wd0a de notre système de production et ainsi de suite.

On sauve et on quitte:

 > w
 > q
 No label changes.

Table Des Partitions

On va configurer le /etc/fstab pour ne pas à avoir à nous souvenir de cette correspondance lors de l'utilisation du rescue. On rajoute les lignes suivantes dans le /etc/fstab:

/dev/wd0d /mnt ffs rw,noauto 0 0
/dev/wd0e /mnt/tmp ffs rw,noauto 0 0
/dev/wd0f /mnt/var ffs rw,noauto 0 0
/dev/wd0g /mnt/usr ffs rw,noauto 0 0
/dev/wd0h /mnt/usr/X11R6 ffs rw,noauto 0 0
/dev/wd0i /mnt/usr/local ffs rw,noauto 0 0
/dev/wd0j /mnt/usr/src ffs rw,noauto 0 0
/dev/wd0k /mnt/usr/obj ffs rw,noauto 0 0
/dev/wd0l /mnt/home ffs rw,noauto 0 0

On a spécifié le flag noauto pour pas qu'ils ne soient montés au boot car si on a besoin du rescue, il a de grandes chances qu'une des partition merde. Idem on ne spécifie aucune vérification lors du boot (0 0 à la fin).

Montage du système de production sur le système de rescue

# grep mnt /etc/fstab | awk '{print $2}' | while read i; do mount $i; done
# mount
/dev/wd0a on / type ffs (local)

/dev/wd0d on /mnt type ffs (local)
/dev/wd0e on /mnt/tmp type ffs (local)
/dev/wd0f on /mnt/var type ffs (local)
/dev/wd0g on /mnt/usr type ffs (local)
/dev/wd0h on /mnt/usr/X11R6 type ffs (local)
/dev/wd0i on /mnt/usr/local type ffs (local)
/dev/wd0j on /mnt/usr/src type ffs (local)
/dev/wd0k on /mnt/usr/obj type ffs (local)
/dev/wd0l on /mnt/home type ffs (local)

Voilà avec un rescue qui a accès aux partition du système de production :) On peut même s'y croire dedans via chroot:

# chroot /mnt
# cat /etc/myname
foo
# exit

Maintenant qu'on a un rescue propre et prêt à être utilisé, il nous reste plus qu'à passer sur notre système de production.

Passage d'un système à l'autre.

Pour ce faire, il faut booter sur le rescue que propose votre fournisseur d'accès. Dans l'exemple qui suit nous utiliserons celui dedibox.

  • Passez votre serveur en rescue via la console dedibox.
  • Loggez vous avec le login/pass fourni lors du passage en rescue
  • passez root avec sudo (le mot de passe sera demandé):
      sudo su -
    # fdisk /dev/sda
    * Commande (m pour l'aide): p

      Disque /dev/sda: 160.0 Go, 160041885696 octets
      255 heads, 63 sectors/track, 19457 cylinders
      Units = cylindres of 16065 * 512 = 8225280 bytes
      Disk identifier: 0x00000000

      Périphérique Amorce    Début         Fin      Blocs    Id  Système
      /dev/sda1   *            1         101      811251   a6  OpenBSD
      /dev/sda2             102       19457   155477070   10  OPUS
    
  • On passe le partition 1 en OPenBSD
  Commande (m pour l'aide): t
            Numéro de partition (1-4): 1
            Code Hex (taper L pour lister les codes): 10
            Type de partition système modifié de a6 a 10 (OpenBSD)
    
  • On passe la partition 2 en OpenBSD
            Commande (m pour l'aide): t
            Numéro de partition (1-4): 2
            Code Hex (taper L pour lister les codes): A6
            Type de partition système modifié de 10 a a6 (OpenBSD)
  • On enlève le flag actif sur la partition 1
      Commande (m pour l'aide): a
            Numéro de partition (1-4): 1
  • On active le flag actif sur la partition 2
      Commande (m pour l'aide): a
            Numéro de partition (1-4): 1
  • On sauvegarde et on quit
           Commande (m pour l'aide): w
            La table de partitions a été altérée

            Appel de ioctl() pour relire la table de partitions.
            Synchronisation des disques.
  • Il ne nous reste plus qu'à repasser le serveur en mode normal et vous aurez votre système de production actif!

Pour passer sur l'OpenBSD de rescue, il faut faire l'opération inverse. Simple non ? :)


Auteur : Jérôme Loyet
Contribution : Azwaw OUSADOU (Mise En Page)
Date de réalisation : 13/11/2009
Version d'OpenBSD : 4.6

documentations/install/installer_openbsd_via_yaifo.txt · Dernière modification: 2011/11/23 14:44 par rustybsd
OpenBSD Apache Driven by DokuWiki
CC Attribution-Noncommercial-Share Alike 3.0 Unported