# Virtualisation

## Création d'une VM

Pour créer une machine la procédure est la suivante :

* Se déplacer dans le dossier `/root/vms-init`
* Créer l'image de disque à partir de la base de l'os voulu `qemu-img create -f qcow2 -F qcow2 -b /var/lib/libvirt/images/bases/<variante de l'os>.img /var/lib/libvirt/images/storage/<nom de la vm>.img <taille>`
* Modifier le nom de l'instance et l'hostname dans `state/meta-data`:
```yaml
instance-id: <nom de la vm>
local-hostname: <nom de la vm>.vm.ppsfleet.navy
```
* Générer le volume de seed pour cloud-init `genisoimage -output /var/lib/libvirt/images/seeds/<nom de la vm>.iso -volid cidata -joliet -rock state/user-data state/meta-data`
* Démarrer la vm `virt-install --name <nom de la vm> --memory 2048 --vcpu 2 --import --disk path=/var/lib/libvirt/images/storage/<nom de la vm>.img,format=qcow2 --disk path=/var/lib/libvirt/images/seeds/<nom de la vm>.iso,device=cdrom --os-variant <variante de l'os> --network network=vm-net --wait 0`

Script complet:

```sh
export vm_name=test01
export os_variant=centos-stream8

cd /root/vms-init

qemu-img create -f qcow2 -F qcow2 -b /var/lib/libvirt/images/bases/${os_variant}.img /var/lib/libvirt/images/storage/${vm_name}.img 20G

cat > state/meta-data <<EOF
instance-id: ${vm_name}
local-hostname: ${vm_name}.vm.ppsfleet.navy
EOF

genisoimage -output /var/lib/libvirt/images/seeds/${vm_name}.iso -volid cidata -joliet -rock state/user-data state/meta-data

virt-install --name ${vm_name} --memory 2048 --vcpu 2 --import --disk path=/var/lib/libvirt/images/storage/${vm_name}.img,format=qcow2 --disk path=/var/lib/libvirt/images/seeds/${vm_name}.iso,device=cdrom --os-variant ${os_variant} --network network=vm-net --wait 0
```

De manière plus automatisée le script `/root/vms-init/create.sh` reprend les commandes ci-dessus pour créer une VM avec 20Go de disque, 2 vCPU et 2Go de mémoire :
```sh
$ /root/vms-init/create.sh <nom de la vm> <distribution>
```

Distribution disponibles et testées :

| Nom | id (variante) |
|:--- |:---|
| Ubuntu 20.04 | ubuntu20.04 |
| Centos 8 | centos-stream8 |
| Debian 10 | debian10 |

## Connection

L'utilisateur par défaut est `roger` (mot de passe à voir dans `state/user-data`) et a les droits sudo.

Pour ce connecter en ssh il faut utiliser la clé `/root/.ssh/vm`:

```
ssh roger@${vm_name} -i ~/.ssh/vm
```

Une entrée A et AAAA est rajoutée dans le DNS local pour chaque VM dans la zone vm.ppsfleet.navy, qui est défini en tant que domaine de recherche sur alshain et pour les VMs.

L'IPv6 est routé publiquement ainsi on peut se connecter au VMs directement.


## Préparation d'une image

### Activer le client DHCPv6

Certaines distribution utilise seulement une configuration IPv6 stateless (ex. slaac) et il faut activer manuellement le dhcp.

1. Monter l'image en lecture/écriture
```sh
guestmount -a /var/lib/libvirt/images/bases/centos-stream8.img -i -o rw /mnt
```
2. Créer le fichier `/mnt/etc/cloud/cloud.cfg.d/10_network.cfg` avec le contenu suivant (**adapter le nom de l'interface par défault en fonction de l'os**, eth0 pour Centos, enp1s0 pour Debian):

```yaml
network:
  version: 2
  ethernets:
    eth0:
      dhcp4: true
      dhcp6: true
```
3. Démonter l'image `umount /mnt`

4. Sous Debian il faudra aussi modifier la configuration dhcp, dans le fichier `/mnt/etc/dhcp/dhclient.conf`, remplacer la ligne `send host-name = gethostname();` par `send fqdn.fqdn = gethostname();`