Per avere a disposizione le ACL posix occorre che il kernel le supporti (ACL ed Extended Attributes) e che il mount sia fatto con supporto per le ACL ed eventualmente Extended Attributes.
In fstab occorre quindi specificare:
/dev/hdc1 /ud1 ext3 defaults,noatime,acl 0 2
per l'uso delle ACL, e:
/dev/hdc1 /ud1 ext3 defaults,noatime,acl,user_xattr 0 2
per l'uso delle ACL e degli attributi estesi.
Creazione e gestione delle ACL sul file system
Quando si crea una directory da condividere con Samba usando le ACL, e` importante ricordare che occorre impostarne correttamente i permessi onde evitarsi casini pazzeschi dopo. Tipicamente la directory, se deve essere gestita principalmente da un gruppo puo` essere owned dal gruppo in questione, con il bit SGID settato, e poi le si possono applicare le ACL per gli altri gruppi o utenti, ricordando che oltre alle ACL vanno settate anche le DEFAULT ACL, in modo che quello che viene creato sotto di essa abbia le stesse ACL della directory iniziale.
Per esempio, la directory "amministrazione" che deve venire usata dal gruppo amministrazione ma anche letta dagli acquisti e letta/scritta dalla direzione, io la imposterei cosi`:
mkdir amministrazione # owned dal gruppo amministrazione chown root.amministrazione amministrazione # setgid, user e gruppo hanno rwx, other ha nulla chmod 2770 amministrazione # direzione ha rwx, acquisti ha rx setfacl -m g:direzione:rwx,g:acquisti:rx amministrazione # come sopra, ma setto le default ACL, che verranno ereditate da cio` che viene creato sotto setfacl -d -m g:direzione:rwx,g:acquisti:rx amministrazione
In questo modo uso le ACL per dare accesso ai gruppi "secondari", lasciando il gruppo principale (amministrazione) impostato nei permessi "standard" di Linux. Ovviamente avrei potuto anche dare ownsership a root.root e inserire tutti i permessi di accesso degli utenti nelle ACL, gruppo principale compreso.
Problema con le ACL e il "move" dei files
Quando si effettua un "move" di files (e alberi di directory) all'interno dello stesso file system, questi tengono le ACL originali anche se le default ACL della directory di destinazione sono diverse. In pratica, muovendo files fra directory con ACL completamente diverse, questi ritengono le ACL che avevano all'inizio, il che e` sbagliato se nella directory di destinazione ci sono delle default ACL che dovrebbero essere ereditate dai files che si trovano sotto di essa. Questo e` un problema di file system e non di Samba (si ottiene lo stesso risultato con un "mv" da shell o un move da un client windows). Tra l'altro, anche se la directory di destinazione e` impostata "setgid", anche il gruppo non viene correttamente settato e resta quello di origine.
L'unica soluzione "facile" e` fare una copia e non un move dei files (da client Windows). Cosi` facendo i files di destinazione sono creati correttamente (setgid e default ACL)
Se si e` fatto un move, e` possibile correggere le acl sul tree di destinazione cosi`:
cd /path/to/destination_dir getfacl . | setfacl -R --set-file=- *
Questo comunque non corregge l'ownership, direi.
Impostazioni in smb.conf
Se si vogliono usare le ACL posix su uno share, e` consigliabile impostare la mappatura degli attributi DOS su attributi estesi del file system e non sull'attributo X di user,group e other, questo perche` altrimenti si creano casini molesti fra le mask delle acl e quella standard dei permessi del file system. In proposito, vedi ../AttributiEstesiDos. Inoltre tipicamente si vorranno usare delle ACL di defualt ed ereditarle all'interno dell'albero di directory. Una imposazione di base per uno share con le ACL potrebbe essere la seguente:
map archive = no map system = no map hidden = no store dos attributes = yes inherit permissions = yes inherit acls = yes {le dir sotto ereditano le ACL di default da sopra (leggi man smb.conf!)}
Tutto questo pero` va provato per vedere se ci sono aggiustamenti da fare, ovvero se in qualche situazione (tipo un utente che mette un file read-only da windows) ci sono effetti collaterali. Per essere precisi, andrebbero provate e verificate le impostazioni di mask e force che uso negli share senza ACL per vedere se e quali si applicano a quelli con le ACL.
Docuemntazione varia
/ArticoloDiTerpstra (Sulla gestione delle ACL e la migrazione win-linux delle stesse)
manuale_acl.pdf (manuale introduttivo alle ACL Posix sul file system - valido)
Backup e restore delle ACL
Quasi nessun sistema di backup supporte le ACL. Tar e afio (quindi tob) ad esempio non le supportano. Al momento le due soluzioni possibili sono:
Usare "star" (http://sourcewell.berlios.de/appbyid.php?id=1036)
Usare il sistema classico (tar, afio, ecc) e getfacl -R > file / setfacl --restore=file
Questo e` un esempio (imperfetto) di comando di backup e verify con star:
star cvzf /mnt/ud1_dati.star.gz -acl -xattr -artype=exustar --block-number /ud1/dati/ > /mnt/star.log star -diff -xattr -/ -z -f /mnt/ud1_dati.star.gz
Questo e` un esempio di restore con tutti gli attributi e le ACL:
star xzpf test2.star.gz -xattr -acl -C <directory di output>
Restore di un singolo file salvandolo nella directory "dir_recover" anziche` nella sua directory originale (notare gli apici e il fatto che manca lo slash all'inizio del nome del file da recuperare):
star zxpf test2.star.gz -xattr -acl -C dir_recover 'ud1/test3/acquisti/file.xls'
Restore di files che matchano un pattern, salvandoli nella dir corrente. Questo restora i files che contengono "ECO" nel nome. (lo slash viene strippato quindi non vai a sovrascrivere nulla a meno che non li restori in /):
star zxpf test2.star.gz -xattr -acl pattern='*ECO*'
Nota importante
Le acl su ext3 ed ext2 hanno sofferto di un baco che provoca la perdita delle default ACL su una directory in determinati casi, ben poco ripetibili. il problema dovrebbe essere risolto a partire dalla patch versione 0.8.72.
> I have read the old messages about the issue where default ACLs > sometimes disappear from folders using ext3, but I have not understood > if this issue has been completely solved or not, and in which patch > version. This was fixed in version 0.8.72. The bug was in function ext2_xattr_cmp and ext3_xattr_cmp: They did not compare the e_name_index field.
I kernel debian fino a 2.4.27-10 e fino a 2.6.8-16 (alla data del 8/8/2005 non ci sono ancora le fix, che immagino andranno nelle versioni 11 e 17 rispettivamente) sono bacati. Le versioni successive dovrebbero avere il baco messo a posto. Sicuramente e` a posto il kernel 2.6.12 debian. Per il momento, comunque, qui c'e` la patch:
--- fs/ext2/xattr.c 2005-08-09 17:59:44.000000000 +0900 +++ fs/ext2/xattr.c 2005-08-09 17:59:46.000000000 +0900 @@ -977,6 +977,7 @@ if (IS_LAST_ENTRY(entry2)) return 1; if (entry1->e_hash != entry2->e_hash || + entry1->e_name_index != entry2->e_name_index || entry1->e_name_len != entry2->e_name_len || entry1->e_value_size != entry2->e_value_size || memcmp(entry1->e_name, entry2->e_name, entry1->e_name_len)) --- fs/ext3/xattr.c 2005-08-09 17:58:31.000000000 +0900 +++ fs/ext3/xattr.c 2005-08-09 17:58:50.000000000 +0900 @@ -1025,6 +1025,7 @@ if (IS_LAST_ENTRY(entry2)) return 1; if (entry1->e_hash != entry2->e_hash || + entry1->e_name_index != entry2->e_name_index || entry1->e_name_len != entry2->e_name_len || entry1->e_value_size != entry2->e_value_size || memcmp(entry1->e_name, entry2->e_name, entry1->e_name_len))
La patch si puo` anche scaricare qui: xattr-sharing.patch e si applica con "patch -p0"