Rozszerzone atrybuty pliku
Napisał: Patryk Krawaczyński
23/10/2017 w Administracja Brak komentarzy. (artykuł nr 645, ilość słów: 1073)
J
edną z kluczowych spraw przy zarządzaniu danymi jest możliwość monitorowania ich stanu. Zazwyczaj oznacza to monitorowanie ich metadanych. Na szczęście standard POSIX daje nam taką możliwość za pomocą:
- właścicielstwa pliku (identyfikator użytkownika i grupy),
- uprawnienia do pliku (wszyscy, grupa, użytkownik),
- czasów pliku ( atime, ctime, mtime),
- rozmiaru pliku,
- nazwy pliku,
- prawdą: czy obiekt jest plikiem, czy katalogiem?
Dzięki tym informacją możemy nadzorować podstawowy stan naszych danych: obliczać, jak szybko zmieniają się dane (ile plików zostało: zmodyfikowanych, utworzonych, usuniętych w określonym przedziale czasu), czy określać ich proces starzenia (wiek przeciętnego pliku, średnią dla całego drzewa systemu plików lub jego części). W istocie jesteśmy w stanie uzyskać dobry, statystyczny przegląd naszych danych.
Wszystkie te charakterystyki są fajne. Jednak wraz z szybkim zwiększaniem się zajętości systemu plików i utrzymywaniu tej samej mediany rozmiaru plików mamy znacznie więcej obiektów do monitorowania. Nie skłamię, jeśli powiem, że też coraz dłużej przetrzymujemy nasze dane na dyskach (lokalnych lub zdalnych). Dlatego też z upływem czasu bardzo łatwo zapomnieć, co oznacza dana nazwa pliku lub co kryje się w jego zaszyfrowanej formie. POSIX jest na tyle dobry, że udostępnia nam podstawowe metadane, ale czy nie byłoby miło mieć możliwość dodawania własnych metadanych? Coś, co pod naszą kontrolą pozwoliłoby opisywać dodatkowe informacje o naszych danych.
Wielu użytkowników nie zdaje sobie sprawy, że w rzeczywistości istnieje mechanizm dodawania własnych metadanych do plików obsługiwanych przez większość systemów plików Linuksa. Umożliwiają to rozszerzone atrybuty plików. W systemie Linux bardzo wiele systemów plików posiada ich obsługę: ext2, ext3, ext4, JFS, XFS, BTRFS itd. Niektóre z nich mają ograniczenia dotyczące używania rozszerzonych atrybutów, jak np. ilość danych, które można dodać. Niemniej wszystkie pozwalają na dodawanie metadanych kontrolowanych przez użytkowników.
Każdy, regularny plik, który używa jednego z wcześniej wymienionych, rozszerzonych atrybutów może zawierać ich listę. Atrybuty mają nazwę i powiązane dane (rzeczywisty atrybut). Nazwa zaczyna się od tego, co nazywa się identyfikatorem przestrzeni nazw (ang. namespace) po której następuje kropka “.” oraz ciąg znaków zakończony znakiem NULL (ang. null terminated string). Możemy dodać tyle nazw oddzielonych kropkami ile chcemy tworząc w ten sposób “klasy” atrybutów. Obecnie w systemie Linux istnieją cztery przestrzenie nazw dla rozszerzonych atrybutów plików:
- user,
- trusted,
- security,
- system
W tym wpisie zajmiemy się przestrzenią “użytkownika”, ponieważ nie ma żadnych ograniczeń w odniesieniu do nazewnictwa lub zawartości. Jądro Linuksa umożliwia nadanie nazw rozszerzonym atrybutom do 255 bajtów i wartości do 64KiB w systemach plików XFS i ReiserFS, ale EXT 2/3/4 i BTRF nakładają mniejsze limity, wymagając od wszystkich atrybutów (nazw i wartości) jednego pliku do zmieszczenia się w jednym bloku systemu plików (przeważnie 4KiB). Przestrzeń “systemu” jest używana przede wszystkim do list kontroli dostępu (ang. access control list) i może być ustawiana tylko przez administratora lub właściciela pliku. Na przykład w tej przestrzeni będziemy używać takich nazw, jak: system.posix_acl_access
i system.posix_acl_default
. Przestrzeń “bezpieczeństwa” jest używana przez SELinux. Na przykład w tej przestrzeni będziemy używać takich nazw, jak: security.selinux
.
Atrybuty w przestrzeni użytkownika mogą być używane przez regularnego użytkownika systemu i każdą uruchamianą przez niego aplikację. Są one chronione przez zwykłe prawa dostępu do plików. Jeśli nasz użytkownik posiada uprawnienia do zapisu w danym pliku może ustawić na nim rozszerzony atrybut. Poniżej znajduje się kilka przykładów, które mogą dać nam pojęcie, co zrobić w ramach nazw dla rozszerzonych atrybutów pliku:
user.checksum
user.upload_user
user.upload_date
user.path
user.comment
Pierwszy przykład używany jest do przechowywania sum kontrolnych danego pliku – może się przydać w celu weryfikacji, czy nie została na nim dokonana żadna zmiana. Drugi wymienia użytkownika źródłowego, który może być użyteczny w przypadku, gdy nasza aplikacja ma ograniczać dostęp dla wirtualnych użytkowników niezależnie od praw dostępu na poziomie systemu plików. Trzeci zapisuje dokładną datę, kiedy dany plik został przesłany na nasz serwer. Czwarty zapisuje ścieżkę dostępu, w której został zapisany dany plik. A piątym przykładem jest komentarz ogólnego przeznaczenia. Z tych kilku przykładów widać, że można utworzyć bardzo użyteczne metadane pomagające w różnego rodzaju operacjach na plikach. Tyle z teorii.
Narzędzia do obsługi rozszerzonych atrybutów plików:
Istnieje kilka bardzo przydatnych narzędzi do manipulowania (ustawiania, odczytywania) rozszerzonych atrybutów. Są one zazwyczaj zawarte w pakiecie attr, który wchodzi w wyposażenie większości dystrybucji. Na początku upewniamy się, że ten pakiet jest zainstalowany w systemie:
root@darkstar:~# apt-get install attr Reading package lists... Done Building dependency tree Reading state information... Done attr is already the newest version. 0 to upgrade, 0 to newly install, 0 to remove and 0 not to upgrade.
Drugą rzeczą, którą należy sprawdzić jest to, czy nasz system plików, który zamierzamy używać z rozszerzonymi atrybutami, jest montowany z opcją ext_attr
(ext4):
root@darkstar:~# tune2fs -l /dev/sda1 | grep features Filesystem features: has_journal ext_attr resize_inode dir_index
Zakładając, że spełniliśmy wszystkie te kryteria (nie są zbyt trudne), możemy teraz zacząć używać rozszerzonych atrybutów. Zróbmy kilka testów, aby pokazać narzędzia i co możemy z nimi zrobić. Zacznijmy od utworzenia prostego pliku zawierające przykładowe dane:
agresor@darkstar:~$ echo "Just a whisper. I hear it in my ghost." > xfx.txt agresor@darkstar:~$ setfattr -n user.comment -v "Ghost in the Shell" xfx.txt
Polecenie setfattr ustawia rozszerzony atrybut dla pliku xfx.txt o nazwie (-n
) "user.comment"
. Po opcji "-v"
następuje wartość atrybutu. Ostatnią opcją polecenia jest nazwa pliku. Pozyskanie listy atrybutów osiągniemy przy użyciu prostego polecenia getfattr:
agresor@stardust:~$ getfattr xfx.txt # file: xfx.txt user.comment
Zauważmy, że polecenie to zawiera tylko listę rozszerzonych atrybutów określonych plików, a nie wartości atrybutów. Dodatkowo – wymienione zostały tylko atrybuty “użytkownika”, ponieważ standardową maską dla polecenia jest "^user\\."
. Jeśli uruchomimy polecenie z nadpisaniem standardowej maski to pojawią się również atrybuty systemu lub zabezpieczeń, o ile takie zostały nałożone:
agresor@stardust:~$ getfattr -m "-" xfx.txt # file: xfx.txt system.posix_acl_access user.comment
Aby zobaczyć wartości atrybutów, należy użyć następującego polecenia:
agresor@stardust:~$ getfattr -n user.comment xfx.txt # file: xfx.txt user.comment="Ghost in the Shell"
Dzięki opcji "-n"
zostanie wyświetlona wartość podanej przestrzeni nazw. Jeśli chcemy usunąć atrybut powinniśmy użyć polecenia setfattr z opcją "-x"
:
agresor@stardust:~$ setfattr -x user.comment xfx.txt agresor@stardust:~$ getfattr -n user.comment xfx.txt xfx.txt: user.comment: No such attribute
Podsumowanie:
Rozszerzone atrybuty plików mogą zostać użyte w celu wzbogacenia plików o dodatkowe metadane. To od użytkownika zależy ich wykorzystanie, ponieważ rozumie on znaczenie swoich danych. Dają olbrzymią elastyczność, a utworzenie prostych skryptów do kwerendy lub przeszukiwania metadanych nie powinno być trudne. Dzięki temu możemy znacznie łatwiej monitorować stan naszych danych.
Więcej informacji: Extended file attributes, Extended attributes: the good, the not so good, the bad