System plików jest jednym z kluczowych elementów każdego systemu operacyjnego. Dostępnych systemów plików jest sporo, również na samego linuksa jest ich niemało. Na bardzo ogólnym poziomie możemy je podzielić na dwie grupy:
Aby zobaczyć systemy plików wspierane przez jądro systemu, należy wydać polecenie:
# cat /proc/filesystems
VFS to warstwa abstrakcji pomiędzy programem, a konkretnym systemem plików, która zapewnia, że program operuje na plikach zawsze w taki sam sposób niezależnie na jakim systemem plików operuje. W szczególności dostęp do uprawnień zawsze jest taki sam, nawet na systemach plików, które ich nie oferują (np. FAT). Strukturę VFS można wyrazić następującym obrazkiem:
Przestrzeń dyskowa systemu pliku jest podzielona na bloki, wszystkie tego samego rozmiaru, np. 1024B, 2048B lub 4096B (rozmiar bloku jest ustalany przy tworzeniu systemu plików i nie może być potem zmieniony). Systemy plików o klasycznym formacie, w tym i ext2, mają dane ułożone w listę bloków tego samego rozmiaru. Poprzedzona boot sectorem lista ta jest podzielona na grupy bloków (w grupie jest 32768 bloków), gdzie grupa bloków ma następujące składowe: superblock, group descriptor, block bitmap, i-node bitmap, i-node table, data blocks.
Strukturę systemu plików można przedstawić następująco:
Boot Sector | Block Group 1 | Block Group 2 | ... | Block Group N |
a strukturę pojedynczej grupy bloków następująco:
Superblock | Group Descriptor | Block Bitmap | Inode Bitmap | Inode Table | Data Blocks |
Znaczenie poszczególnych składowych jest następujące:
Do tej pory wielokrotnie pojawiło się pojęcie i-node. Dalej omówimy zarówno to pojęcie jak i inne główne elementy wyższego poziomu:
numer i-node | rozmiar pliku | długość nazwy | nazwa pliku |
i1 | 16 | 05 | file1 |
i2 | 40 | 14 | long_file_name |
i3 | 12 | 02 | f2 |
Ogólne założenia systemu ReiserFS są podobne do tych w ext2, jednak ReiserFS uchodzi za system lepszy dla małych plików, no i jest wyposażony w journaling. Gdzie tkwi przewaga tego systemu plików nad ext2?
W systemie plików ext2 o blokach rozmiaru 1024, plik o rozmiarze 8195 będzie zajmował 8 pełnych bloków i jeden blok z 3 bajtami. Niestety blok z trzema bajtami jest już zajęty i pozostałem 1021 bajty są zmarnowane. Ponieważ rzadko się zdarza, żeby rozmiary plików były wielokrotnościami, obliczono, że średnio strata wynosi 11%. W skrajnym wypadku może wynosić nawet ok. 50% (np. dla plików rozmiaru 1025). W ReiserFS w ramach bloku może być zapisanych więcej plików i stąd straty miejsca są istotnie mniejsze.
Drugą zaletą ReiserFS jest fakt, że bloki danych są pamiętane w zbalansowanym drzewie, przez co jest do nich szybszy dostęp. Niestety pojawia się koszt utrzymania drzewa zbalansowanego.
Do zarządzania partycjami mamy programy YaST i fdisk. Oczywiście YaST jest ładny i kolorowy, a fdisk jest brzydki i czarnobiały. Niemniej jednak w jednym i drugim da się wykonać większość zadań, a w fdisku jeszcze więcej. Warto pamiętać, że jak już utworzymy nową tablicę partycji w fdisk, to żeby została ona załadowana prze jądro systemu bez konieczności restartu, wydajemy polecenie
# partprobe
Do tworzenia systemów plików możemy ponownie wykorzystać YaST, ale możemy też zrobić to z wiersza poleceń. Do tworzenia systemu plików z wiersza poleceń mamy ogólne poleceni mkfs, które po podaniu opcji -t określające typ tworzonego systemu plików, uruchamia jedno z docelowych poleceń mkfs.bfs, mkfs.ext2, mkfs.jfs, mkfs.msdos, mkfs.vfat, mkfs.cramfs, mkfs.ext3, mkfs.minix, mkfs.reiserfs, mkfs.xfs. Najczęście spotykane systemy plików to ext3 i reiserfs. Tworzymy je następująco:
# mkfs -t ext3 /dev/sda3 # mkfs -t reiserfs /dev/sda4
Przy tworzeniu ext3 możemy dodakowo podać opcje
Jak już mamy utworzony system plików, możemy go podłączyć, czyli podmontować. Służy do tego polecenie mount, dualne, czyli od odmontowania to umount. Podstawowe składnie to:
mount [-t systemplikow] [-o opcje] urządzenie katalog umount { urządzenie | katalog }
Jeśli chcemy zobaczyć aktulnie podmontowane systemy plików, wydajemy polecenie
# mount
Ewentualnie możemy też zajrzeć do plików /etc/mtab lub /proc/mounts (w przypadku konfliktu, ten drugi jest bardziej wiarygodny).
Konfiguracja montowania znajduje się w pliku /etc/fstab. Każdy wiersz określa konfigurację montowania jednego systemu plików i kolejne kolumny takiego wiersza mają następujące znaczenie:
Przy podłączaniu systemu pliku można podać szereg opcji. Poniższe opcje można podawać zarówno w pliku /etc/fstab, jak i przy bezpośrednim wywoływaniu polecenia mount
Niektóre opcje mają sens tylko w plku /etc/fstab
Dalej przedstawimy kilka użytecznych narzędzi w walce z systemami plików.
df
Wyświetla informacje o podmontowanych partycjach, rodzaju partycji, zużyciu miejsca, itp.
Podstawowa składnia:
df [opcje] [katalog|plik ...]
Wybrane opcje
Przykładowe użycia
df -hT
wyświetla podmontowane systemy plików wraz nagłówkiem i informacją o typie danego systemu
plików
df / .
wyświetla podstawowe informacje o partycjach głównej i w bieżącej ścieżce
du
Wyświetla informacje o zużyciu miejsca przez pliki i katalogi.
Podstawowa składnia
du [opcje] [katalog|plik ...]
Wybrane opcje
Przykładowe użycia
du -hs
podaje zajętość bieżącego katalogu
du -cbs /bin /home
podaje dokładną zajętość katalogów /bin i /home oraz ile zajmują w sumie
lsof
Wyświetla listę otwartych plików wraz poleceniem, które używa danego pliku i innymi informacjami.
Podstawowa składnia:
lsof [opcje]
Wybrane opcje:
Przykładowe użycia:
lsof -u gucio,kulfon
na liście będą pliki otwarte przez użytkowników gucio i kulfon
lsof -c b
na liście będą pliki o nazwa na literę b
fuser
Wyświetla PID-y procesów używających danego pliku lub systemu plików, potrafi także zabijać znalezione procesu, lub ogólniej, wysyłać do nich sygnały. Drukując PID-y, dodatkowo obok każdego może się pojawić kombinacja liter. Ich znaczenie jest następujące:
Podstawowa składnia
fuser [opcje] plik_lub_katalog ...
Wybrane opcje:
Przykładowe użycia:
fuser -m /home
lista procesów blokujących partycję /home. Przydatne, jeśli np. nie udaje nam się jej odmontować.
fsck
Jest to narzędzie do sprawdzania spójności systemu plików. Tak naprawdę fsck jest poleceniem pośrednim, które wywołuje docelowe polecenie sprawdzania już konkretnego systemu plików: fsck.ext2, fsck.jfs, fsck.msdos, fsck.vfat, fsck.cramfs, fsck.ext3, fsck.minix, fsck.reiserfs, fsck.xfs. Łatwo sprawdzić, że przypadku systemu plików ext2 i ext3 do sprawdzania mamy polecenia
/sbin/e2fsck /sbin/fsck.ext2 /sbin/fsck.ext3które są identyczne. Podobnie jest w przypadku systemu plików ReiserFS. Tutaj mamy 2 identyczne programy:
/sbin/fsck.reiserfs /sbin/reiserfsck
Najprostsze użycie polecenia to np. po prostu
# fsck /dev/sda2
Program sam wywoła odpowiednie narzędzie docelowe. Wywołanie fsck.ext3 lub fsck.reiserfs może być istotne, jeśli chcemy przekazać opcje specyficzne dla konkretnego systemu plików (chociaż tak naprawdę przez fsck też to możemy zrobić).
dumpe2fs
Pokazuje zawartość superbloku oraz informacje o grupach bloków, w tym również o kopiach superbloków. W przypadku uszkodzenia pierwszego superbloku, można tym poleceniem odtworzyć superblok z jednej z kopii. Przykładowo:
e2fsck -f -b 32768 /dev/hda1
tune2fs, reiserfstune
Zmiana parametrów partycji ext2/3 i ReiserFS
resize2fs, resize_reiserfs
Zmiana rozmiaru partycji ext2/3 i ReiserFS. Ciekawe, że w przypadku partycji reiserfs, zmianę rozmiaru można wykonać online, tzn. na podmontowanej i działającej partycji.