Maniatux's Blog

Welcome to the internet

BSD

Aperçu de bhyve - Episode 1 vmrun.sh

Rédigé par Xavier - - Aucun commentaire

bhyve est un hyperviseur pour FreeBSD qui utilise les capacités de virtualisation du CPU (VT-x + EPT chez Intel et AMD-V + RVI chez AMD) et fourni des périphériques virtuels VirtIO aux systèmes invités. En un sens c'est une alternative à Linux-KVM pour FreeBSD. Cette solution vient en complément des jails qui se limitent à faire tourner du FreeBSD. bhyve supporte déjà des systèmes invités Linux, FreeBSD et OpenBSD. On ne sait pas encore si Windows sera supporté, mais c'est très probable. bhyve n'émule pas encore de bios ni de carte VGA, ce qui signifie que vous allez devoir travailler en mode texte, exactement comme pour les jails.

Il est intéressant de noter que bhyve est déjà pris en charge par libvirt, ce qui vous permet de gérer et piloter vos VM grâce à cette API, en local ou via une console distante (virt-manager). Je testerai cela probablement dans un prochain article.

Du virtuel dans du virtuel

Je n'ai pas de machine physique libre ayant les pré requis pour bhyve, c'est à dire avec un processeur suffisamment récent pour supporter à la fois VT-x et EPT. J'ai donc utilisé mon ordinateur portable de 2012 équipé d'un i5, sur lequel tourne Windows 7 (pour le travail) et sur lequel j'installe VMware Workstation. Pourquoi VMware ? Parce qu'il fourni une fonctionnalité intéressante : le support de nested VT-x. En gros la machine virtuelle que vous faites tourner peut elle-même faire tourner des machines virtuelles. Donc je vais pouvoir créer dans VMware une machine virtuelle FreeBSD, puis exécuter bhyve dans cette dernière afin de faire tourner d'autres VM dedans.

A noter que VirtualBox ne supporte pas le nested VT-x, ce qui signifie que votre VM FreeBSD ne pourra pas exécuter bhyve car absence d'accès aux instructions VT-X + EPT du CPU hôte.

Allons-y

Le site du projet bhyve fourni un lien vers un fichier texte contenant les instructions. Donc je me contente de les suivre pour le moment.

Charger les modules

Pour charger les modules de manière volatile :

# kldload vmm
# kldload if_tap

Note : Si une erreur s'affiche au chargement du module vmm, il est probable que votre processeur ne soit pas supporté, ou qu'il ne dispose pas des instructions VT-x ou EPT.

Pour charger les modules de manière persistante (au reboot), éditez le fichier /boot/loader.conf

vmm_load="YES"
if_tap_load="YES"

Récupérer le script d’exécution

Le script d’exécution devrait être présent dans /usr/share/examples/bhyve/vmrun.sh mais il est également possible de le récupérer à cette adresse :

# fetch http://people.freebsd.org/~neel/bhyve/vmrun.sh

Ce script va gérer la création de la VM, le montage de l'iso ,d'un périphérique de stockage et d'une interface réseau. Rendons-le exécutable :

# chmod +x vmrun.sh

Guest FreeBSD

Récupérer une ISO de FreeBSD 10 :

fetch http://people.freebsd.org/~neel/bhyve/release.iso.iso

Démarrer la VM :

./vmrun.sh vm1

Le bootloader du FreeBSD invité devrait alors s'afficher.

Après le chargement du kernel, on obtient une magnifie erreur de point de montage root non trouvé :

J'ai trouvé ce fil de discussion qui explique une solution de contournement, mais le problème c'est que je ne peux rien saisir au clavier, les caractères ne sont pas pris. Bug ? Limitation due à l'utilisation de VMware ? Il semblerait plutôt que ce soit un problème de console non adaptée.

