Machines virtuelles QEMU/KVM - Dossiers partagés
2.1.1.2 VM supportant sshfs ou sftp
2.2.1 Test depuis l'hyperviseur
2.3 Accès depuis la machine virtuelle
Dossier partagé dans KVM (Synthèse)
Le but de ce tutoriel est de monter un dossier partagé entre un hyperviseur et une machine virtuelle déployée grâce à KVM.
Deux possibilités sont documentés ici :
1.Sans modification sur l'hyperviseur et installation d'un programme sur la machine virtuelle si c'est un OS Windows.
2.Avec installation d'un serveur samba sur l'hyperviseur et sans modification sur la machine virtuelle si c'est un OS Windows.
VM sera un raccourci pour machine virtuelle.
Fedora sera l'hyperviseur.
On récupère l'IP de Fedora vue par la VM :
$ ip a show virbr0
virbr0 est le pont réseau virtuel linux créé par libvirt. Il est par défaut configuré en 192.168.122.1 en utilisant dnsmask (voir fichier /etc/libvirt/qemu/networks/default.xml).
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
link/ether 52:54:00:9b:3b:8f brd ff:ff:ff:ff:ff:ff
inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
valid_lft forever preferred_lft forever
Il faut s'assurer que le service sshd est actif :
$ systemctl status sshd.service | grep 'active'
Active: active (running) since Tue 2020-09-08 21:50:27 EEST; 4 days ago
S'il est inactif, le retour sera :
Active: inactive (dead)
Il faudra donc le démarrer, et l'activer afin de le rendre permanent :
# systemctl start sshd.service
# systemctl enable sshd.service
On utilisera le client cifs/smb pour la joindre, cela suppose qu'il y a au moins un dossier partagé sur la VM.
La plupart des navigateurs de fichiers de Fedora supporte le protocole, on peut donc faire un raccourci avec une commande du genre :
smb://utilisateur@adresse_ip_VM/dossier_partagé/.
On préférera ces protocoles car plus sécurisés.
sftp étant un accès ftp au travers de ssh.
sshfs permettant de monter le dossier distant dans l'architecture locale.
Windows n'utilisant pas de façon native les protocoles ssh, on installera winscp qui est la version Windows de sftp. Son utilisation ne pose pas de problème.
Il existe aussi sshfs-win qui demande un peu plus de compétences.
Pour avoir accès à tous les fichiers de l'utilisateur, on fera un montage sshfs pour avoir un montage sur local ou alors sftp dans un navigateur de fichiers sous la forme :
sftp://utilisateur@192.168.122.1:/home/utilisateur
Elle a été testée avec un hyperviseur sous Fedora 25 et une machine virtuelle Windows 10 sur QEMU/KVM avec une connexion NAT. Dans la mesure où la méthode utilisée est du samba classique sur un réseau tout aussi classique, ce tutoriel peut être appliqué plus largement, avec d'autres solutions de virtualisation et même pour d'autres cas de figure.
La première chose à faire est de s'assurer que le service samba tourne.
# systemctl enable smb.service nmb.service
# systemctl start smb.service nmb.service
Nous créons le dossier partagé avec les droits adéquats. Il est recommandé de ne pas mettre cet emplacement dans /home. Ce dossier est possédé par l'utilisateur nommé partage, que nous créons par la même occasion. Enfin, nous ajoutons l'utilisateur partage à samba. Il convient enfin d'ajouter l'utilisateur qui fera tourner l'hyperviseur au groupe partage, afin qu'il puisse lire et écrire dans le dossier partagé.
# mkdir /VShare
# useradd -m -d /VShare partage
# chown -R partage /VShare
# chmod g+w /VShare
# smbpasswd -a partage
Nous modifions le fichier /etc/samba/smb.conf. Seule la machine virtuelle et l'utilisateur partage auront accès au dossier partagé pour des questions de sécurité.
# vim /etc/samba/smb.conf
[global]
workgroup = WorkGroup
netbios name = Host
server string = serveur %h (Samba %v, Fedora)
# On souhaite n'autoriser l'accès que via certaines interfaces réseau
bind interfaces only = Yes
interfaces = 127.0.0.1, 192.168.122.1
log file = /var/log/samba/log.%m
max log size = 100
[VShare]
path = /VShare/
public = no
browsable = yes
valid users = partage
guest ok = no
writable = yes
printable = no
hide files = /lost+found/
hide unreadable = yes
# on force les permissions
create mask = 666
force create mode = 666
security mask = 666
force security mode = 666
La validité du fichier de configuration peut être testé grâce à la commande testparm.
Il est ensuite nécessaire de redémarrer le service samba. On en profite aussi pour ouvrir les ports liés à samba.
# systemctl restart nmb.service smb.service
# firewall-cmd --add-service=samba
On rendra l'ouverture des ports de samba de façon permanente avec la commande :
# firewall-cmd --add-service=samba --permanent
Pour vérifier que les ports sont bien ouverts, on peut lancer la commande iptables -L -n -v, les ports samba (137/tcp, 138/tcp, 139/tcp et 445/tcp) devraient être listés dans le Chain IN_public_allow.
Il faut enfin rajouter "samba" et "samba-client" en "permanent" dans la zone définie par firewalld.
Depuis l'hyperviseur, on lance :
$ smbclient //192.168.122.1/Vshare -U partage
Enter partage's password:
Domain=[WORKGROUP] OS=[Windows 6.1] Server=[Samba 4.5.2]
smb: \>
Si SELinux est actif, il faut lancer les commandes suivantes afin d'éviter les blocages et alertes SELinux :
# semanage fcontext -a -t samba_share_t '/VShare(/.*)?'
# restorecon -R /VShare
Si le dossier partagé n'est pas à la racine mais dans le /home, pensez à rajouter :
# setsebool -P samba_enable_home_dirs on
Pour vérifier, on doit trouver un contexte samba_share_t :
# ls -Z VShare/
-rw-rw-r--. partage partage unconfined_u:object_r:samba_share_t:s0 truc.txt
L'emplacement partagé est accessible via \\HOST\VShare.
Création d’un partage entre un hyperviseur KVM et une de ses machines virtuelles
Activation de samba
systemctl enable smb nmb
systemctl start smb nmb
Virbr0 est le bridge linux créé par libvirt lors de son installation, il faut l'identifier
ip a show dev virbr0
SI on veut modifier l'adresse de virbr0
virsh net-edit default
On crée le partage et le compte utilisateur pour s'y connecter
mkdir /partage_vm
useradd -m -d /partage_vm partage
chown -R partage /partage_vm
chmod g+w /partage_vm
smbpasswd -a partage
On declare le partage dans le ficher /etc/samba/smb.conf
[global]
workgroup = WorkGroup
netbios name = Host
server string = serveur %h (Samba %partagevm)
# On souhaite n'autoriser l'accès que via certaines interfaces réseau
bind interfaces only = Yes
interfaces = 127.0.0.1, 192.168.122.1
log file = /var/log/samba/log.%m
max log size = 100
[partage_vm]
path = /partage_vm/
public = no
browsable = yes
valid users = partage
guest ok = no
writable = yes
printable = no
hide files = /lost+found/
hide unreadable = yes
# on force les permissions
create mask = 777
force create mode = 777
security mask = 777
force security mode = 777
On redemarre samba et on ouvre les ports samba
systemctl restart nmb.service smb.service
firewall-cmd --add-service=samba --permanent --add-source=192.168.122.1/24
Test du serveur depuis l'hyperviseur
smbclient //192.168.122.1/partage_vm -U partage
Si SELinux est actif dans un dossier specifique
semanage fcontext -a -t samba_share_t '/partage_vm(/.*)?'
restorecon -R /partage_vm
Si SELinux est dans /home
setsebool -P samba_enable_home_dirs on
Pour vérifier le contexte de SELinux
ls -Z /partage_vm
-rw-rw-r--. partage partage unconfined_u:object_r:samba_share_t:s0 truc.txt
Sur la VM, le dossier est accessible à l’adresse \\ip_de_virbr0\partage_vm