9p, l'autre pays du partage

partage-p9.png

Ou comment stocker sur la machine hôte les fichiers d'une application web installée sur un serveur LAMP, lui-même installé dans une machine virtuelle, en utilisant les outils Virtual machine manager et Debian.

 

La mission :

Transférer mon serveur web local installé physiquement sur mon pc dans une machine virtuelle et y migrer l'ERP-CRM Dolibarr, avec lequel je gère une partie de mon activité professionnelle, tout en gardant les fichiers de Dolibarr dans un dossier de mon /home/utilisateur sur la machine hôte. Ceci afin que je puisse accéder aux fichiers de Dolibarr directement depuis l'hôte, pour les consulter mais aussi pour les sauvegarder en même temps que toutes mes autres données importantes lors de ma routine de sauvegarde.

Les copies de mes sites "en production" y seront également transférées. Ces copies me servent à tester les mises à jours (vérifier que ça ne casse rien) et modifier tranquillement les thèmes lorsque je souhaite changer l'apparence de quelque chose. J'ai donc également besoin de pouvoir modifier facilement certains fichiers depuis l'hôte.

 

La solution :

Utiliser le partage de dossier 9p filesystem passthrough.
À lire : l'article qui m'a fait découvrir le partage 9p et la doc de Kvm qui vous permettra de comprendre les commandes utilisées plus loin.

 

Les avantages de cette méthode :

  • Le serveur ne se trouve pas sur la machine physique, on le démarre uniquement lorsqu'on en a besoin.
  • Les fichiers qui composent les sites et ou applications web sont stockés physiquement sur la machine hôte et non pas dans le fichier image de la machine virtuelle. Cela signifie que l'on peut y accéder directement depuis l'hôte pour les consulter, les modifier et les sauvegarder sur un autre support.

Un autre avantage est de pouvoir utiliser pour le serveur une distribution différente de celle qu'on utilise sur le pc hôte. Dans mon cas cela me permet d'avoir un serveur en version Stable de Debian alors que la machine hôte utilise la branche Testing.

 

Préambule :

  • Les explications ne concernent que la mise en place du partage 9p entre l'hôte et son invité, en utilisant l'interface graphique Virt-manager. Je n'explique pas comment installer Debian, un serveur Lamp ou créer une machine virtuelle, ce n'est pas le sujet du tuto.
  • Mes 2 machines, hôte et invité, sont librement propulsées par Debian (Buster côté hôte et Stretch côté invité). Si vous utilisez d'autres distributions, peut-être faudra-t-il adapter un peu.
  • Mon utilisateur est ajouté au groupe libvirt afin de pouvoir ouvrir Virt-manager en tant que simple utilisateur plutôt que root.

 

Note :

Pour afficher l'interface utilisateur de Dolibarr ou toutes autres pages web générées par le serveur de la machine virtuelle dans le navigateur de l'hôte, il est inutile de faire un pont réseau ou autres choses compliquées : le réseau Nat par défaut de Virt-manager suffit amplement. Chercher l'ip attribuée à la machine virtuelle en tapant la commande ip a dans le terminal de celle-ci ; taper cette ip dans le navigateur de l'hôte, ça juste marche.

 

Astuce :

Avant d'installer mes sites sur le serveur virtuel, j'édite le fichier /etc/hosts de l'hôte pour y ajouter la ligne suivante :

192.168.124.252 plop

192.168.124.252 corresponds à l'ip de la machine virtuelle, plop (ou autre mot de votre choix) correspond à son alias.
L'alias sert ici à remplacer l'ip de la vm, ainsi au lieu d'écrire 192.168.124.252/dolibarr dans la barre d'adresse du navigateur, j'écris plop/dolibarr. C'est quand même plus simple.

 

Mettre le partage 9p en place :

Sur l'hôte :

Créer un dossier pour acceuillir les contenus, par exemple :

mkdir /home/toto/oueb

Toto étant à remplacer par votre nom utilisateur et oueb par n'importe quoi qui vous plaira. Il est également possible de placer le dossier partagé ailleurs que dans /home/utilisateur, en fonction des besoins.

Dans le fichier /etc/libvirt/qemu.conf, chercher les lignes suivantes :

#user = “root”
#group = “root”

Et remplacer par :

user = “toto”
group = “toto”

Toto est là encore à remplacer par le nom de l'utilisateur de la machine hôte. Ne pas oublier de dé-commenter les deux lignes en supprimant le #.

Redémarrer le service libvirtd pour que ces modifications soient prises en compte:

# systemctl restart libvirtd

Cette manœuvre est essentielle. Cela va permettre à la machine virtuelle d'écrire dans le dossier partagé avec l'identité de notre utilisateur plutôt qu'avec l'identité Libvirt Qemu paramétrée par défaut. Ainsi notre utilisateur aura accès aux fichiers créés par le serveur situé sur la VM et pourra les modifier sans souci.

 

Sur l'invité :

La machine virtuelle doit être à l'arrêt pour ajouter le dossier partagé.

Afficher les détails de la VM et cliquer sur ajouter un nouveau matériel -> système de fichiers.

Capture-virt-manager-filesystem-passthrough.jpg
Comme sur la capture d'écran ci-dessus, choisir les paramètres suivants :
Pilote = default,
Mode = Mapped
Chemin source : il s'agit du dossier crée précédemment sur l'hôte /home/toto/oueb
Chemin cible : un nom au choix, par exemple : pouet

Redémarrer l'invité.
Monter le dossier partagé sur l'invité avec la commande suivante :

# mount -t 9p -o trans=virtio,version=9p2000.L,rw pouet /var/www/html/