Bon, faisons un deuxième essai. La FAQ de Bhyve mentionne l'existence d'images RAW de FreeBSD11-CURRENT conçues exprès pour démarrer dans Bhyve. Commencez par visiter le FTP avec l'adresse suivante : http://ftp.freebsd.org/pub/FreeBSD/snapshots/VM-IMAGES/11.0-CURRENT/amd64/Latest/ afin de repérer le nom de l'image. Ensuite récupérez cette image avec fetch (commande non détaillée car l'URL est trop longue).

Ensuite supprimons le fichier release.iso pour ne pas qu'il soit capturé par vmrun.sh, décompressons notre image RAW, et démarrons le tout :

# rm release.iso
# unxz FreeBSD-11.0-CURRENT-amd64-20140714-r268622.raw.xz
# ./vmrun.sh -d FreeBSD-11.0-CURRENT-amd64-20140714-r268622.raw vm1

Et cette fois ça marche. On arrive au login, il suffit d'entrer "root" sans mot de passe, et on accède à notre système virtuel FreeBSD 11 :

Pas d'accès au réseau pour le moment, mais c'est normal car la carte tap0 crée par le script vmrun.sh n'est reliée à rien (ni bridge ni routage). Il ne semble pas possible pour le moment de "sortir" de la vm ou de l'éteindre avec la commande shutdown. Cette dernière commande ne fera qu'arrêter le système guest, mais bhyve continuera de fonctionner. La solution constite à passer sur un autre tty (ALT+F2) et utiliser la commande suivante :

# bhyvectl --destroy --vm=vm1

Bhyve fonctionne plutôt bien mais est extrêmement basique, beaucoup de choses se font manuellement et l'émulation d'un CDROM ne semble pas vraiment au point puisque FreeBSD10 n'a pas réussi à booter. L'utilisation d'une image FreeBSD-11 toute prête a permis de contourner le problème, le boot s'est déroule bien et le clavier est pris en charge.

J'ai expliqué mon problème de FreeBSD10 qui ne boote pas sur irc (#bhyve), on m'a recommandé d'utiliser vmrc. Cela fera peut-être l'objet d'un prochain article.

Guest Linux

bhyve affirme supporter les guest Linux. Faisons donc un essai avec Debian Wheezy.

# fetch http://cdimage.debian.org/debian-cd/7.6.0/amd64/iso-cd/debian-7.6.0-amd64-netinst.iso

Ensuite démarrons cette VM à l'aide du script vmrun.sh mais en spécifiant cette fois l'emplacement de l'ISO :

# ./vmrun.sh -I debian-7.6.0-amd64-netinst.iso vm2

Le test va être rapide car cela ne marche pas du tout :

En l'absence de BIOS ou UEFI, bhyve n'est pas capable de booter tout seul. La FAQ de bhyve indique la nécessité d'utiliser sysutils/grub2-bhyve. On va s'arrêter là et miser sur vmrc dans un prochain article car il parait que tout ceci est alors automatisé.

Conclusion

Cette première découverte de bhyve est très intéressante. L'idée est bonne, utiliser la virtualisation matérielle VT-x + EPT et VirtIO pour les périphériques, ce qui assure en théorie le maximum de performances. Malheureusement son utilisation n'est vraiment pas évidente, on sent le côté expérimental de la chose. bhyve est un produit encore brut qu'il faudra exploiter avec de meilleurs outils.

pf.conf pour FreeBSD + IPv6 tunnel

Rédigé par Xavier - - 2 commentaires

Mon serveur tourne sur FreeBSD 10 et les services sont fournis par des jails sous Debian GNU/kFreeBSD. J'ai activé pf, le pare-feu sur l'hôte avec quelques règles de filtrage pour grosso modo tout autoriser en sortie, mais bloquer en entrée ce qui n'est pas désiré. Ces règles n'agissent que sur la partie IPv6 car je me repose sur le NAT de la box et les redirections de port pour filtrer ce qui entre l'IPv4.

Exemple

Dans l'exemple ci-dessous on va considérer les adresses suivantes :

  • Serveur IPv6 Address : 2001:470:c851::1
  • Client IPv6 Address : 2001:470:c851::2
  • www jail : 2001:470:c851::1001 (on va ouvrir les ports 80 et 443)
  • mail jail : 2001:470:c851::1002 (on va ouvrir les ports 25, 143 et 587)

Configuration

Note : Je me suis basé sur cette documentation chez SixXs.

/etc/rc.conf.local

# PF
pf_enable="YES"
pflog_enable="YES"

/etc/pf.conf/

# Macros
sendpoint = "2001:470:c851::1" # Votre Server IPv6 Address
cendpoint = "2001:470:c851::2" # Votre Client IPv6 Address
www = "2001:470:c851::1001" # ip de la jail www
mail = "2001:470:c851::1002" # ip de la jail mail
ext_inf = "gif0" # Mon interface tunnel

# don't filter l0
set skip on l0

# scrub incomming packets
scrub in all

# block in/out on $tun_if
block in log on $ext_inf inet6
block out log on $ext_inf inet6

# allow heartbeat ping
pass in quick on $ext_inf inet6 proto { ipv6-icmp } from $sendpoint to $cendpoin
t keep state

# pass tcp, udp, and icmp6 out on the ipv6 tunnel interface.
pass out quick on $ext_inf inet6 proto { tcp udp ipv6-icmp } keep state

# www jail
pass in quick on $ext_inf inet6 proto tcp from any to $www port { 80 443 }

# mail jail
pass in quick on $ext_inf inet6 proto tcp from any to $mail port { 25 143 587 }

Vérifier

pf dispose d'une commande pour vérifier un fichier de configuration :

# pfctl -vnf /etc/pf.conf

Charger

Lorsque la vérification est OK, on peut charger :

# service pf restart

Test en ligne

Certains sites vous proposent de scanner vos ports en ligne, notamment ce site. Il supporte les navigateurs en mode texte donc vous pouvez faire le scan directement depuis votre serveur ;)

