Samba est probablement le plus connu des services de partages de fichiers.
Il permet aux utilisateurs de Linux et Windows de partager des disques et des imprimantes.
Mais samba a un gros défaut : il peut se tromper lorsqu’il retorune l’espace disque restant, il peut être impossible de copier un fichier de 1 Go sur un disque sur lequel il reste 100Go d’espace libre parce que samba retourne un espace disque restant de 0,05 Go.
Cela peut arriver lorsque vous assemblez dans un même partage plusieurs disques durs
Imaginez que vous avez 3 disques durs sur un PC1 : D1,D2 et D3 , montés dans /media/partage/D1, /media/partage/D2, /media/partage/D3
Partagés maintenant /media/partage/ sur le réseau
Quand vous copiez un fichier avec windows dans /media/partage/D1, Windows pense que le disque de destination est /media/partage , il n’a aucune référence à D1. Il demande l’espace restant à samba, samba pense alors que le disque en question est celui où se trouve le dossier /media/partage/ , c’est à dire le disque monté en / et renvoie l’espace disque restant du mauvais disque dur.
Pour résoudre cela, il y a une solution :
On peut personnaliser samba pour qu’il utilise une fonctione particulière et personnalisée lorsqu’il a besoin de connaitre l’espace disque restant
Pour cela, on met dans la section [partage] de /etc/samba/smb.conf la directive suivante :
dfree command = /usr/local/bin/partage_dfree.sh
et on se créer un script spécial qui fera le job qu’on va mettre dans /usr/local/bin/partage_dfree.sh
Samba ne pourra pas nous dire quel est le disque de destination parmis les 3.
Alors on peut faire un script qui va retouner le plus petit des espace disque restant des 3 disques : c’est mieux que rien, le voici :
/bin/bash diskA="/media/D1" diskB="/media/D2" diskC="/media/D3" #lecture des informations dont samba à besoin pour chacun des 3 disques, il faut : le nombre de blocs et la taille restante disponible bA=$(df $diskA | tail -1 | awk '{print $2}') sA=$(df $diskA | tail -1 | awk '{print $4}') bB=$(df $diskB | tail -1 | awk '{print $2}') sB=$(df $diskB | tail -1 | awk '{print $4}') bC=$(df $diskC | tail -1 | awk '{print $2}') sC=$(df $diskC | tail -1 | awk '{print $4}') #Renvoyer ces informations exclusivement pour le disque dont l'espace disque restant est le plus petit if [ $sA -le $sC -a $sA -le $sB ]; then echo "$bA $sA" elif [ $sB -le $sC -a $sB -le $sA ]; then echo "$bB $sB" elif [ $sC -le $sB -a $sC -le $sA ]; then echo "$bC $sC" fi
Ne pas oubliez de rendre le script executable :
chmod a+rx /usr/local/bin/partage_dfree.sh
Pour pouvez exécuter le script, il doit renvoyer la taille d’un seul disque exprimé de 2 manières différentes et ce, sans erreur
Ex de valeurs retournez (pour un disque sur lequel il reste 3,3Go de libre) : 3907016700 3474324904
Ne reste plus qu’à redémarrer samba et vérifier qu’il a démarré sans erreurs
systemctl restart smbd && systemctl status smbd