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
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.