Ressources

Debian GNU/kFreeBSD Wheezy dans une jail FreeBSD 10

Rédigé par Xavier - - 2 commentaires

Debian GNU/kFreeBSD peut être installé dans une jail sur un hôte FreeBSD. Intéressant si vous voulez garder votre serveur sous FreeBSD mais que vous voulez également profiter des jails pouvant puiser des paquets dans les dépôts Debian. Voici comment procéder.

Chargez les modules

# kldload fdescfs linprocfs linsysfs tmpfs

Ou, de manière permanente, éditez le fichier /boot/loader.conf :

fdescfs_load="YES"
linprocfs_load="YES"
linsysfs_load="YES"
tmpfs_load="YES"

Note : ces modules ne sont pas indispensables au fonctionnement de la jail Debian GNU/kFreeBSD. Mais si on installe cet OS à partir de l'ISO officielle, on voit qu'ils sont présents et liés aux points de montage que nous verrons par la suite. Mon hypothèse est qu'ils assurent une "compatibilité Linux" pour certains logiciels non pleinement fonctionnels. linprocfs est utilisé entre autres pour ps et df. En outre cela ne mange pas de pain de les activer :)

Création de la jail

Il va falloir utiliser debootstrap et installer également perl5 qui est une dépendance.

# pkg install debootstrap perl5

Puis on créé le répertoire de la jail :

# mkdir -p /usr/jails/debian

On installe le tout :

# debootstrap wheezy /usr/jails/debian http://cdn.debian.net/debian

Configuration de la jail

Editez le fichier /etc/jail.conf

# DEFAULT PARAMETERS
#
exec.start      = "/bin/sh /etc/rc";
exec.stop = "/bin/sh /etc/rc.shutdown";
exec.clean;
mount.devfs;
path = "/usr/jails/$name";
host.hostname = "$name";

# INDIVIDUAL JAIL PARAMETERS
#
debian {
        allow.mount;
        mount.devfs;
        mount.fstab="/usr/jails/debian/etc/fstab.debian";
        ip4.addr = re0|192.168.0.13;
        exec.start = "/etc/init.d/rc 3";
        exec.stop = "/etc/init.d/rc 0";
}

Editez ensuite /usr/jails/debian/etc/fstab.debian :

