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 essaie 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
avecspice-webdav
(solution décrite ici): testé avec une VM Win7, le servicespice-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 utilisespice-webdav
, donc solution non testée avec en plus Cockpit côté host. - Utiliser
virt-manager
avecvirtiofs
: non testé, ça m’a l’air compliqué. À priori, on ajoute un « Système de fichier » dans virt-manager, mais on choisitvirtiofs
comme pilote, puis on installeWinFsp
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 :
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 :
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 :
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.
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 ! 😎
Salut
vive Proxmox outil à la mode .
Génial !
Facile, et efficace ! Même pour les gros fichiers.
Merci
Maurice
Bonjour
Merci beaucoup pour le tuto, cela m’a beaucoup aidé.
limax