KVM : Partager un dossier et le presse-papier entre la machine hôte et l’invité

Quand on utilise des machines virtuelles (VM), il vient toujours un moment où l’on a besoin de partager des fichiers avec la machine hôte. C’est à peu près aussi indispensable que le copier/coller…

Je pensais que ce serait fait nativement avec KVM, mais ce n’est pas le cas, il y a un peu de configuration à faire.

Dans cet article, je me limite à une machine hôte/host Linux (mon PC sous Debian en fait) ; pour la machine invitée/guest (la VM donc) je traiterai les deux cas : Linux et Windows. En clair, je me limite à mon environnement ! 😉

Voir cet article pour l’installation de KVM sur le PC Linux. On y installe le gestionnaire de machines virtuelles virt-manager parmi les autres paquets nécessaires : c’est l’interface graphique pour gérer les VMs, et l’on va s’en servir ici.

Je me suis basé sur cette page pour écrire cet article (Host & Guest Linux), qui utilise les solutions natives intégrées à KVM (virtio-9p). Pour les Guest Windows), ça a été plus compliqué car il existe plusieurs solutions comme celle-ci qui essaient d’utiliser virtio sur Windows via webdav… Mais ça m’a eu l’air peu fiable et problématique, et j’ai préféré utiliser Samba sur l’hôte, beaucoup plus simple à mettre en œuvre.

Et tant que j’y suis, je termine avec le copier-coller, autre fonctionnalité bien pratique quand on utilise une VM.

On commence donc par le partage de dossier entre la machine hôte et la machine invitée.

Sur la machine hôte

Il faut simplement créer un dossier sur la machine hôte qui servira de dossier partagé avec les VMs. Par exemple :

$ mkdir ~/KVM_Share
$ chmod 777 ~/KVM_Share

Et c’est tout ! On a ainsi créé un dossier dans notre répertoire Home et autorisé les VMs à l’utiliser.

À noter que dans le premier tuto en référence, il est fait mention de commandes SELinux, mais cela ne s’applique qu’aux machines basées sur RPM, c’est-à-dire Red-Hat. Ce n’est donc pas nécessaire pour Debian (ni Ubuntu).

Sur la machine invitée

À partir du gestionnaire de machines virtuelles, on sélectionne une VM (ici Debian 11), puis on choisit Ouvrir :

Puis on clique sur la petite icône « Ampoule » pour afficher le s détails de la VM, et l’on choisit en bas « Ajouter un matériel » :

On choisit alors « Système de fichiers » dans la partie gauche, puis on à droite, on choisit virtio-9p comme Pilote, on indique le chemin du dossier créé précédemment sur la machine hôte pour le « Chemin de la source » (/home/pascal/KVM_Share), et enfin on choisit un nom de dossier de notre choix, qui servir de point de montage à la VM une fois démarrée (ici /hostshare) :

Voilà, il ne reste plus qu’à démarrer la VM.

Sur la machine virtuelle Linux

De la même manière que pour la machine hôte, on va d’abord créer un répertoire qui servira de partage (le nom d’utilisateur dans la VM est pled) :

$ mkdir /home/pled/KVM_Share

Puis on va le monter sur le point de montage défini précédemment, avec les paramètres qu’il faut :

$ sudo mount -t 9p -o trans=virtio /hostshare ~/KVM_Share

Pour rendre le mount permanent, le mieux est de l’ajouter dans /etc/fstab avec les options suivantes :

/hostshare /home/pled/KVM_Share 9p trans=virtio,version=9p2000.L,rw,_netdev 0 0

Le paramètre _netdev permet de faire le mount une fois le réseau démarré.

Et voilà, on peut désormais partager des fichiers entre la machine hôte et la VM. À noter que Gnome affiche le dossier de partage avec une belle icône dédiée 😎 :

Les droits sur les fichiers

Il faudra tout de même gérer les droits des fichiers venant de la VM si l’on souhaite modifier ces fichiers.