sys   /usr/jails/debian/sys         linsysfs  rw          0 0
proc  /usr/jails/debian/proc        linprocfs rw          0 0
tmpfs  /usr/jails/debian/run         tmpfs     rw,noexec,nosuid 0 0

Bidouille à faire pour les password, sinon la jail ne démarrera pas :

# cp /etc/master.passwd /usr/jails/debian/etc/
# pwd_mkdb -d /usr/jails/debian/etc -p /usr/jails/debian/etc/master.passwd

Démarrer la jail

# service jail start debian

On peut alors voir si la jail tourne :

# jls
   JID  IP Address      Hostname                      Path
    15  192.168.0.13    debian                      /usr/jails/debian

Et on visualise également nos points de montage :

# df -h
Filesystem     Size    Used   Avail Capacity  Mounted on
/dev/ada0p2    140G     11G    118G     9%    /
devfs          1.0K    1.0K      0B   100%    /dev
devfs          1.0K    1.0K      0B   100%    /usr/jails/debian/dev
fdescfs        1.0K    1.0K      0B   100%    /usr/jails/debian/dev/fd
linsysfs       4.0K    4.0K      0B   100%    /usr/jails/debian/sys
linprocfs      4.0K    4.0K      0B   100%    /usr/jails/debian/proc
tmpfs          4.0G     24K    4.0G     0%    /usr/jails/debian/run
devfs          1.0K    1.0K      0B   100%    /usr/jails/debian/dev

Notez que les points affichés peuvent être différents selon votre système.

Configurer notre Debian/kFreeBSD

Entrez dans la jail :

# jexec debian bash

Commencez par reconstruire les utilisateurs et mots de passe, car nous avons du copier ceux de FreeBSD (l'hôte) mais cela pose des problèmes :

# dpkg-reconfigure base-passwd

Reconfigurez tzdata pour remettre les pendules à l'heure :

# dpkg-reconfigure tzdata

Configurez les locales :

# apt-get update
# apt-get install locales
# dpkg-reconfigure locales

Et voilà.

Notez que Debian GNU/kFreeBSD est encore relativement peu utilisé, et je n'ai pas encore trouvé de retour d'expérience sur cet OS, encore moins quand on l'utilise dans une jail FreeBSD. C'est un territoire peu exploré il faut donc être prudent surtout sur un environnement de production.

Se faire une "IPv6 Box" - avec FreeBSD

Rédigé par Xavier - - Aucun commentaire

Fin 2013 j'ai publié un article expliquant comment se faire facilement une "IPv6 Box" sous Debian, c'est à dire un serveur qui donne accès à l'IPv6 à toutes les machines de votre réseau, en exploitant deux choses : un tunnel qui encapsule l'IPv6 dans de l'IPv4 (vous permettant ainsi d'en profiter alors que votre FAI ne le propose pas) et radvd un daemon qui présente votre passerelle au reste du réseau (les périphériques se génèrent eux-même une IPv6 complète par la suite).

Avec ce nouvel article, voici comment faire la même chose sur FreeBSD !

Pré requis

Pour la théorie et la présentation du mode de fonctionnement, je vous redirige vers l'article Se faire une IPv6 Box dans lequel il y a les schémas et tout ce qui va avec. Ce que vous devez avoir, c'est :

  • Un tunnel chez Hurricane Electric en /48
  • Un serveur FreeBSD bien entendu, relié au même LAN que les machines que vous voulez desservir

Montage du tunnel

A ajouter au /etc/rc.conf.local :

#IPV6 HE tunnel
ipv6_gateway_enable="YES"
ipv6_interfaces="auto"
ipv6_activate_all_interfaces="YES"
ipv6_cpe_wanif="gif0"
ifconfig_re0_ipv6="inet6 2001:470:c851:192::1 prefixlen 64"
cloned_interfaces="gif0"
ifconfig_gif0="tunnel 192.168.0.10 216.66.84.42"
ifconfig_gif0_ipv6="inet6 2001:470:c851:10::1 2001:470:c851::1 prefixlen 128"
ipv6_defaultrouter="2001:470:c851::1"
rtadvd_enable="YES"
rtadvd_interfaces="re0"

