Après avoir virtualisé ma machine de développement, j’ai décidé de la configurer selon mes besoins. Et bien sûr, le besoin de partage entre machines devient vite indispensable.

Support du copier / coller

Là c’est plutôt simple, il suffit d’installer le package spice-vdagent sur la machine virtuelle pour profiter du copier/coller.

    
1sudo apt-get install spice-vdagent

Bonus: pour copier un fichier texte dans le bloc-note, la commande xsel est fortement pratique. Exemple:

    
1xsel -ib < monfichier.txt

Partage de fichiers

Evidemment, copier une image ou un binaire est pénible avec la méthode précédente. Il va donc falloir trouver mieux. La solution de base consiste à mounter un share. C’est simple à faire, on contrôle les droits d’accès aux fichiers et le partage fonctionne dans les deux sens.

Sur la machine physique (ou hôte)

Pour réaliser le share, il faut préparer un dossier sur la machine physique:

    
1mkdir ~/sharevm ## un dossier de base pour les shares des VM
2mkdir ~/sharevm/debian10 ## le dossier pour la VM nommee debian10
3sudo chown -R libvirt-qemu:monGroupe ~/sharevm ## donner aussi des droits a "monGroupe" pour se faciliter la vie
4sudo chmod -R 775 ~/sharevm ## donner les droits en R/W a qemu ET le groupe
5
6## Pour tester
7cp /usr/share/images/desktop-base/fondEcran.jpg ~/sharevm/debian10/

Ensuite, il faut aller dans la VM et cliquer sur l’ampoule pour modifier les propriétés de la VM:

Modifier les propriétés de la VM

Modifier les propriétés de la VM

Dans la fenêtre qui apparaît, cliquer sur le bouton “Add hardware”

Modifier les propriétés de la VM: ajouter du matériel

Modifier les propriétés de la VM: ajouter du matériel

Ensuite, cliquer sur “filesystem”:

Modifier les propriétés de la VM: ajout du share

Modifier les propriétés de la VM: ajout du share

Configurer avec les informations suivantes:

  • Type: mount
  • Driver: default
  • Write policy: Immediate
  • source path: /home/gobo/sharevm/debian10
  • Target path: /vmshare
  • Ne pas cocher “Export filesystem as readonly mount (à moins de vouloir faire de la lecture uniquement)

A noter que si votre VM n’est pas arrêtée, il faudra choisir entre perdre vos modifications (cliquer sur “No”) ou les appliquer au prochain arrêt de la VM (cliquer sur “Yes”). Ici, j’ai choisi “Yes”.

Modifier les propriétés de la VM: uniquement si elle est stoppée

Modifier les propriétés de la VM: uniquement si elle est stoppée

Sur la machine virtuelle (ou invitée)

Ici, il va falloir ajouter un dossier et réaliser le mount (après restart de la VM sinon le mount va échouer):

    
1mkdir ~/vmshare
2sudo mount -t 9p -o trans=virtio,version=9p2000.L /vmshare /home/vgobo/vmshare
3
4# pour tester
5ls vmshare/
6#$ fondEcran.jpg

Youpi, ça fonctionne. Seul hic: lors du prochain démarrage de la VM, il faudra effectuer à nouveau le mount. On peut changer le comportement grâce à trois petits scripts. On trouve pas mal d’articles qui proposent de modifier le fichier rc.local et c’est incorrect. En effet Debian a déprécié le rc.local depuis la v8. Maintenant il faut passer par SystemD pour réaliser notre opération. On commence par ajouter un service nommé “sharekvm”:

    
1sudo nano /etc/systemd/system/sharekvm.service

Dans ce fichier, on définit comment démarrer et arrêter notre service à l’aide du code suivant:

    
 1[Unit]
 2Description=Mounting KVM share to host
 3After=network-online.target
 4
 5[Service]
 6Type=simple
 7RemainAfterExit=yes
 8
 9ExecStart=/usr/local/bin/kvmShareMountd -d
10ExecStop=/usr/local/bin/kvmShareUmountd -d
11ExecReload=/usr/local/bin/kvmShareRestartd -d
12
13Restart=on-failure
14
15TimeoutStopSec=300
16
17[Install]
18WantedBy=multi-user.target

Ensuite, on créé les trois scripts dans /usr/local/bin: kvmShareMountd, kvmShareUmountd et kvmShareRestartd.

    
1## kvmShareMountd
2#!/bin/sh
3mount -t 9p -o trans=virtio,version=9p2000.L /vmshare /home/vgobo/vmshare
    
1## kvmShareUmountd
2#!/bin/sh
3umount /vmshare
    
1## kvmShareRestartd
2#!/bin/sh
3/usr/local/bin/kvmShareUmountd 
4/usr/local/bin/kvmShareMountd

Reste maintenant à vérifier que le service fonctionne, en lui demandant de démarrer grâce à la commande “systemctl”, comme ceci:

    
1sudo systemctl start sharekvm

On vérifie que le share est présent grâce à la commande “mount”:

    
1#$ mount
2tmpfs on /run/user/1000 type tmpfs (rw,nosuid,nodev,relatime,size=817020k,mode=700,uid=1000,gid=1000)
3/vmshare on /home/vgobo/vmshare type 9p (rw,relatime,sync,dirsync,access=client,trans=virtio)

Maintent on arrête le service pour vérifier que le umount est bien réalisé:

    
1sudo systemctl stop sharekvm

On vérifie que le share est absent grâce à la commande “mount”:

    
1#$ mount
2tmpfs on /run/user/1000 type tmpfs (rw,nosuid,nodev,relatime,size=817020k,mode=700,uid=1000,gid=1000)

Dernière étape: activer le service au démarrage de la VM. Pour cela, il suffit de passer la commande:

    
1sudo systemctl enable sharekvm

Pour finir on reboote la VM et normalement le share est actif.

Conclusion

Les outils standards sont suffisants pour faciliter le partage d’informations entre machine hôte et machine virtuelle. La configuration est facile d’accès.

(petit conseil: conservez dans un coin les fichiers de service afin de pouvoir facilement équiper vos prochaines VM)

Tous les articles sur la virtualisation