J’ai créé deux fichiers dans le même répertoire partagé KVM_Share, un à partir de l’hôte (host-file.txt), l’autre à partir de la VM (guest-file.txt). Voilà ce que donnent les droits :

  • Vu de la VM : aucun problème, les deux fichiers appartiennent à l’utilisateur.
$ ls -l
total 4
-rw-r--r-- 1 pled pled 0 23 mai   11:50 guest-file.txt
-rw-r--r-- 1 pled pled 0 23 mai   11:51 host-file.txt
  • Vu de la machine hôte :
$ ls -l
total 4
-rw------- 1 libvirt-qemu libvirt-qemu 0 23 mai   11:50 guest-file.txt
-rw-r--r-- 1 pascal       pascal       0 23 mai   11:51 host-file.txt

On voit que le fichier venant de la VM appartient à l’utilisateur libvirt-qemu et au groupe du même nom. Il faudra donc se réapproprier les fichiers si l’on souhaite les modifier :

$ sudo chown pascal * ; sudo chgrp pascal *
$ ls -l
total 4
-rw------- 1 pascal pascal 5 23 mai   16:04 guest-file.txt
-rw-r--r-- 1 pascal pascal 0 23 mai   11:51 host-file.txt

Sur la machine virtuelle Windows

C’est bien dommage, mais il n’y a pas de solution directe avec une VM Windows. Plusieurs solutions restent possibles, mais aucune n’est vraiment idéale, car il va falloir installer des logiciels supplémentaires que ce soit côté hôte ou invité, et en général c’est ce que j’essaie d’éviter.

Voyons les possibilités, selon les usages, cela peut varier :

Sans rien installer :

  • Passer par de vos comptes mail proposant un accès webmail et envoyer les fichiers ainsi ! 😆 Ça peut paraître bête, mais si l’usage est ponctuel, c’est le plus simple et le plus rapide ! Et pour les gros fichiers, il reste des solutions comme WeTransfer ou mieux SwissTranfer.

Avec virt-manager

On trouve plusieurs possibilités incluant virt-manager dans la configuration d’un partage. Aucune n’est vraiment simple, vu que MS ne fournit rien en standard pour utiliser virtio.

  • Utiliser virt-manager avec spice-webdav (solution décrite ici): testé avec une VM Win7, le service spice-webdav proxy s’installait bien, mais le service n’a jamais démarré.
  • Utiliser virt-manager avec Cockpit (la solution est décrite ici). Cockpit est une interface web qui simplifie la gestion d’une machine Linux, et par laquelle on peut lancer les VM faites avec KVM. Mais ici aussi on utilise spice-webdav, donc solution non testée avec en plus Cockpit côté host.
  • Utiliser virt-manager avec virtiofs : non testé, ça m’a l’air compliqué. À priori, on ajoute un « Système de fichier » dans virt-manager, mais on choisit virtiofs comme pilote, puis on installe WinFsp en suivant ce tuto. Attention, cela ajoute un matériel, et il est bien possible que cela nécessite la réactivation de votre licence MS ! 👿

J’ai fait le premier test avec une VM Windows 7, j’aurais peut-être pu essayer avec une version plus récente pour vérifier… Mais bon, je ne m’étend pas sur ces solutions puisque qu’il y a plus simple :

La solution Samba

Finalement la solution la plus simple reste d’installer Samba sur la machine hôte, et accéder au dossier partagé depuis la VM Windows. Après tout Samba implémente le protocole SMB de MS, c’est souvent dans ce sens que cela fonctionne le mieux !

On installe d’abord le service :

$ sudo apt update
$ sudo apt install samba

Puis on définit le dossier partagé que l’on souhaite dans /etc/samba/smb.conf :

[KVM_Share]
	comment = KVM_Share
	path = /home/pascal/KVM_Share
	read only = No
        browsable = yes
        guest ok = true

Et on redémarre le service sans oublier d’ouvrir les ports du pare-feu :

$ sudo systemctl restart smbd
$ sudo ufw add samba

