Table des matières

Xen

Cette page me sert d'aide-mémoire, une doc plus complète est dispo sur le Wikhan.

Si on veut jouer avec Xen (et en sélectionnant les recommandés utiles, donc pas “tout”) :

sudo apt install xen-tools xen-system-amd64 grub-xen-host qemu-utils gnupg arch-test bridge-utils qemu-system-xen shared-mime-info xdg-user-dirs

On fait un reboot et on voit si la commande “xl list” fonctionne, sinon faut bidouiller grub.

Réseau en local derrière un routeur

Le routeur gère déjà pas mal de choses, ça va être assez simple. Pour une version chez un hébergeur externe, voir la doc du Wikhan.

Donc on gère surtout surtout ce qui entre (input) et sort (output). On peut oublier les trucs genre forward, nat, etc.

Par contre il faut que chaque VM aie une ip interne sur le réseau local, pour ça on va configurer xen en mode bridge (mode par défaut).

On commence par voir quelle est le nom de nos interfaces réseaux :

ip a

Chez moi c'est enp2s0.

On vérifie aussi l'ip interne donnée par la box (192.168.1.X dans l'exemple) et l'ip de la box (192.168.1.254 chez OVH, attention ça change suivant les opérateurs).

Ensuite on modifie /etc/network/interfaces. On ajoute ceci (sans les commentaires) :

iface enp2s0 inet manual

iface xenbr0 inet static
        bridge_ports enp2s0
# L'adresse locale donnée par le routeur        
        address 192.168.1.X
        netmask 255.255.255.0
# L'adresse locale du routeur        
        gateway 192.168.1.254

et on va commenter d'autres parties mais pas tout, et puis ajouter le pont à lo, ce qui au final donne ça chez moi :

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
#source /etc/network/interfaces.d/*
# The loopback network interface
auto lo xenbr0
iface lo inet loopback
# The primary network interface
#allow-hotplug enp2s0
#iface enp2s0 inet dhcp
iface enp2s0 inet manual

iface xenbr0 inet static
        bridge_ports enp2s0
        address 192.168.1.68
        broadcast 192.168.1.255
        netmask 255.255.255.0
        gateway 192.168.1.254

Un petit reboot et tout devrait aller.

Au 30/06/2024 il y a toujours un bug présent, où l'interface eth0 est codé en dur dans la création des VM, alors que c'est enX0 qui est attendu.

La solution (en attendant le vrai patch) consiste à remplacer l'occurence de eth0 par enX0 dans /usr/share/xen-tools/common/40-setup-networking-deb.

Sources/tickets :

Paramètres par défaut des VM

/etc/xen-tools/xen-tools.conf
### Paramètres par défaut des VM
# Groupe de volumes où le script va créer des volumes logiques 
lvm = VgPoste
install-method = debootstrap
# Spécifier le mot de passe root à la création 
passwd = 1
# Les tailles sont définie en octet comme suit : G=Giga, M=Mega, k=Kilo
# Taille de la partition root où seront stockées les données
size = 20G
# RAM allouée à la machine
memory = 1G
# Taille de la partition swap
swap = 1G
# Système de fichiers
fs = ext4
# Distribution installée
# `xt-guess-suite-and-mirror --suite` : même distribution que le Dom0 
dist = `xt-guess-suite-and-mirror --suite`
 
# Les paramètres réseau
gateway = 192.168.1.254
netmask = 255.255.255.0
broadcast = 192.168.1.255
# préciser le nom du bridge
bridge = xenbr0
 
# On lance les VM via pygrub
pygrub = 1
# Exécuter immédiatement après création.
boot = 1
# copier les comptes utilisateur de l'hyperviseur sur les vms
accounts = 1

Modifications de base sur les VM

Squelette

