Local
Le backend local sert un repertoire du systeme de fichiers du serveur, sa
racine (root). Chaque montage y a son sous-repertoire, home_dir.
[[backends]]
name = "disque"
type = "local"
root = "/srv/sftp"
[[roles]]
name = "utilisateurs"
[[roles.mounts]]
backend = "disque"
home_dir = "/{username}"
create_home = true
acl = [{ path = "/", rights = ["read", "write", "list", "delete", "rename"], recursive = true }]
alice envoie /rapport.txt : le fichier est /srv/sftp/alice/rapport.txt.
Les cles
Toutes les cles : Reference [[backends]] type = “local” ;
cles communes : Les backends.
La racine et les liens symboliques
Aucune operation ne sort de root + home_dir du montage, quels que soient
les liens qui s’y trouvent, y compris ce que le serveur fait lui-meme
(fichier en cours, verrou, balayage). Un lien vers le home_dir d’un autre
montage sort autant qu’un lien hors de la racine.
| Reglage | Un lien dans le montage | Un lien qui en sort |
|---|---|---|
follow_symlinks = false (defaut) | jamais suivi | jamais suivi |
follow_symlinks = true | suivi s’il reste sous root + home_dir | jamais suivi |
- Un lien se liste comme un lien (type
l;"is_symlink": trueen REST), ou, suivi, comme sa cible. Supprimer ou renommer agit sur le lien. - Avec
hidden_stores, un envoi sur un lien de fichier remplace le lien ; la cible reste intacte. - Aucune porte ne cree de lien : ils viennent d’un autre processus ou d’une restauration.
- La racine et ses ancetres sont de confiance (une racine a travers un lien est suivie) : inscriptibles par l’administrateur seul.
- Sur un volume partage (NFS…), montez la racine
nosymfollow(Linux 5.10 et plus).
Casse des chemins de l’ACL
Sur un stockage qui confond les majuscules (NTFS, APFS et HFS+ par defaut,
SMB/CIFS, ext4 ou tmpfs casefold), l’ACL compare les chemins plies :
NFD, retrait des points de code ignorables (U+200B…), pliage de casse
complet (straße = strasse), NFC.
| Reglage | Comparaison des chemins de l’ACL |
|---|---|
case_insensitive = true | pliee |
case_insensitive = false | octet a octet, sans normalisation |
| cle absente | une sonde decide, au demarrage et a chaque rechargement des roles |
La sonde cree un fichier en minuscules et le cherche en majuscules dans
chaque repertoire ou une entree se resout (le pliage se regle par repertoire,
chattr +F) : un repertoire qui plie fait plier le backend, ce qui ne
tranche pas plie. Un repertoire absent ou sous {username} n’est pas sonde,
et un volume APFS sensible a la casse reste insensible a la normalisation :
dans le doute, case_insensitive = true.
La ou l’ACL plie, et sur un serveur Windows, un nom court 8.3 (PROTEG~1)
ou fini par . ou une espace n’est pas un chemin valide : desactivez les
noms courts (fsutil 8dot3name).
Les cles communes sur un backend local
| Cle | Sur un backend local |
|---|---|
home_dir (montage) | un sous-repertoire de root : /partenaire/in/x d’un montage a /partenaire de home_dir = "/partenaires/acme" est /srv/sftp/partenaires/acme/in/x |
create_home (montage) | true : cree home_dir s’il manque, a l’ouverture de la session, un niveau a la fois, jamais a travers un lien |
hidden_stores | un fichier en cours de transfert a cote de la destination, publie par renommage |
stale_partials | le balayage de ces fichiers, sur l’horloge du systeme de fichiers |
cross_instance_reservation | un fichier verrou a cote de la destination ; false par defaut sous Windows : une instance par racine |
lock_prefix | le nom de ces verrous |
Le processus agit sous son propre uid ; le mode des fichiers suit son umask.
Sur Linux 5.6 et plus, le noyau impose le confinement (openat2(2),
RESOLVE_BENEATH) ; sans openat2, chaque composante est ouverte
O_NOFOLLOW (dit une fois en INFO) ; sous Windows, le parent est verifie
juste avant l’appel.
Performances et limites
- Un renommage et la publication d’un envoi utilisent
RENAME_NOREPLACE. La ou le systeme de fichiers ne l’a pas (NFS, FUSE dont sshfs, 9p), ils retombent surrename(2): un ecrasement concurrent n’y est pas detecte, et l’audit d’un envoi qui ecrase ditreplaced=unknown. - Aucun
fsync: un succes ne promet pas la durabilite sur disque. mkdircree un niveau ; les parents manquants d’un envoi sont crees un par un, chacun juge par l’ACL.- La suppression d’un arbre n’est pas comptee : l’audit dit
removed=unknown.
Ce que vous verrez
| Quand | Ligne |
|---|---|
| demarrage, sonde de la casse | INFO avec backend, acl_paths = folded ou exact |
create_home cree un repertoire | INFO created missing home directory, champ home_dir |
| demarrage, balayage des restes | INFO stale in-flight files: ..., champs backend, grace_secs, age_check |