A remplacer par les éléments dont vous disposez :

  • ifconfig_re0_ipv6 : Adresse IPv6 que vous donnez à votre interface de LAN (attention votre interface ne s'appelle pas forcément re0)
  • ifconfig_gif0 : Adresse du LAN et adresse du serveur chez HE (Server IPv4 Address)
  • ifconfig_gif0_ipv6 : Adresse IPv6 que vous donnez au gif0 et adresse du serveur chez HE (Server IPv6 Address)
  • ipv6_default_router : Adresse du serveur chez HE (Server IPv6 Address)

Ensuite redémarrez votre système (la commande netif ne monte pas les tunnels IPv6).

Configuration de rtadvd

Rtadvd va faire du router advertisement c'est à dire qu'il va signaler sa présence sur le LAN aux autres machines. Vos périphériques vont donc pouvoir se générer une adresse IPv6 à partir du préfixe dont ils disposent. Donc créez et éditez le fichier /etc/rtadvd.conf :

re0:\
        :addrs#1:addr="2001:470:c851:192::":prefixlen#64:tc=ether:

Comme vous l'avez deviné ce fichier contient le préfixe du LAN.

Prenez soin de démarrer rtadvd :

# service rtadvd start

Vérification

Sur une autre machine de votre LAN, reconnectez le réseau. Vous devez maintenant voir que vous récupérez une IPv6 :

Vous pouvez aussi utiliser le site test-ipv6.com

Note : J'ai masqué mon IPv6 en rouge sur la capture, par contre j'ai laissé tout ce qui est IPv4, car soit c'est du LAN, soit c'est l'adresse IP de maniatux que tout le monde peut déjà voir ;)

Ressources

FreeBSD : pkgng ne permet pas de tout faire comme apt-get

Rédigé par Xavier - - 6 commentaires

Pkgng est un gestionnaire de paquets moderne pour FreeBSD censé mieux gérer l'installation, l'upgrade et la désinstallation des paquets tiers. Ma réaction, comme beaucoup fut "un apt-get like sur FreeBSD, enfin !". Oui, mais il faut différentier l'outil de gestion des paquets, et les dépôts binaires eux-même.

En effet, FreeBSD est un système d'exploitation composé d'un ensemble de logiciels. Mais quand on veut un autre logiciel, par exemple dovecot, historiquement on doit utiliser les ports. Les ports, c'est une arborescence contenant des scripts qui vont télécharger les sources et compiler les logiciels et leurs dépendances. Au moment de compiler, une interface en ncurses va proposer à l'utilisateur de sélectionner les options dont il a besoin ou non. Par exemple, pour dovecot, on peut activer ou non le support de MySQL.

FreeBSD fourni également des dépôts dans lesquels ces logiciels tiers sont déjà compilés, on gagne ainsi pas mal de temps. Mais ces versions binaires ne permettent pas de choisir les options. Par exemple, dovecot n'a pas le support de MySQL. Que peut-on faire si on en a besoin ? Eh bien on en revient aux ports, et on compile.

Debian et apt-get ont résolu ce problème en découpant en plusieurs modules un paquet. Par exemple, pour dovecot, il y a plusieurs paquets, comme on le voit ici. Le paquet dovecot va installer la version basique. Si on veut le support mysql, on installe en plus le paquet dovecot-mysql.

Pkgng et les dépôts de logiciels binaires se contentent de fournir des versions compilées des ports. Il n'y a aucune gestion des options, probablement parce que ces systèmes sont conçus pour pouvoir utiliser l'un et l'autre en même temps. Mais en pratique c'est problématique. Il y a le même problème avec PHP, si on veut php-fpm, c'est une option à activer lors de la compilation de php55. La version de php55 qui vient des dépôts binaires ne supporte pas php-fpm.

Il ne faut donc pas se faire d'illusions, pkgng ne rend pas FreeBSD aussi simple que Debian quand il s'agit de gérer des paquets. Dans la pratique, on utilise encore beaucoup les ports.

Classé dans : BSD - Mots clés : aucun