Ces fichiers seront utilisés dans les VM (si j'ai suivi). Pour SSH c'est top. Evidement à adapter suivant qui doit avoir accès aux VM.

Tout ça en root (sudo ou vraiment avec root).

Ajout de la clé ssh personnelle dans le squelette des VM nouvellement créées :

mkdir -p /etc/xen-tools/skel/root/.ssh
chmod -R 700 /etc/xen-tools/skel/root
nano /etc/xen-tools/skel/root/.ssh/authorized_keys

Copie du home, ce qui permettra à nos users d'avoir leurs préférences :

cp -R /home /etc/xen-tools/skel/

Copie de la config SSH

mkdir -p /etc/xen-tools/skel/etc/ssh
cp /etc/ssh/sshd_config /etc/xen-tools/skel/etc/ssh/

On va aussi s'occuper des locales :

cp /etc/locale.gen /etc/xen-tools/skel/etc/locale.gen
mkdir -p /etc/xen-tools/skel/etc/default/
cp /etc/default/locale /etc/xen-tools/skel/etc/default/locale

Il faut par contre s'assurer avec les rôles que les bons droits seront donnés dans les vm à ces fichiers.

Rôles

Un rôle est un script appelé à la fin de la création de la VM. Ce qui permet d'installer certains paquets et d'adapter ce que le squelette ne permet pas (dont les droits…).

Le fichier ci-dessous marche… en partie. chown et chmod ne fonctionnent pas… faut trouver comment les écrire.

En attendant une fois la vm faite :

chown -R zatalyz:zatalyz /home/zatalyz
chmod 0700 /home/zatalyz/.ssh
chmod 0600 /home/zatalyz/.ssh/authorized_keys
chmod 644 /etc/locale.gen
locale-gen
chmod 644 /etc/default/locale
/etc/xen-tools/role.d/zatxen
#!/bin/sh
prefix=$1
# Vérifie que les trucs par défaut existent. Chemin valide sur Debian Bookworm.
if [ -e /usr/share/xen-tools/common.sh ]; then
    . /usr/share/xen-tools/common.sh
else
    echo "Installation problem"
fi
# Log our start
#
logMessage Script $0 starting
 
 
# Installation des paquets par défaut
chroot ${prefix} /usr/bin/apt-get update
chroot ${prefix} /usr/bin/apt-get -y -f upgrade
installDebianPackage ${prefix} nano 
installDebianPackage ${prefix} bash-completion 
installDebianPackage ${prefix} cron logrotate 
installDebianPackage ${prefix} apt-listbugs 
installDebianPackage ${prefix} debsums 
installDebianPackage ${prefix} apt-listchanges 
installDebianPackage ${prefix} sudo 
installDebianPackage ${prefix} rsyslog 
installDebianPackage ${prefix} net-tools 
installDebianPackage ${prefix} htop 
installDebianPackage ${prefix} iotop-c
installDebianPackage ${prefix} nload 
installDebianPackage ${prefix} binutils 
installDebianPackage ${prefix} dnsutils
installDebianPackage ${prefix} minisign
 
# Création de mon utilisateur (conflit avec l'option xen-tool "accounts")
# chroot ${prefix} useradd zatalyz -m -U -G sudo,www-data -s /bin/bash
# Si account à 1, préférer ceci
chroot ${prefix} /sbin/usermod -a -G sudo,www-data zatalyz -d /home/zatalyz -s /bin/bash
chown -R zatalyz:zatalyz ${prefix}/home/zatalyz
 
 
# Donner les bons droits sur ssh 
chmod 0700 ${prefix}/home/zatalyz/.ssh
chmod 0600 ${prefix}/home/zatalyz/.ssh/authorized_keys
 
# Mettre les locales comme il faut 
chmod 644 ${prefix}/etc/locale.gen
chroot ${prefix} /usr/sbin/locale-gen
chmod 644 ${prefix}/etc/default/locale
 
#  Log our finish
#
logMessage Script $0 finished

Donner ensuite les bons droits à ce fichier sinon ça va foirer :

sudo chmod a+x /etc/xen-tools/role.d/zatxen

Lors de la création de la VM, il faut préciser le role (pas trouvé si on peut y ajouter dans la config de xen-tool) :

xen-create-image --hostname=vm5 --dhcp --role=zatxen

Commandes pour les VM

Création d'une vm avec les paramètres par défaut et en laissant dhcp gérer les ip, et en variant la taille :

sudo xen-create-image --hostname=vm1test --dhcp  --role=zatxen --size 50g

S'y connecter depuis l'hyperviseur :

sudo xl console vm1test

Pour sortir de la VM, depuis l’hôte :

crlt + ( ou 5

Pour démarrer la VM :

xl create -c /etc/xen/myvm.cfg

Pour éteindre une VM, depuis l'hôte :

xl shutdown myvm

Forcer violemment une VM à s'éteindre (à éviter) :

xl destroy myvm

Faire un snapshot

lvcreate -L 10g -s -n NOMVM_snap_$(date --iso) /dev/VgNOM/NOMVM

Pare-feu etc

Voir Pare-feu : Iptables/Nftables, Fail2ban/Reaction.

Problèmes divers

Eth0 est utilisé à la place de enX0

Sur la gueste, si ip a indique eth0, et que /etc/network/interfaces est bien paramétré sur ceci :

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto enX0
iface enX0 inet dhcp

Alors on va ajouter une règle udev.

sudo nano /etc/udev/rules.d/70-persistent-net.rules
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="aa:bb:cc:dd:ee:ff", NAME="enX0"

Remplacer aa:bb:cc:dd:ee:ff par l’adresse MAC réelle de eth0.

On reboot et… ça va mieux.

 Ce texte est placé sous licence CC0