Capitolo 028 - Extended Attributes - lsattr e chatt http://www.linuxintheshell.com/2013/04/23/episode-028-extended-attributes-lsattr-and-chattr/ Nel capitolo 7 si e' parlato del comando "chown" e dei permessi dei file in UNIX. Adesso amplieremo l'argomento parlando degli attributi estesi del filesystem, o piu propriatamente chiamati "attributi estesi". Il filesystem di Linux supporta 3 permessi/attributi: "read", "write" e "execute" per 3 differenti livelli: proprietario, gruppo proprietario e altri. Gli attributi estesi, abbreviati in "xattr", aggiungono alcuni permessi in piu' o alcune restrizioni ai 3 attributi originali. Gli attributi estesi sono supportati nei filesystem "ext*" insieme a JFS, ReiserFS, XFS, Btrfs, e OCFS2 ver. 1.6. Gli attributi estesi forniscono le seguenti caratteristiche (in ordine alfabetico di parametro): - a - solo aggiunta: La scrittura del file sara' permessa soltanto aprendo il file in modalita' "append". Questo significa che non e' possibile ridirigere output per sovrascrivere il file, si puo' soltanto accodare. Le principali operazioni di edit di file, come l'apertura con un editor di testo, fallira' appena il programma provi a sovrascrivere il file con le modifiche, ricevendo il messaggio “permission denied”. Questo attributo puo' essere impostato solo da un account con privilegi di amministratore. (n.d.t. ottimo per proteggere i log) - A - Non viene aggiornato il valore "atime" - tempo di accesso. Quando il file viene acceduto non viene aggiornato l'attributo "tempo di accesso" (atime). La funzionalita' di questo attributo puo' essere un po' complicata perche' se si vuole vederlo applicato occorre sapere alcune cose. La funzionalita' di "atime" e' determinata da come viene montato il filesystem. Con impostato "noatime" il tempo di accesso del file non viene aggiornato quando il file viene acceduto. Con "atime" impostato utilizza i default del kernel per la sua gestione. Ora dovrebbe essere rigorosamente impostato dove atime e' sempre aggiornato quando il file viene acceduto oppure con relatime il quale aggiorna il tempo di accesso solo in caso sia piu' vecchio del tempo di modifica. Cosi' se si sta' monitorando atime con il comando stat e si accede al file e non si vede il tempo di accesso modificato, le possibilita' sono che il filesystem sia montato con impostato o noatime o relatime. Potrebbe essere necessario modificare il file e poi accedervi (es. cat file) prima che atime venga modificato. - c - attributo di compressione: Compress imposta che il file debba essere compresso quando scritto sul disco. I dati scritti nel file sono compressi dal kernel prima che il file sia scritto e, quando viene letto, il file viene decompresso dal kernel per la lettura. Notare che impostando questo attributo si puo' incorrere in un consumo eccessivo di risorse quando occorrera' comprimere/decomprimere il file al momento della scrittura/lettura. Notare che questo attributo non e' implementato nei filesystem ext2, ext3 e ext4. - C - no copy-on-write: Il comportamento standard nei principali filesystem di Linux e' quello di, quando un file e' aperto da diversi task nello stesso momento, invece di creare molteplici copie delle informazioni per ogni task, viene utilizzato un puntatore alle risorse condivise. Quando un task dovesse scrivere su un file, allora la copia privata verrebbe "interrotta" per quel task invece di manipolare le risorse condivise. Questo comportamento puo' essere evitato impostando l'attributo "C" cosi' da evitare di creare una copia separata e privata. - d -no dump: Questo imposta il file come escluso dal salvataggio, quando verra' utilizzato il comando "dump". - D - Aggiornamento directory sincrono: Quando viene modificato un file le modifiche vengono scritte sul disco in modo sincrono. Questo significa che qualsiasi modifica a file viene immediatamente scritta su disco e resa disponibile. Questo e' particolarmente utile in una situazione di rete dove diversi sistemi possono accedere ad una risorsa condivisa. Quando un file viene creato in quella risorsa condivisa la directory viene immediatamente aggiornata cosi' che sia visibile a tutti i sistemi che accedono a quella risorsa. - e - extents: Questo attributo indica che il file utilizza gli extent per mappare i blocchi su disco. Extent rimpiazza il tradizionale schema di mappatura a blocchi (che si trova nel ext2 e ext3) e definisce un intervallo contiguo di blocchi fisici per la memorizzazione dei dati. Questo attributo viene impostato dal filesystem e non puo' essere alterato da "chattr". - E - Questo e' un attributo sperimentale che puo' essere impostato dai programmi di compressione per indicare che un file compresso ha un errore di compressione. Questo attributo non puo' essere impostato o modificato con "chattr". - h - Questo non e' un attributo che puo' essere impostato. La sua presenza indica che il file memorizza i suoi blocchi in unita' di dimensione del blocco del filesystem contrariamente a unita' di settori. Questo viene mostrato quando un file e', o era una volta, piu' grande di 2TB. - i - Immutabile: Questo rende il file difficile da modificare. Il file non puo' essere scritto, ampliato, o cancellato. Non puo' essere rinominato e non puo' avere collegamenti. Questo attributo puo' soltanto essere impostato da un account amministrativo. - I - La directory viene indicizzata: Questo attributo non puo' essere impostato da "chattr". Quello che indica e' che la directory viene indicizzata usando gli "hash tree". - j - Data journaling: Se il filesystem e' montato abilitando le opzioni data=ordered o data=writeback allora questo attributo forzera' la scrittura dei dati del journal ext3 prima che siano scritti i dati sul file. Se la condivisione e' montata con data=journal, allora questo attributo non ha nessun effetto diverso dalla modalita' data=journal. - s - Cancellazione sicura: Quando il file viene cancellato i blocchi usati dal file sono (letteralmente) azzerati. Questo attributo non e' implementato nei filesystem ext2 e ext3. - S - Aggiornamenti sincroni: con l'attributo "aggiornamenti sincroni" impostato le modifiche al file sono immediatamente scritte sul disco. Altrimenti, le modifiche al file vengono messe in una cache e scritte in un secondo momento. - t - no tail merging: Tail merging, o block sub-allocation e' quando un singolo blocco viene usato per memorizzare l'ultima parte dei dati di altri file. I filesystem per la memorizzazione sono formattati in blocchi. Il default nella maggior parte dei filesystem Linux e' di blocchi di 4KB. La maggior parte dei file non dividono in modo uniforme i dati nel blocco risultando all'ultimo code, l'ultimo blocco del file contenente spazio vuoto. La sotto-allocazione del blocco e' un comportamento di alcuni filesystem per aggregare le code di diversi blocchi in uno solo liberando cosi' quei blocchi le cui parti finali avrebbero occupato spazio. Questo attributo "no tail merging" elimina questo comportamento sui file. - T - Top gerarchia di directory: Questo attributo funziona con l'algoritmo allocatore di blocco di Orlov. L'idea e' che memorizzando file in relative directory contigue risultera' un accesso al disco piu' veloce. Un esempio adatto sono le directory home. Raggruppando i files con le loro directory home su un disco in teoria la maggior parte degli accessi dovrebbero essere piu' veloci. Altrimenti, se le directory sono raggruppate con file non correlati allora l'accesso al disco dei file correlati sara' piu' lungo. Questo flag tentera' di forzare le sub-directory ad essere non correlate e dovrebbero essere sparpagliate. - u - Incancellabile: Questo attributo imposta il file come recuperabile qualora dovesse essere cancellato, il contenuto del file viene in realta' salvato. Questa opzione non e' disponibile per i filesystem ext2 e ext3. E' un eredita' da extfs. - X (non disponibile) sperimentale (dati grezzi compressi possono acceduti direttamente) - Z (non disponibile) sperimentale (il file compresso e' "sporco") - v (vedi sotto) Gli attributi di file o directory possono essere visualizzati con il comando lsattr. Questo comando di per se esegue una lista della directory mostrando tutti i file nella directory di lavoro corrente e i relativi attributi. Specificando un singolo file mostrera' solo gli attributi di quel file. L'output sara' tipo questo: lsattr test.txt Produce: -----------------e- test.txt Al posto dei trattini, si puo' impostare: suS-iadAcj-t-e- test.txt Al comando lsattr e' possibile passare diversi parametri: -R - elenca ricorsivamente gli attributi di directory e relativi contenuti -a - elenca tutti i file nella directory incluso i file nascosti -d - elimina l'elenco dei contenuti delle directory e elenca le directory come gli altri file -V - mostra la versione di lsattr -v - visualizza il numero di versione/generazione dei file Il numero di versione/generazione viene generalmente gestito dal filesystem. Questo numero e' disponibile nei filesystem di rete come NFS dove e' possibile controllarlo per vedere se un file e' stato modificato o cancellato da un'altro utente nelle situazioni dove diversi utenti possono accedere al file. Gli attributi del filesystem possono essere gestiti dal comando chattr. Il comando funziona analogamente a chmod per quanto riguarda la richiesta che gli siano passati gli attributi modificati e un file o una lista di file. La modifica degli attributi puo' essere fatta con: + - imposta l'attributo - - rimuove l'attributo = - forza gli attributi Cosi' per aggiungere l'attributo "append" al file test.txt: chattr +a test.txt Ricordare, questo attributo puo' essere aggiunto soltanto da un account amministrativo come root. Per rimuovere l'attributo "append": chattr -a test.txt Usando l' "=" per impostare gli attributi verranno forzati e applicati solo quegli attributi. Se ci sono gia' attributi applicati al file questi saranno rimossi se non specificati nel comando chattr. L'avvertenza e' che solo gli attributi che possono essere impostati con chattr siano modificati. Provando a impostare o rimuovere l'attributo "h" questo fallira' per il motivo che questo puo' essere impostato dal filesystem e non con chattr. Ci sono pochi parametri che chattr accetta. Il parametro -R imposta ricorsivamente gli per tutti i file e le sub-directory nella specificata o corrente directory. Il parametro -V dice a chattr di essere verboso su quello che sta' facendo e visualizzera anche la versione del programma. Il parametro -f elinina i messaggi di errore. Il parametro -v permettera di impostare il numero di versione per un file. Richiede che sia passato il numero di versione. A meno che non si sappia cosa fare, non usare questo parametro. Questo articolo di "Linux in the Shell" parla degli attributi estesi di file, di come visualizzarli e impostarli con i comandi lsattr e chattr. - - - - - - - bibliography: man chattr man lsattr man mount Wikipedia Page - Chattr Wikipedia Page - Stat Wikipedia Page - File Attributes Wikipedia Page - Extended Attributes Wikipedia page: Copy on Write Wikipedia Page: Block Sub Allocation Wikipedia Page: Orlov Block Allocator Wikipedia Page: Extents