Où /var/www/html correspond au chemin du dossier de la machine virtuelle que l'on veut rediriger vers le dossier /home/utilisateur/site de l'hôte. Sur Debian, c'est dans /var/www/html que les différents sites sont installés par défaut. Ce chemin sera peut-être à adapter chez vous pour correspondre à des réglages différents ou à l'usage d'autres distributions que Debian.

 

Il reste à attribuer le bon propriétaire à tout ce qui se trouve dans /var/www/html/ :

# chown -R www-data:www-data /var/www/html

www-data, l'utilisateur légitime du serveur, n'y verra que du feu. Il pensera que c'est lui qui écrit dans son dossier, même si ce dossier est en vérité ailleurs et appartient à quelqu'un d'autre.

 

Astuce bis :

Avec une commande de montage pareille, il vaut mieux se simplifier la vie en créant un alias bash.

Ici l'alias servira à remplacer ma-super-longue-ligne-de-commande par un truc plus court, zou par exemple. Ce qui pourrait donner un alias de ce genre : alias zou="su -c 'mount -t 9p -o trans=virtio,version=9p2000.L,rw pouet /var/www/html/". Par la suite il suffira de taper zou pour monter le dossier partagé.
Voir cette documentation : comment créer un alias bash.

 

Installer les sites, exemple concret.

On procède de façon habituelle, comme sur un serveur lambda, sauf que l'on va placer les fichiers de chaque site dans le dossier partagé situé sur l'hôte.

Dans  /home/toto/oueb/ on trouvera autant de dossiers que de sites, par exemple : dolibarr, dotclear, autrecms, etc ... avec leurs contenus respectifs.

Chez moi j'installe entre autre l'ERP & CRM Dolibarr (ne fais pas le café, du moins pas encore) et le cms Dotclear (ne fait que des blogs mais le fait bien).

Sur l'hôte j'ouvre mon navigateur préféré (Firefox) et je tape l'alias de l'ip de la machine virtuelle dans la barre url (ou l'ip si vous n'avez pas fait d'alias) suivi de /dolibarr.
S'affiche alors l'arborescence de Dolibarr, un clic sur htdocs et c'est parti pour l'installation. Pour installer Dotclear : plop/dotclear dans la barre url du navigateur et il n'y a plus qu'à suivre les instructions.

 

Le cas des bases de données :

Dans ma configuration, j'ai choisi de laisser les bases de données stockées dans la machine virtuelle.
Dolibarr permet d'exporter en un clic une sauvegarde de sa base de données directement depuis le back office (à condition que l'utilisateur ait les droits d'administration) et de l'enregistrer automatiquement dans le dossier /dolibarr/documents/admin/backups. L'export sera donc en sécurité avec tout le reste des données, sur l'hôte.

Pour les autres bases de données, lesquelles ne nécessitent pas un export fréquent, j'utilise PhpMyAdmin. Une fois installé sur le serveur, plop/phpmyadmin me permet d'accéder à son interface web et de télécharger un export des bases (avant un test de mise à jour par exemple).

Il est sans doute possible d'appliquer le partage 9p aux bases de données, peut-être en créant un second dossier partagé, n'en ayant pas l'utilité je n'ai pas essayé.

 

Conclusion :

Cela fait maintenant plusieurs mois que j'ai mis ce système en place et ça fonctionne impeccablement.

Encore mieux : alors que j'avais fait une méga boulette de la mort qui tue et cassé Apt sans réussir à le réparer, j'ai dû me résigner à réinstaller le système hôte.
Fort heureusement, utilisant la branche Testing de Debian, j'avais pris la précaution de placer mon /home sur une partition séparée, ce qui m'a permis de réinstaller l'os avec le /home existant. L'image de ma machine virtuelle étant bien sûr elle aussi stockée dans /home.
J'ai donc pu récupérer en quelques clics le partage 9p en le recréant sur la machine virtuelle, recréée elle aussi en un clic via Virt-manager en indiquant simplement le chemin de l'image .qcow2 + réécrire les modifications dans le fichier qemu.conf. Même pas 5 minutes pour tout remettre en place, le top !

Poupées de bois

Poupee-en-bois.jpg

J'ai utilisé des lames à parquet pour fabriquer des rayonnages et des blocs de rangement façon cube. À un moment j'ai posé une découpe d'un bout de planche debout sur l'établi et ... mon infernale imagination s'est mise en route. J'ai trouvé que la petite encoche du bas ressemblait à des jambes  […]

Lire la suite

C comme crane

crane.jpg

Suite de mon abécédaire, aujourd'hui le C, comme Crane. Pour cette troisième lettre de l'abécédaire, j'ai repris un de mes dessins réalisé avec crayon et papier datant de 2007 histoire de voir ce que ça donnerait en l'utilisant comme base à décalquer dans le logiciel Krita. Expérimentation  […]

Lire la suite

Firefox reprend du poil de la bête

sous-tasse-firefox-feutrine.jpg

Ci-dessus mon nouveau dessous de tasse à l'effigie de Firefox. Sa fabrication est expliquée en fin de bafouille. Je ne sais plus quand j'ai adopté le navigateur Firefox, probablement quelques mois après l'acquisition de mon premier ordinateur, un portable vendu avec Windows Vista pré-installé  […]

Lire la suite

Bon anniversaire Dotclear, et plutôt deux fois qu'une

14-ans-dotclear.png

Aujourd'hui Dotclear fête ses 14 ans. Il y a un an tout pile je finalisais le remplacement de mon ancien gestionnaire de contenu (Wordpress) par Dotclear. Je fête donc également mes 1 an de blogage avec ce moteur de blog. Je ne regrette pas une seule seconde des heures que j'ai passées à faire la  […]

Lire la suite