On démarre le VM Windows (Windows 8 ici), puis dans l’explorateur de fichiers, on choisit « Connecter un lecteur réseau » :

Puis on indique l’adresse IP de la machine hôte ainsi que le nom de partage définit avec Samba :

On coche « se reconnecter lors de la connexion » si on le souhaite

Et voilà, même pas besoin de s’identifier grâce au paramètre « guest ok » définit avec Samba. Désormais, à chaque démarrage, on aura notre dossier partagé de connecté :

Par contre, comme avec le guest Linux, il faudra faire attention aux permissions sur les fichiers :

le user nobody est propriétaire des fichiers

En cas de souci, accorder tous les droits à tout le monde à partir de la machine linux (c’est plus simple à faire de ce côté qu’avec Windows) :

$ sudo chmod 777 *

Paramétrage Samba

J’avais fait un article sur Samba il y a 2 ans, son contenu est toujours valable, et donne les bases d’une première installation, ainsi que les infos pour investiguer en cas de problème. Ici , j’ai simplifié au maximum, c’est à mon avis suffisant (et très pratique) pour un environnement privé, à moins d’être parano.

Le paramètre guest ok permet de ne pas avoir à entrer de mot de passe, c’est bien pratique, et ce sont les privilèges du compte guest qui seront appliqués (nobody sur debian) . Si l’on veut sécuriser l’accès avec un mot de passe, il faut bien sûr retirer ce paramètre guest ok, puis définir un mot de passe Samba pour le compte utilisateur souhaité (Samba n’utilise pas les mots de passe du système Linux) :

sudo smbpasswd -a pascal

Ce compte doit par contre exister sur le système, sinon il ne sera pas sauvegardé (erreur « Failed to add entry for user xxx »). Et bien sûr, il faudra s’identifier au moment de connecter le lecteur (au moins la première fois).

Pour creuser, la documentation de Samba peut être trouvée à partir de cette page. Et les paramètres du fichier smb.conf sur celle-ci.

Copier/Coller

Si le copier/coller ne fonctionne pas nativement (notamment pour les machines virtuelles Windows), il faut se tourner vers spice.

Sur la machine Hôte

Vérifier d’abord que la VM (dans virt-manager, afficher les détails) est bien configurée pour utiliser spice, ce qui doit être le cas par défaut avec virt-manager :

L’affichage doit être de type Spice
Et un canal Spice doit avoir été créé.

Dans la VM Linux

Il faut installer l’agent spice :

sudo apt install spice-vdagent

Et pour s’assurer que le service démarrera automatiquement :

sudo systemctl enable spice-vdagentd

Dans la VM Windows

Il faut installer les spice-guest-tools, que l’on peut trouver ici.

On installe le côté client dans la VM Windows

Une fois installés, le copier/coller fonctionne immédiatement, dans les deux sens.

Conclusion

Il faut reconnaître qu’avec une VM Windows, KVM s’avère plus compliqué que VirtualBox pour partager un dossier. Mais KVM est intégré au noyau linux (donc plus performant) et la meilleure option quand on utilise un poste Linux.

Et franchement, mon expérience du temps d’Ubuntu avec Virtualbox et ses « Guest additions » qu’il fallait réinstaller à chaque nouvelle version était une vraie plaie. Je n’ai pas non plus de bons souvenirs avec le copier/coller.

Pour la partage de dossier avec un invité Windows, la solution avec spice-webdav n’a pas fonctionné quand j’ai voulu la tester. J’étais avec Windows 7, j’aurais peut-être pu essayer avec une version plus récente ? De toutes façons, il me paraît plus simple d’installer Samba sur l’hôte en deux ou trois commandes que d’utiliser un logiciel non supporté par MS et susceptible de provoquer plus de problèmes que d’en résoudre.

Voilà, tout est désormais prêt pour utiliser les VMs et pouvoir partager avec la machine hôte aussi bien le presse-papier que des fichiers ! 😎

Une réflexion sur « KVM : Partager un dossier et le presse-papier entre la machine hôte et l’invité »

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.