Samba a été conçu pour permettre le partage de fichiers entre Windows et Linux.
Mais l’architecture client-serveur n’est pas à usage exclusif de ce mariage mixte. Récemment on m’a demandé s’il était possible de partager un dossier avec Samba entre 2 Raspberry Pi. J’ai répondu oui, mais pour Estelle ça ne semblait pas aussi évident que ça… Je me suis dit que ce partage inter-RasPi pouvait intéresser d’autres RasPiNautes. J’ai branché un Raspberry Pi supplémentaire, mis dedans une carte microSD avec un Raspbian Jessie tout frais, et je vous propose de partager… ce partage
Partage Samba sous Jessie entre deux Raspberry Pi
Halte aux polémiques
Pour couper court à toutes les polémiques, recommandations et autres remarques, je vous rassure, je suis au courant qu’il existe d’autres moyens. J’utilise d’ailleurs NFS au boulot (ah !). En général ça m’agace sur les forums quand quelqu’un pose une question pour réaliser quelque chose avec, disons, une application xyz. En général les réponses au lieu de l’aider vont dans le sens inverse :
- « pourquoi tu fais ça avec xyz ? abcd est beaucoup mieux ! »
- « oula xyz est trop lent, prends plutôt azerty ! »
- « quoi ça existe encore xyz, je croyais que c’était plus maintenu, tu devrais pas utiliser ça! »
- « uiop est beaucoup plus simple à utiliser que xyz, pourquoi tu as choisi cette daube ? »
- etc. etc.
En général ces « encouragements » (qui partent parfois d’un bon sentiment) sont de plus ponctués d’autant de fôtes d’ortograffes qu’il y a de mots dans la phrase. Dites moi si je me trompe ! Mais en tout cas ça ne répond pas à la question de la personne sur l’utilisation de xyz.
Voilà j’ai encore fait mon papy ronchon, mais que voulez-vous, il y a des choses qui m’agacent !
Ici la question qui était posée était : « Peut-on partager un répertoire entre 2 Raspberry Pi avec Samba ? »
L’architecture Client-Serveur
A ma droite le serveur (oui, celui qui a le nœud pap). C’est lui qui propose un service. Ici il vient d’amener un verre (c’est une menthe à l’eau – si, si) au client (celui qui a les lunettes de soleil)…
Si on résume : Le serveur propose un service et le client utilise ce service.
Ici nous avons deux Raspberry Pi identiques. Sur l’un nous allons installer le serveur Samba. Ce sera le serveur. Il sera chargé d’offrir un service.
L’autre Raspberry Pi va utiliser le service proposé. Ce sera ici notre client.
Faites entrer les participants
Pour monter cette architecture j’ai utilisé un Raspberry Pi installé sur (enfin, derrière) l’écran 7 pouces officiel (vous le reconnaîtrez à son nom : raspi-7p-officiel) et ajouté au réseau un RasPi qui avait servi il y a quelques jour aux tests de la caméra 8 Mpx. Il est d’ailleurs toujours monté sur le « banc test ».
Sur l’image ci-dessus le Raspberry Pi de gauche (raspi-7p-officiel) est le serveur Samba. Son adresse IP est 192.168.1.230. Le client sera monté sur le Raspberry Pi de droite (son nom est plus classique : raspberrypi). L’adresse du client est 192.168.1.106.
Les appellations raspi1 et raspi2 n’ont rien à voir avec le modèle du Raspberry Pi, ce ne sont que des identifiants pour les repérer dans la suite de l’article.
Remarque : Pour les « encore plus ronchon que moi » (il y en a ?) ne vous étonnez pas de trouver un RasPi avec une adresse en 230 et l’autre en 106. Déjà comme on a un masque à 255.255.255.0 (/24) ils sont dans le même réseau. Les Raspberry Pi « fixes » comme celui qui est monté sur l’écran officiel ont un privilège : j’ai programmé le routeur TP-LINK (non, je n’ai pas de Box) pour que le DHCP attribue toujours la même adresse à ces Raspberry Pi (en fonction de leur adresse MAC) et la plage commence à .230. L’autre est relié en Wifi par une clé USB et il a pris normalement une adresse automatique car son adresse MAC n’est pas connue du routeur. Un Raspberry Pi fixe prend toujours la même adresse quand je le connecte au réseau…
Le cahier des charges
Sur le premier Raspberry Pi
- Créer un répertoire /home/pi/partage_samba.
- Mettre un « flag » dans le répertoire (un fichier qui servira à vérifier qu’on a bien accès au répertoire à distance)
- Installer le serveur Samba sur ce Raspberry Pi.
- Configurer le serveur Samba pour qu’il partage le répertoire partage_samba
sous le nom de partage commun.
Sur le deuxième Raspberry Pi
- Tester le bon fonctionnement du serveur Samba avec un client Samba en vérifiant qu’on peut voir le fichier « flag », créer un dossier…
SI ça fonctionne (si ça ne fonctionne pas, inutile de continuer…)
- Créer un dossier /home/pi/lien_raspi1
- Modifier fstab pour que le partage commun soit automatiquement
monté dans /home/pi/lien_raspi1
Remarque : Dans la logique avant de se lancer dans le montage automatique via fstab , il faudrait déjà vérifier que le partage se monte manuellement avec la commande mount… Je vous laisse chercher un peu comment faire…
On s’y jette ?
Créer le répertoire de partage et mettre un flag
On va commencer par créer le répertoire qui sera partagé :
mkdir /home/pi/partage_samba
Mettez un flag dans ce répertoire pour pouvoir l’identifier à coup sur :
touch /home/pi/partage_samba/raspi1
Installer le serveur Samba
On peut maintenant installer le serveur sur le premier Raspberry Pi. Pensez avant tout à faire
sudo apt-get update sudo apt-get upgrade
pour avoir un système à jour puis installez Samba sur le serveur.
apt-get install samba samba-common-bin
Configurer le partage dans le fichier de configuration
Par sécurité, faites une copie de sauvegarde du fichier de configuration par défaut de Samba (on ne sait jamais..) avant de farfouiller dedans :
sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.org
Bon, c’est mon habitude de garder les fichiers originaux avec une extension .org mais rien ne vous empêche de les appeler .old, .back ou… tout ce que vous voulez
Ouvrez le fichier smb.conf
sudo nano /etc/samba/smb.conf
Juste parce que je n’aime pas ce nom (qui me rappelle le boulot work…) je modifie WORKGROUP en MAISON (vous faites comme vous voulez).
Ajouter à la fin du fichier /etc/samba/smb.conf
[commun] comment = Partage Samba inter RasPi path = /home/pi/partage_samba writable=yes valid users = pi write list = pi create mode = 0777 directory mode = 0777 share modes = yes
A noter que le partage s’appelle commun. C’est sous ce nom qu’il apparaîtra sur les autres machines. Je ne rentre pas dans le détail de la config, je vous laisse chercher un peu… Si vous avez envie.
Redémarrer le service samba pour que les modifications apportées au fichier smb.conf soient prises en compte.
sudo service smbd restart
Si tout se passe bien (Raspbian ne renvoie pas de message d’insulte) vous pouvez continuer. Sinon…. cherchez l’erreur ! Pas la peine d’aller plus loin si le serveur ne démarre pas.
Passez le dossier partage_samba en 776
chmod 776 /home/pi/partage_samba
Créez un utilisateur Samba sur ce Raspberry Pi. Je n’ai pas été original, j’ai créé pi avec le login raspberry. Vous ferez certainement mieux
pi@raspi-7p-officiel:~ $ sudo smbpasswd -a pi New SMB password: Retype new SMB password:
Redémarrez samba pour prendre les modifications en compte.
sudo service smbd restart
Il ne faut pas oublier que les droits du système l’emportent sur les droits Samba. Si l’utilisateur Samba a le droit d’écrire (dans Samba) mais que les droits système l’interdisent… il ne pourra pas écrire.
Le premier Raspberry Pi est prêt, on va passer au deuxième.
Configurer l’accès au partage depuis le Raspberry Pi distant
Ça fait déjà un bon moment que le client attend… Je vous propose qu’on s’occupe de lui maintenant.
Installer le client Samba sur le deuxième Raspberry Pi
Pour que le serveur… serve à quelque chose, comme dans la vraie vie, il lui faut un client. Pour Samba, le client de base s’appelle smbclient (vous voyez qu’il n’y a pas que moi pour ne pas se fouler quand il faut trouver un nom ). On va donc commencer par installer ce client sur le RasPi 2.
pi@raspberrypi:~ $ sudo apt-get install smbclient Lecture des listes de paquets... Fait Construction de l'arbre des dépendances Lecture des informations d'état... Fait Paquets suggérés : heimdal-clients Les NOUVEAUX paquets suivants seront installés : smbclient 0 mis à jour, 1 nouvellement installés, 0 à enlever et 3 non mis à jour. Il est nécessaire de prendre 304 ko dans les archives. Après cette opération, 753 ko d'espace disque supplémentaires seront utilisés. Réception de : 1 http://mirrordirector.raspbian.org/raspbian/ jessie/main smbclient armhf 2:4.2.10+dfsg-0+deb8u2 [304 kB] 304 ko réceptionnés en 6s (49,0 ko/s) Sélection du paquet smbclient précédemment désélectionné. (Lecture de la base de données... 127021 fichiers et répertoires déjà installés.) Préparation du dépaquetage de .../smbclient_2%3a4.2.10+dfsg-0+deb8u2_armhf.deb ... Dépaquetage de smbclient (2:4.2.10+dfsg-0+deb8u2) ... Traitement des actions différées (« triggers ») pour man-db (2.7.0.2-5) ... Paramétrage de smbclient (2:4.2.10+dfsg-0+deb8u2) ...
Connexion au partage avec smbclient
Le partage qui existe sur le RasPi 1 s’appelle commun : on va exécuter smbclient en lui indiquant l’adresse du raspberry Pi serveur Samba ainsi que le nom du partage :
pi@raspberrypi:/etc/samba $ smbclient //192.168.1.230/commun
comme vous vous connectez avec le nom de pi (tiens c’est le même que celui de l’utilisateur Samba que j’ai créé tout à l’heure le serveur Samba ne vous demande que le mot de passe de cet utilisateur pour autoriser la connexion (tapez raspberry)
Enter pi's password: Domain=[MAISON] OS=[Windows 6.1] Server=[Samba 4.2.10-Debian] smb: \>
On voit que le domaine est bien MAISON (c’est mieux que WORKGROUP, non ?). Le prompt
smb : \>
vous indique que la connexion a été autorisée. Vous allez pouvoir entrer des commandes.
smb: \> ls . D 0 Wed May 11 19:26:55 2016 .. D 0 Wed May 11 19:22:55 2016 raspi1 N 0 Wed May 11 19:26:55 2016 15273212 blocks of size 1024. 10503608 blocks available
Le ls nous prouve que nous sommes bien connectés au RasPi 1 puisqu’on retrouve notre fichier « flag » appelé raspi1. Pour tester si on a le droit d’écrire, nous allons ajouter un dossier toto (oui, je sais… mais c’est une habitude).
smb: \> mkdir toto smb: \> ls . D 0 Wed May 11 19:52:05 2016 .. D 0 Wed May 11 19:22:55 2016 raspi1 N 0 Wed May 11 19:26:55 2016 toto D 0 Wed May 11 19:52:05 2016 15273212 blocks of size 1024. 10503604 blocks available smb: \> cd toto smb: \toto\>
Tout va bien, le partage est opérationnel et on peut travailler dedans depuis le deuxième Raspberry Pi. Sortez du client Samba :
smb: \> exit pi@raspberrypi:~/ $
Montage automatique d’un partage Samba
Pour monter le répertoire partagé « à la mano » la commande (que vous pouvez tester ) serait :
sudo mount -t cifs -o username=pi,password=raspberry //192.168.1.230/commun /home/pi/lien_raspi1
L’inconvénient de cette méthode c’est que lors du redémarrage du RasPi2, le montage est perdu car il est simplement stocké en mémoire.
Nous allons donc informer le système qu’il doit systématiquement monter le dossier partagé sur RasPi1 à chaque démarrage. Ça se passe dans /etc/fstab.
Le fichier fstab (file systems table) est la table des différents systèmes de fichiers sur un ordinateur sous Unix/Linux : il contient une liste des disques utilisés au démarrage et des partitions de ces disques. Pour chaque partition, il indique comment elle sera utilisée et intégrée à l’arborescence du système de fichiers global (c’est-à-dire le point de montage). Il se trouve généralement à /etc/fstab.
Dans les versions récentes d’Unix/Linux, des outils d’administration peuvent automatiquement générer un fichier fstab complet lors de l’installation du système d’exploitation ou proposer une interface graphique pour modifier ce fichier. (Wikipedia)
Merci Kikipedia, on va s’en occuper !
Comme vous l’avez vu avec la commande mount, si vous ne saisissez pas le nom d’utilisateur et son mot de passe, vous ne pouvez pas vous connecter au partage Samba. En mode manuel pas de problème, soit vous saisissez le login/password manuellement, soit vous l’intégrez à la commande mount.
Maintenant imaginons un Raspberry Pi « headless » (pas de clavier, pas d’écran… je ne parle même pas de la souris, accessoire bien inutile en ligne de commande ). Alors, hein avec un RasPi headless c’est comment-y que vous saisissez le login/mot de passe ?
Heureusement Tux le manchot a pensé à tout. Il suffit de créer un fichier .smbcredentials et de mettre dedans le login et le mot de passe… Fastoche !
Remarque : Le point devant le nom du fichier signifie que c’est un fichier caché
Sur le Raspi2 créez un fichier /home/pi/.smbcredentials (oui avec nano mais je ne vais pas tout vous re-expliquer à chaque fois, bossez un peu, aussi ). Dans le fichier ajoutez ces deux lignes:
username=pi password=raspberry
Puis donnez au fichier les droits 600. (Si ça ne vous inspire pas je vous conseille un peu de lecture)
Ajout d’un montage dans fstab
Toujours sur le Raspi2 ajouter la ligne suivante à /etc/fstab :
//192.168.1.230/commun /home/pi/lien_raspi1 cifs credentials=/home/pi/.smbcredentials,x-systemd.automount,defaults 0 0
Pour tester qu’il n’y a pas d’erreur dans la ligne que vous avez rajoutée à fstab la commande mount -a monte les systèmes de fichiers présents dans fstab :
pi@raspberrypi:~ $ sudo mount -a
Si vous ne vous faites pas insulter par Jessie c’est que ça s’est bien passé. Sinon… cherchez l’erreur que VOUS avez pu faire et ne m’envoyez pas de message incendiaire pour m’insulter et me dire que le tuto « y marche pas »
On va vérifier que maintenant le RasPi2 a bien une liaison avec le serveur (oui je sais il s’en passe des choses parfois étrange dans les bars…)
pi@raspberrypi:~ $ cd lien_raspi1 pi@raspberrypi:~/lien_raspi1 $ ls -al total 4 drwxrwxr-- 3 pi pi 0 mai 11 19:52 . drwxr-xr-x 21 pi pi 4096 mai 11 21:19 .. -rw-r--r-- 1 pi pi 0 mai 11 19:26 raspi1 drwxrwxrwx 3 pi pi 0 mai 11 21:20 toto pi@raspberrypi:~/lien_raspi1 $
On retrouve notre fichier raspi1 qui se trouve sur le RasPi1… donc on a bien monté le partage sur /home/pi/lien_raspi1
Vérification finale
Je vous laisse décortiquer la ligne ajoutée dans fstab. Vous trouverez des liens dans la rubrique Sources.
Allez, on reboote ! Et là, misère de misère, le montage ne se fait pas ! Le répertoire /home/pi/lien_raspi1 reste désespérément vide
Explication : le RasPi2 était relié au routeur en WiFi et le réseau n’était pas encore en place quand le système voulait monter le partage dans /home/pi/lien_raspi1. Pas de message mais… pas de montage non plus ! dmesg par contre donnait des indications claires sur le problème qui provoquait la « panne » (vous voyez qu’en cherchant un peu on arrive à mettre hors de cause les farfadets, gnomes et autres trolls qui sont censés hanter Linux) :
[ 9.652749] FS-Cache: Netfs 'cifs' registered for caching [ 9.653772] Key type cifs.spnego registered [ 9.653866] Key type cifs.idmap registered [ 9.679094] CIFS VFS: Error connecting to socket. Aborting operation. [ 9.680424] CIFS VFS: cifs_mount failed w/return code = -101 [ 9.818847] CIFS VFS: Error connecting to socket. Aborting operation. [ 9.824717] CIFS VFS: cifs_mount failed w/return code = -101 [ 10.118682] systemd-journald[133]: Received request to flush runtime journal from PID 1 [ 10.419502] Adding 102396k swap on /var/swap. Priority:-1 extents:3 across:1773568k SSFS [ 10.526376] smsc95xx 1-1.1:1.0 eth0: hardware isn't capable of remote wakeup [ 10.526719] IPv6: ADDRCONF(NETDEV_UP): eth0: link is not ready [ 10.685480] wlan0: authenticate with c0:4a:00:5a:ca:03 [ 10.758366] wlan0: send auth to c0:4a:00:5a:ca:03 (try 1/3) [ 10.760181] wlan0: authenticated [ 10.762347] wlan0: associate with c0:4a:00:5a:ca:03 (try 1/3) [ 10.765989] wlan0: RX AssocResp from c0:4a:00:5a:ca:03 (capab=0x431 status=0 aid=6) [ 10.774647] wlan0: associated [ 10.774937] IPv6: ADDRCONF(NETDEV_CHANGE): wlan0: link becomes ready
On voit que quand wlan0 est prêt (dernière ligne) il y a belle lurette que l’erreur CIFS est passée et que notre montage n’a pas été fait ! Ce qui se traduit lorsque vous allez dans le répertoire lien_raspi1 par un répertoire désespérément vide.
En mettant x-systemd.automount dans les options de la ligne ajoutée à fstab, on indique au système qu’il peut démarrer et que le montage du dossier partagé n’interviendra que lorsque vous y accéderez…
Démarrage normal… accédez au répertoire /home/pi/lien_raspi1 et vous y retrouvez tout ce qu’on s’attend à y trouver :
pi@raspberrypi:~/lien_raspi1 $ ls raspi1 toto
C’est à dire notre « flag » raspi1 et le répertoire toto créé un peu plus tôt (nan, pas le chien de Mickey !)
Amusez vous, créez des fichiers, supprimez les, créez un répertoire et des fichiers dans ce répertoire etc… tout ça doit fonctionner sans problème.
Bon, et on en fait quoi ?
Alors là… C’est vous qui voyez ! Vous avez un répertoire partagé entre deux machines (mais ce n’est pas limitatif). Chaque RasPi peut écrire dans ce répertoire ou y récupérer des infos. Voilà un bon moyen pour échanger des images, des mesures, tout ce que vous voudrez…
Conclusion
Nous sommes arrivés au bout de cette aventure. Samba est capable de bien d’autres choses et de nombreux tutoriels proposent des solutions (même framboise314). Celui de Pi Home Server dans les sources ci-dessous est très bien fait.
Une fois que vous avez un système qui fonctionne, faites une copie de sauvegarde de votre carte microSD et… amusez vous. Vous ne pouvez rien casser, si vous plantez le RasPi vous refaites la carte à partir de votre image sauvegardée et hop, ça repart !
Plus vous ferez de manips, d’erreurs, d’essais… Plus vous avancerez et plus vous progresserez dans l’utilisation de Linux. Juste un truc de professionnel à ne pas oublier : RTFM
Je n’ai pas la prétention d’avoir réalisé LE partage Samba parfait. Il y a certainement des imperfections que les commentaires ci-dessous vous permettront de rectifier ! Mais bon, ne venez pas me dire qu’avec NFS ç’aurait été plus rapide, plus facile, plus mieux bien…
Sources
- https://doc.ubuntu-fr.org/partage
- https://wiki.debian.org/fr/fstab
- https://www.freedesktop.org/software/systemd/man/systemd.automount.html#
- https://wiki.ubuntu.com/MountWindowsSharesPermanently#Mount_password_protected_shares_using_libpam_mount_.28Ubuntu_9.04.29
- https://doc.ubuntu-fr.org/tutoriel/acceder_a_votre_nas_depuis_toutes_les_applications