Samba et espace disque restant

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

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.