Systemy plików

Główną zmianą w zarządzaniu systemami plików jest dodanie obsługi extended attributes EA (zewnętrznych atrybutów) oraz POSIXowej obsługi dostępu do plików - ACL.
Nowy kernel obsługuje też większą ilość sytemów plików.


Extended attributes czyli atrybuty zewnętrzne

Extended attributes (EAs) są parami metadanych klucz/wartość albo informacją o pliku, która nie jest częścią jego zawartości. Ponieważ linuxowe EA są zapisane jako tekst (string), to można tam przechować wiele cennych informacji. Np. można zaimplementować atrybut last-modified-by, który by mówił, kto ostatnio zmieniał plik.
EA mogą być zmieniane z linii komend. Aby ustawić jakiś atrybut używamy komendy setfattr (albo programując funkcji systemowej setxattr() ) do każdego pliku, który chcemy zmień. Aby odczytać EA używamy getfattr (lub systemowej funkcji getxattr()) .
Np. jeśli chcielibyśmy ustawić sobie atrybut pub_date (data publikacji) dla naszego artykułu artykul.txt na "June 2004", to zrobimy tak:

$ setfattr -n pub_date -v "June 2004" artykul.txt

Ponieważ EA są powiązane z plikami, to każdy pogram, który operuje na plikach (przede wszystkim chodzi o kopiowanie, nadpisywanie, przenoszenie itd...) musi mieć zaimplementowaną obsługę EA - w przeciwnym wypadku dane te zostaną wymazane. Aby ułatwić programistom obsługę EA wprowadzono bibliotekę <attr/libattr.h> a w niej 2 funkcje:

int attr_copy_file(...);
int attr_copy_fd(...);

ACL (POSIX Access Control Lists on Linux)


Tradycyjny system dostępu do plików POSIX definiuje 3 klasy użytkowników: owner, group, other. Dla każdej z tych klas są oddzielnie przypisane prawa dostępu - czytanie (r), pisanie (w) i wykonywanie (x).
ACL jest rozszerzeniem, które pozwala dużo dokładniej określić prawa dostępu.

Możemy np. pozwolić użytkownikowi A na czytanie, użytkownikowi B na pisanie i czytanie, a użytkownikowi C na wykonywanie i czytanie.

Dodatkowo w wersji rozszerzonej ACL możemy przydzielać uprawnienia dla wielu grup - nie tylko dla poszczególnych użytkoników.

Obecnie ACL jest obsługiwany w linuxie w systemach plików: Ext2, Ext3, IBM JFS, ReiserFS i SGI XFS.

Należy zaznaczyć, że ACL jest zaimplementowany jako EA!

Przykład:
ustawienie uprawnień:
$ setfacl -m user:joe:rwx dir
opcja -m mówi, że będziemy modyfikować uprawnienia

wypisanie uprawnień:
$ getfacl --omit-header dir
user::rwx
user:joe:rwx
group::r-x
mask::rwx
other::---

opcja --omit-header powoduje, że nie jest wypisywany nagłówek - nazwa pliku, właściciel, grupa

Maksymalna ilość wpisów ACL dla różnych systemów plików:
File systemMax. entries
XFS25
Ext2, Ext332
ReiserFS, JFS8191

Jak już wcześniej wspomniałem, są 2 rodzaje ACL:
Oczywiście operacje na sytemie plików z ACL mogą być trochę wolniejsze - zobaczcie testy wydajności:
http://www.suse.de/~agruen/acl/linux-acls/online/
lub tu:
http://kerneltrap.org/node/715

Ext2 i Ext3

W pliku .. odnaleźć możemy strukturę inode dla ext2: struct ext2_inode_info, a w niej atrybut: i_file_acl.
Jeśli to pole nie jest 0, to zawiera numer bloku systemu plików na którym zapisane są atrybuty zewnętrzne dla danego inode.
Ten blok zawiera i nazwy i wartości atrybutów, a wszystkie atrybuty zewnętrzne EA muszą się zmieścić na jednym bloku.

Dla poprawy wydajności wiele inode'ow z identycznym zestawem EA może mieć wskazane ten sam blok z EA. Ilość inodów, które mają odwołania do bloku z EA są zliczane w samym bloku. Oczywiście współdzielenie bloków z EA jest przezroczyste dla użytkownika.

Obecna implementacja zakłada, że wszystkie IE danego inode zmieszczą się w pojedynczym bloku dyskowym, co determinuje ich ilość i wielkość.

Jeśli jakaś część EA jest unikatowa dla inodów, to oczywiśćie nie ma możliwośći ich współdzielenia a czas potrzebny na sprawdzenie potencjalnego współdzielenia jest marnowany. Jeśli każdy inode ma unikalny zestaw EA, to każdy taki zestaw będzie trzymany w oddzialnym bloku dyskowym, co może powodować duże marnowanie przestrzeni dyskowej. Ekstremalnym przypadkiem jest aplikacja, która trzyma unikalne EA dla każdego inode'u. Na szczęście przy większośći zastosowań mechanizm współdzielenia EA jest bardzo efektywny.


ReiserFS

W ReiserFS kilka plików może współdzielić ten sam blok, co jest bardzo wydajne dla małych plików - nazywa sięto tail merging.

Chociaz ReiserFS jest dobry dla małych plików, EA może bezpośrednio korzystać z tego mechanizmu. Dla każdego pliku, który ma EA, tworzony jest w specjalnym katalogu katalog o nazwie wyciągniętej z unikalnego identyfikatora inode. Ów specjalny katalog jest zazwyczaj ukryty w przestrzeni nazw systemu. W inode danego katalogu, każdy EA jest trzymany jako oddzielny plik. NAzwami plików są nazwy atrybutów, a ich zawartość to wartość atrybutu.

ReiserFS nie ma zaimplementowanego mechanizmu współdzielenia atrybutów, ale najprawdopodobniej bedzie to dodane w późniejszych wersjach jądra. Wielkość jednego atrybutu nie może przekraczać 64 KB.


Ponadto

Nowy kernel oferuje także obsługę nowego (w Linuxie) XFS'a. Ten system plików jest kompatybilny z systemem plików XFS standardowo używanym w systemach Irix. Podobnie jak ext2,ext3 i Reiser może on być używany jako główny system plików i także ma zaimpelemtowaną obsługę EA i ACL.

Ponadto zaimpementowano dużo innych systemów plików. Linux 2.6 ma udoskonaloną obsługę NTFS - można teraz zapisywać na tej partycji, ale trzeba zaznaczyć, że jest to ciągle w fazie testów! Ponadto jest wsparcie dla FAT12 (dostowego systemu plikóe używanego na starych systemach i dyskietkach, a dziś przede wszystkim w odtwarzaczach mp3). I na koniec do systemu plików HPFS dodana została obsługa EA.

Warto też wspomnieć, że zarządzanie quotą zostało przepisane tak, żeby umożliwić obsługę większej ilośći użytkoniwów.


Literatura:


Powrót

Autor: Piotr Włodarczyk, pw209226@students.mimuw.edu.pl