Partage de fichiers avec la VM

Partage de fichiers entre machine physique et virtuelle

Introduction

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.

sudo apt-get install spice-vdagent

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

xsel -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:

mkdir ~/sharevm ## un dossier de base pour les shares des VM
mkdir ~/sharevm/debian10 ## le dossier pour la VM nommee debian10
sudo chown -R libvirt-qemu:monGroupe ~/sharevm ## donner aussi des droits a "monGroupe" pour se faciliter la vie
sudo chmod -R 775 ~/sharevm ## donner les droits en R/W a qemu ET le groupe

## Pour tester
cp /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):

mkdir ~/vmshare
sudo mount -t 9p -o trans=virtio,version=9p2000.L /vmshare /home/vgobo/vmshare

# pour tester
ls vmshare/
#$ 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« :

sudo 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:

[Unit]
Description=Mounting KVM share to host
After=network-online.target

[Service]
Type=simple
RemainAfterExit=yes

ExecStart=/usr/local/bin/kvmShareMountd -d
ExecStop=/usr/local/bin/kvmShareUmountd -d
ExecReload=/usr/local/bin/kvmShareRestartd -d

Restart=on-failure

TimeoutStopSec=300

[Install]
WantedBy=multi-user.target

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

## kvmShareMountd
#!/bin/sh
mount -t 9p -o trans=virtio,version=9p2000.L /vmshare /home/vgobo/vmshare

## kvmShareUmountd
#!/bin/sh
umount /vmshare
## kvmShareRestartd
#!/bin/sh
/usr/local/bin/kvmShareUmountd 
/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:

sudo systemctl start sharekvm

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

#$ mount
tmpfs on /run/user/1000 type tmpfs (rw,nosuid,nodev,relatime,size=817020k,mode=700,uid=1000,gid=1000)
/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é:

sudo systemctl stop sharekvm

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

#$ mount
tmpfs 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:

sudo 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

Leave a Reply

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

*

code