Laboratorium przedmiotu Urz ˛adzenia Zewn˛etrzne i

Transkrypt

Laboratorium przedmiotu Urz ˛adzenia Zewn˛etrzne i
Laboratorium przedmiotu Urzadzenia
˛
Zewne˛ trzne i Interfejsy
Instrukcja do ćwiczenia numer 3
„Pamieci
˛ masowe i systemy plików”
Instytut Informatyki Politechniki Warszawskiej
Tomasz Łukaszewski, Tomasz Mierzejewski, Michał Garcarz
9 czerwca 2003 roku
Streszczenie
Celem ćwiczenia jest zapoznanie si˛e z zasadami dost˛epu do pami˛eci masowej i budowa˛ systemu plików. Ćwiczenie polega na napisaniu programu realizujacego
˛
zadanie zwiazane
˛
z obsługa˛ systemu plików. Ćwiczenie jest realizowane w środowisku
GNU/Linux.
1
Spis treści
1 Wstep
˛
3
2 Urzadzenia
˛
blokowe w systemie Linux
2.1 Organizacja urzadze
˛
ń blokowych . . . . . .
2.2 Dost˛ep do urzadze
˛
ń blokowych . . . . . . .
2.3 Organizacja danych na dyskach twardych .
2.4 Płyty kompaktowe . . . . . . . . . . . . . . .
2.4.1 Układ danych na płycie kompaktowej
2.4.2 Systemy plików . . . . . . . . . . . . .
2.4.3 Kolorowe ksia˛żki . . . . . . . . . . . .
2.4.4 Interfejs programisty . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
3
3
3
4
4
5
5
6
6
3 Obsługa plików i systemów plików w Linuksie
3.1 Drzewo katalogów i nazwy ścieżek . . . . . .
3.2 Poziom jadra
˛
systemu . . . . . . . . . . . . .
3.3 Interfejs programisty — funkcje systemowe
3.4 Warstwa VFS sysytemu Linux . . . . . . . .
3.5 Typy plików . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
6
6
6
7
7
9
4 Przykładowy system plików — system
4.1 Struktura systemu plików . . . . .
4.1.1 Układ danych . . . . . . . . .
4.1.2 Superblok . . . . . . . . . . .
4.1.3 Grupa bloków . . . . . . . . .
4.1.4 I-w˛ezeł . . . . . . . . . . . . .
4.1.5 Alokacja bloków . . . . . . .
4.1.6 Katalog . . . . . . . . . . . .
4.2 Programy narz˛edziowe . . . . . . . .
4.3 Interfejs programisty . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
10
10
10
11
11
12
12
13
13
14
ext2
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
5 Literatura
.
.
.
.
.
.
.
.
.
14
2
1
Wstep
˛
Niniejsza instrukcja zawiera informacje niezb˛edne do wykonania ćwiczenia numer 3 na
laboratorium przedmiotu UZINT. Wraz z instrukcja˛ dost˛epne sa˛ kody źródłowe przykładowych programów, które moga˛ być pomocne w praktycznym wykorzystaniu wiedzy
zawartej w tej instrukcji.
Na system operacyjny dla tego ćwiczenia wybrany został system Linux. Jadro
˛
tego
systemu oraz biblioteka GNU libc udost˛epniaja˛ interfejs programisty bardzo zbliżony do
tego, który jest obecny w systemach wywodzacych
˛
si˛e z klasycznego AT&T UNIX.
Pierwsza cz˛eść instrukcji opisuje w jaki sposób urzadzenia
˛
pami˛eci masowej sa˛ obsługiwane w systemie Linux. Opisana jest w niej również organizacja danych dla przykładowych nośników danych: dysków twardych oraz płyt CD. Druga cz˛eść jest poświ˛econa
obsłudze systemów plików w jadrze
˛
systemu oraz interfejsowi programisty służacemu
˛
odwoływaniu si˛e do plików. Trzecia cz˛eść zawiera opis systemu plików ext2, szeroko
stosowanego w systemach pracujacych
˛
w oparciu o jadro
˛
Linux.
2
Urzadzenia
˛
blokowe w systemie Linux
2.1 Organizacja urzadze
˛
ń blokowych
Urzadzenie
˛
blokowe jest wirtualna˛ reprezentacja˛ urzadzenia
˛
pami˛eci masowej. W systemie Linux każde z urzadze
˛
ń blokowych jest traktowane jako określonego rozmiaru tablica sektorów o dost˛epie swobodnym (tzn. można odczytywać i ewentualnie zapisywać
poszczególne sektory urzadzenia
˛
w dowolnej kolejności).
Poniżej przedstawione jest krótkie i niepełne zestawienie urzadze
˛
ń, które w systemie
operacyjnym Linux sa˛ reprezentowane jako urzadzenia
˛
blokowe:
• dyski twarde oraz partycje dysków twardych
• urzadzenia
˛
typu RAID i woluminy logiczne — wirtualne urzadzenia
˛
składajace
˛ si˛e
z wielu dysków lub partycji, traktowanych jako jeden spójny obszar
• nap˛edy wymiennych nośników magnetycznych
• nap˛edy nośników optycznych (płyty CD i DVD) i magnetooptycznych
• ramdyski — wydzielone obrzary pami˛eci operacyjnej używane do tymczasowego
przechowywania danych
• karty pami˛eci typu flash
• urzadzenia
˛
loopback — wirtualne urzadzenia
˛
reprezentujace
˛ pliki przez interfejs
urzadze
˛
ń blokowych
• pami˛eci podłaczonych
˛
do komputera urzadze
˛
ń przenośnych, np. palmtopów
3
2.2 Dostep
˛ do urzadze
˛
ń blokowych
Znajdujace
˛ si˛e w jadrze
˛
systemu sterowniki pozwalaja˛ na odwoływanie si˛e do urzadze
˛
ń
blokowych przy użyciu jednolitego interfejsu. Z punktu widzenia jadra
˛
systemu Linux
urzadzenie
˛
blokowe (a właściwie jego sterownik) to kilka prostych funkcji służacych
˛
do
inicjalizowania urzadzenia
˛
i badania jego statusu oraz kolejka typu request_queue.
Powyżej sterowników w jadrze
˛
znajduje si˛e warstwa urzadze
˛
ń blokowych, która umożliwia bezpośrednie wykonywanie operacji typu odczyt i zapis. Wykonanie takiej operacji
sprowadza si˛e do nast˛epujacej
˛
sekwencji czynności:
• zamień wyrażona˛ w postaci przesuni˛ecia wzgl˛edem poczatku
˛
urzadzenia
˛
aktualna˛
pozycj˛e urzadzenia
˛
na numer sektora
• dodaj do kolejki request_queue żadanie
˛
odczytu badź
˛ zapisu
• zaśnij oczekujac
˛ na zakończenie przetwarzania tego żadania
˛
• przekaż wywołujacemu
˛
rezultat żadania,
˛
a w przypadku żadania
˛
odczytu również
adres bloku pami˛eci buforowej, w którym znajduja˛ si˛e odczytane dane
Z usług warstwy urzadze
˛
ń blokowych korzystaja˛ moduły odpowiedzialne za obsług˛e
systemów plików. W systemach klasy UNIX znajduje si˛e również mechanizm umożliwiajacy
˛ użytkownikom bezpośrednie odwoływanie si˛e do urzadze
˛
ń blokowych. Sa˛ to tzw.
pliki urzadze
˛
ń blokowych. Sa˛ one omówione nieco dokładniej w sekcji Warstwa VFS.
2.3 Organizacja danych na dyskach twardych
Dysk twardy składa si˛e z sektorów wielkości 512 bajtów. Sektor jest najmniejsza˛ jednostka,
˛ jaka˛ dysk może odczytać lub zapisać, wi˛ec argumentami dla rozkazów odczytu
i zapisu z/do dysku sa˛ numer pierwszego sektora bloku danych (czyli jego adres dyskowy) oraz liczba sektorów do przesłania.
Dysk twardy zazwyczaj dzielony jest na partycje. Partycja to ciagły
˛
obszar dysku,
który może być traktowany jako osobne urzadzenie.
˛
Adresy (położenie) poszczególnych
partycji oraz ich rozmiary przechowywane sa˛ w tablicy partycji (partition table, disklabel) znajdujacej
˛
si˛e najcz˛eściej w pierwszych sektorach dysku. Sposób organizacji danych wewnatrz
˛ partycji zależy od rodzaju systemu plików, który został na niej utworzony.
W komputerach klasy IBM PC format tablicy partycji został ustalony, kiedy powstały
pierwsze wersje systemu MS-DOS obsługujace
˛ dyski twarde. Dysk może si˛e składać
z czterech partycji podstawowych. Każda partycja, poza swoim położeniem i rozmiarem,
posiada również identyfikator typu określajacy format danych. Zazwyczaj jest to kod
przypisany konkretnemu systemowi plików, ale może to być również identyfikator tzw.
partycji rozszerzonej (partycja rozszerzona może zawierać kilka tzw. dysków logicznych,
traktowanych podobnie jak partycje podstawowe). Jedna z partycji podstawowych może
mieć też ustawiony znacznik aktywności informujacy
˛ program ładujacy,
˛
że zawiera ona
system operacyjny.
W pierwszym sektorze dysku twardego, przed tablica˛ partycji, znajduje si˛e mały program (zwany bootloaderem), wywoływany przez BIOS komputera w celu załadowania
systemu operacyjnego. Typowe działanie tego programu polega na wczytaniu z dysku
pierwszego sektora partycji oznaczonej jako aktywna i oddaniu mu sterowania.
4
2.4 Płyty kompaktowe
Historia płyty kompaktowej zaczyna si˛e w 1982 roku w laboratoriach firm Sony i Philips.
Specyfikacja Red Book określa fizyczne parametry płyt oraz format płyt CD-DA (Compact
Disc - Digital Audio). W roku 1984 powstała Yellow Book umożliwiajaca
˛ użycie CD jako
nośnika danych przeznaczonych dla komputerów.
Podstawowym formatem logicznym jest format CD-DA. Rozszerzeniami formatu dźwi˛ekowego sa˛ płyty CD-Text i CD-Graphics, mieszczace
˛ w specjalnych obszarach danych
np. tytuły nagranych utworów. Na potrzeby przechowywania danych wykorzystywanych
przez komputery powstała odmiana nazwana CD-ROM. Wśród płyt CD-ROM wyróżnić
można najpopularniejsze CD-Data, zawierajace
˛ dodatkowe kody kontrolne zapewniajace
˛
wyższe bezpieczeństwo zgromadzonych danych oraz CD-ROM XA stanowiace
˛ baz˛e dla
zastosowań multimedialnych takich jak Video CD, Photo CD, CD-i czy CD-Extra.
Pojemność płyty CD-DA (Digital Audio) wyznacza układ danych. Jeden blok (2352
bajty) zawiera 98 ramek. Do odtworzenia sekundy ścieżki dźwi˛ekowej z płyty odczytywane sa˛ 75 bloki. Standardowo płyta CD Audio zawiera do 74 minut 44 sekund muzyki.
Dane na płytach CD-ROM zgromadzone sa˛ w odpowiadajacym
˛
blokom sektorach.
Typ sektora to albo używany przez wi˛ekszość zastosowań komputerowych Mode 1, albo
Mode 2 w formacie Form 1 lub Form 2. Tryb Mode 1 oraz odmiana Mode 2 Form 1 różnia˛
si˛e tylko umiejscowieniem danych oraz obecnościa˛ w tym drugim subnagłówka, określajacego
˛
zawartość sektora. Pojemność do wykorzystania w każdym sektorze to 2048
bajtów. Mode 2 Form 2 rezygnuje z Error Correction Code na rzecz powi˛ekszenia pojemności użytecznej sektora do 2324 bajtów. Taki zabieg ma sens jedynie w przypadku
przechowywania danych w których przekłamania moga˛ być tolerowane, np. strumieni
wideo lub muzyki.
2.4.1
Układ danych na płycie kompaktowej
Dane zapisane na płytach chronione sa˛ przy użyciu kodu CIRC (Cross Interleaved ReedSolomon Code), dzi˛eki któremu możliwe jest używanie płyt nawet o porysowanej powierzchni. Informacje fizycznie zapisane na nośniku (pity i landy) to dane zapisane przy
użyciu modulacji EFM - osiem do czternastu, dodajacej
˛
jeszcze trzy bity.
Przestrzeń na płycie dziela˛ mi˛edzy soba,
˛ leżacy
˛ najbliżej środka płyty, Lead-in, czyli
obszar służacy
˛ do kalibracji lasera oraz synchronizacji, Lead-out zawierajacy
˛ „puste”
dane, oraz znajdujacy
˛ si˛e mi˛edzy nimi Program Area mieszczacy
˛ zapisane dane.
Dane zapisane w obszarze danych pogrupowane sa˛ w ścieżki (które moga˛ być dodatkowo podzielone na indeksy). Indeks zerowy jest używana˛ czasem na płytach CD-Audio
dwusekundowa˛ pauza˛ pomi˛edzy utworami. Informacje o długości ścieżek zapisane sa˛
w obszarze Lead-in (o numerze 0), w strukturze nazwanej TOC (Table of Contents).
Ścieżki numerowane sa˛ od 1 do 99, a obszar Lead-out ma numer 170 (AAh).
Płyty wielosesyjne zawieraja˛ zestaw Lead-in, Program, Lead-out dla każdej nagrywanej sesji. W przypadku płyt audio widoczna w typowych odtwarzaczach jest tylko
pierwsza sesja, reszta może zawierać dane przeznaczone do odczytu w czytniku komputera. Na płytach zawierajacych
˛
system plików każda kolejna sesja definiuje od nowa
położenie plików na nośniku. W ten sposób możliwe jest dodawanie nowych danych lub
ich modyfikacja poprzez nagranie nowej wersji pliku.
5
2.4.2
Systemy plików
Podstawowym systemem plików używanym na płytach CD-ROM jest ISO 9660, którego
podstawy zostały opracowane przez High Sierra Group. Ma on jednak sporo ograniczeń dotyczacych
˛
długości nazw plików oraz zestawu znaków, a także gł˛ebokości drzewa
katalogów. Pierwsza odmiana tego systemu (Level 1) wymaga, aby każdy plik był nagrany jako ciagły
˛
obszar danych na płycie, a nazewnictwo plików podlega restrykcjom
systemu MS-DOS. Level 2 pozwala na dowolność w nazwach plików, natomiast Level 3
zwalnia wszystkie ograniczenia poza gł˛ebokościa˛ drzewa katalogów. Spośród systemów
plików rozszerzajacych
˛
możliwości podstawowego ISO 9660 warto wymienić rozszerzenia
Rock Ridge — rozwiazanie
˛
uniksowe, Joliet opracowany na potrzeby rodziny systemów
Windows oraz system plików HFS (Macintosh Hierarchical File System).
2.4.3
Kolorowe ksia˛żki
Poszczególne kategorie płyt kompaktowych zostały opisane i wydane w postaci ksia˛żek
o różnych kolorach okładek:
• Red Book: CD-DA oraz specyfikacja fizyczna
• Yellow Book: CD-ROM
• Orange Book: - dyski magnetooptyczne, CD-R, wielosesyjność
• Blue Book: CD-Plus (płyty z dwoma sesjami: jedna˛ muzyczna˛ i jedna˛ z danymi)
• Green Book: CD-i (Compact Disc Interactive)
• White Book: VideoCD
2.4.4
Interfejs programisty
Interfejs C jest opisany w pliku /usr/src/linux/include/linux/cdrom.h. Wykorzystać
można wywołania ioctl() podajac
˛ komendy zdefiniowane w pliku cdrom.h, lub posłużyć si˛e
komenda˛ CDROM_PACKET_COMMAND przekazujac
˛ strukture˛ cdrom_generic_command.
3
Obsługa plików i systemów plików w Linuksie
3.1 Drzewo katalogów i nazwy ścieżek
Wi˛ekszość współczesnych systemów operacyjnych zarzadza
˛
przestrzenia˛ pami˛eci masowych przez tworzenie systemów plików. Najcz˛eściej stosowana˛ struktura˛ obrazujac
˛ a˛
logiczny układ plików jest drzewo katalogów. W systemach z rodziny UNIX katalog jest
specjalnym rodzajem pliku, który przechowuje informacje o innych plikach. Ponieważ
katalog może zawierać inne katalogi, to zbudować można drzewiasta˛ strukture˛ zwana˛
właśnie drzewem katalogów. Korzeniem tego drzewa jest katalog główny, oznaczany znakiem „/”. Pliki sa˛ identyfikowane przez unikalne w obre˛ bie jednego katalogu nazwy,
6
co pozwala na jednoznaczna˛ identyfikacj˛e każdego pliku w drzewie przez tzw. ścieżk˛e
dost˛epu.
Przykład: „/usr/bin/perl” oznacza plik o nazwie „perl” umieszczony w katalogu „bin”
bed
˛ acym
˛
podkatalogiem katalogu „usr”, który jest z kolei podkatalogiem katalogu głównego.
Systemy operacyjne różnia˛ si˛e podejściem do adresowania drzew katalogów znajduja˛
cych si˛e na różnych urzadzeniach
˛
pami˛eci masowych. Systemy firmy Microsoft przed
ścieżka˛ dost˛epu dodaja˛ jedna˛ litere˛ oznaczajac
˛ a˛ urzadzenie,
˛
na którym znajduje si˛e
dany plik. Systemy rodziny UNIX grupuja˛ wszystkie pliki w jednym drzewie katalogów.
Podczas inicjalizacji systemu operacyjnego katalog główny systemu plików znajdujacego
˛
si˛e na pewnym wyróżnionym urzadzeniu
˛
zostaje uznany za korzeń całego wirtualnego
drzewa katalogów. W czasie pracy systemu katalog główny innego systemu plików może
zostać zamontowany do innego katalogu znajdujacego
˛
si˛e już w głównym drzewie. Operacj˛e przeciwna˛ (odłaczenie
˛
takiego systemu plików) określa si˛e jako odmontowanie.
3.2 Poziom jadra
˛
systemu
Jednym z podstawowych zadań systemu operacyjnego jest zapewnienie procesom dost˛epu do urzadze
˛
ń wejścia/wyjścia. Kiedy powstawał system operacyjny UNIX, jego autorzy — Ken Thompson i Dennis Ritchie — zdecydowali, że każde urzadzenie
˛
do którego
odwoływać si˛e b˛eda˛ procesy działajace
˛ w systemie reprezentowane b˛edzie przez plik.
Przykład: do odtwarzania dźwieku
˛
nie istnieja˛ żadne dedykowane odwołania systemowe — osiaga
˛
sie˛ to zapisujac
˛ ciag
˛ próbek do pliku urzadzenia
˛
reprezentujacego
˛
karte˛
dźwiekow
˛
a.
˛
Aby zapewnić poprawne odwoływanie si˛e do plików jadro
˛
systemu musi przechowywać informacje o tych plikach, które sa˛ aktualnie używane przez działajace
˛ w systemie
procesy. Konieczne jest również zapewnienie właściwych zasad współużytkowania plików oraz ochrona plików przed niepożadanym
˛
dost˛epem.
3.3 Interfejs programisty — funkcje systemowe
Pierwsza˛ operacja,
˛ która˛ trzeba wykonać aby móc czytać z pliku lub do niego pisać jest
otwarcie. Służy do tego funkcja systemowa open():
int open(char *pathname, int flags, ...)
Argument pathname określa ścieżk˛e dost˛epu do pliku. Funkcja open() zwraca tzw. deskryptor pliku — liczb˛e całkowita˛ identyfikujac
˛ a˛ otwarty plik. Od tego momentu można
si˛e odwoływać za pomoca˛ innych funkcji systemowych:
int
int
int
int
int
read(int file_descriptor, void *buffer, int byte_count)
write(int file_descriptor, void *buffer, int byte_count)
lseek(int file_descriptor, int offset, int whence)
ftruncate(int file_descriptor, int length)
fstat(int file_descriptor, struct stat *st)
Po zakończeniu pracy z plikiem należy go zwolnić:
7
int close(int file_descriptor)
Istnieje jeszcze wiele funkcji służacych
˛
do wykonywania operacji na otwartych plikach
(lub deskryptorach plików), m.in. dup(), dup2(), fchmod(), fchown(), fcntl(), flock(), getdents(), ioctl(), readv(), writev(). Oddzielna˛ grup˛e stanowia˛ funkcje operujace
˛ bezpośrednio na plikach (nie wymagajace
˛ ich otwierania), np. link(), stat(), unlink(). Dokładne
opisy funkcji systemowych znaleźć można w sekcji numer 2 podre˛ cznika systemowego,
na przykład polecenie
man 2 fchmod
wyświetli opis funkcji systemowej fchmod().
3.4 Warstwa VFS sysytemu Linux
Warstwa VFS (Virtual Filesystem Switch) zajmuje si˛e przechowywaniem informacji o otwartych plikach, implementuje też podstawowe operacje zwiazane
˛
z obsługa˛ plików (na
przykład otwieranie). Wszystkie funkcje systemowe wymienione w poprzedniej cz˛eści instrukcji należa˛ do tej warstwy. Poniżej warstwy VFS znajduja˛ si˛e: warstwa urzadze
˛
ń
blokowych, warstwa urzadze
˛
ń znakowych oraz systemy plików. VFS przekierowuje ża˛
dania wykonania operacji na plikach do tych niższych warstw (do której konkretne — to
zależy od położenia pliku w głównym drzewie katalogów oraz typu pliku).
Podstawowa˛ jednostka˛ informacji o pliku w jadrze
˛
systemu Linux jest i-wezeł
˛
(inode).
I-w˛ezeł zawiera m.in.:
• rozmiar pliku w bajtach
• identyfikatory właściciela i grupy
• prawa dost˛epu do pliku
• atrybuty pliku (jego typ i pewne szczególne właściwości)
• identyfikator urzadzenia
˛
(którym może być plik, patrz nast˛epna sekcja)
• identyfikator urzadzenia,
˛
na którym znajduje si˛e plik
• czas utworzenia, ostatniej modyfikacji oraz ostatniego dost˛epu do pliku
• wskaźnik do struktury inode_operations
• wskaźnik do struktury file_operations
Dwa ostatnie pola sa˛ wypełniane przez system operacyjny w momencie otwierania pliku.
Zawieraja˛ one wskaźniki do funkcji wywoływanych przez warstw˛e VFS do wykonania
konkretnych operacji na pliku (np. odczytania jakiegoś jego fragmentu lub usuni˛ecia
go).
Aby lepiej zrozumieć działanie warstwy VFS prześledzimy przykładowy ciag
˛ operacji
wywołanych wykonaniem polecenia
cp /mnt/cdrom/README /tmp/README
8
Polecenie to utworzy kopi˛e pliku /mnt/cdrom/README w katalogu /tmp. Program zaczyna od otwarcia obu plików:
int source_file = open("/mnt/cdrom/README", O_RDONLY)
int dest_file = open("/tmp/README", O_WRONLY | O_CREAT)
A oto co w tej sytuacji robi jadro
˛
systemu:
• odnajduje i-w˛ezeł reprezentujacy
˛ katalog główny
• odczytuje zawartość tego katalogu do tymczasowego bufora przy pomocy funkcji
root_inode->file_operations->read()
• odnajduje plik odpowiadajacy
˛
nazwie „mnt” (b˛edacy
˛
katalogiem), sprawdza, czy
w tym katalogu jest zamontowany jakiś system plików — nie jest, wi˛ec otwiera
go (przygotowuje odpowiadajacy
˛ mu i-w˛ezeł)
• odczytuje zawartość katalogu do bufora
• odnajduje plik odpowiadajacy
˛ nazwie „cdrom” — plik istnieje i w dodatku jest punktem zamontowania innego systemu plików, wi˛ec jadro
˛
otwiera i-w˛ezeł głównego katalogu tego systemu plików
• odnajduje plik odpowiadajacy
˛ nazwie „README”, otwiera jego i-w˛ezeł i stwierdza,
że jest to zwykły plik
• ponownie odczytuje zawartość głównego katalogu do bufora (prawdopodobnie z bufora urzadze
˛
ń blokowych)
• odnajduje plik odpowiadajacy
˛
nazwie „tmp” (b˛edacy
˛
katalogiem), sprawdza, czy
w tym katalogu jest zamontowany jakiś system plików — nie jest, wi˛ec otwiera
go (przygotowuje odpowiadajacy
˛ mu i-w˛ezeł)
• odczytuje zawartość katalogu do bufora
• przeszukuje katalog, ale nie znajduje pliku o nazwie „README”
• ponieważ przy wywołaniu została podana opcja O_CREAT, to jadro
˛
przy pomocy
funkcji root_inode->inode_operations->create() zakłada nowy, pusty plik o nazwie
„/tmp/README” i otwiera go w trybie tylko do zapisu
Nast˛epnie program wykonuje cykl operacji odczytu i zapisu, np.:
char buffer[4096];
int bytes_read;
do {
bytes_read = read(source_file, buffer, 4096);
write(dest_file, buffer, bytes_read);
} while (bytes_read == 4096);
które jadro
˛
systemu przekłada na:
9
• odnalezienie i-w˛ezła odpowiadajacego
˛
deskryptorowi source_file i wywołanie dla niego funkcji file_operations->read()
• odnalezienie i-w˛ezła odpowiadajacego
˛
deskryptorowi dest_file i wywołanie dla niego
funkcji file_operations->write()
Na końcu program wywołuje funkcj˛e close() dla obu deskryptorów plików, a jadro
˛
zwalnia
wszystkie nieużywane już i-w˛ezły.
3.5 Typy plików
System Linux rozróżnia nast˛epujace
˛ typy plików:
• zwykłe pliki (regular files) — zawieraja˛ si˛e tu wszystkie pliki przechowujace
˛ jakiekolwiek dane, pliki programów, bibliotek itp.
• katalogi (directories) — zawieraja˛ informacje o innych plikach
• pliki urzadze
˛
ń blokowych — symbolizuja˛ podłaczone
˛
do systemu urzadzenia
˛
blokowe
• pliki urzadze
˛
ń znakowych — symbolizuja˛ podłaczone
˛
do systemu urzadzenia
˛
znakowe (przesyłajace
˛ strumienie bajtów)
• kolejki FIFO — wirtualne urzadzenia
˛
utrzymywane w jadrze
˛
systemu na potrzeby
komunikacji mi˛edzyprocesowej
• gniazda w dziedzinie UNIX — wirtualne interfejsy sieciowe służace
˛ do komunikacji
mi˛edzyprocesowej
• dowiazania
˛
symboliczne (symlinks) — pliki zawierajace
˛ nazwy innych plików (dokładniejszy opis w sekcji o systemie plików ext2)
Podczas przygotowywania struktury i-w˛ezła w pami˛eci jadro
˛
na podstawie typu pliku
ustawia wartość pól inode_operations oraz file_operations. Na przykład moduł obsługi
systemu plików ext2 przewiduje trzy różne zestawy funkcji typu inode_operations: jeden dla katalogów, drugi dla dowiaza
˛ ń symbolicznych i trzeci dla pozostałych plików.
Struktura file_operations() dla zwykłych plików b˛edzie wskazywała na zestaw funkcji wykonujacych
˛
operacje na ich fizycznej zawartości, natomiast dla kolejek, gniazd, urzadze
˛
ń
blokowych i znakowych b˛eda˛ to specjalne funkcje, dedykowane do obsługi konkretnego
typu urzadzenia.
˛
4
Przykładowy system plików — system ext2
Second Extended File System, zwany w skrócie ext2, jest systemem plików najcz˛eściej
używanym w systemie Linux. Został stworzony jako ulepszenie używanego wcześniej
systemu Extended File System. Podstawowa struktura obu systemów plików jest wzorowana na klasycznych rozwiazaniach
˛
stosowanych od lat w systemach operacyjnych
z rodziny UNIX.
10
4.1 Struktura systemu plików
Na wst˛epie warto zaznaczyć, że liczby dłuższe niż ośmiobitowe sa˛ w systemie ext zapisywane w kolejności little endian. Jest to konsekwencja˛ projektowania systemu plików
(i całego systemu operacyjnego) z przeznaczeniem dla komputerów opartych o mikroprocesory Intel x86.
4.1.1
Układ danych
Podstawowa˛ jednostka˛ alokacji w systemie ext2 jest blok. Adresowanie, przydział przestrzeni dla plików — wszystko odbywa si˛e w oparciu o bloki. Rozmiar bloku jest wielokrotnościa˛ rozmiaru sektora dyskowego (czyli 512 bajtów), wyst˛epuja˛ wi˛ec bloki wielkości 1KB, 2KB, 4KB. Rozmiar bloku dobierany jest w zależności od wielkości urzadzenia
˛
blokowego, na którym system plików jest zakładany. Adresy (czyli numery) bloków sa˛
wyrażane przy pomocy liczb 32-bitowych, co pozwala na utworzenie systemu plików
wielkości dziesiatek
˛
terabajatów (np. 16TB dla bloków 4KB).
Poza podziałem na bloki system ext2 dzieli cały obszar urzadzenia
˛
na grupy bloków.
Wszystkie prócz ostatniej grupy sa˛ jednakowej wielkości, każda z nich zawiera opis zaj˛etości poszczególnych bloków w obre˛ bie grupy. Podział taki został przyj˛ety ze wzgl˛edu
na szybkość dost˛epu do poszczególnych bloków pliku: jadro
˛
systemu przydziela wolne
bloki dla pliku w obre˛ bie jednej grupy bloków, wi˛ec czas zużywany na przemieszczanie
głowicy dysku pomi˛edzy blokami niezbyt odległymi od siebie jest niewielki.
Układ danych systemu Second Extended jest nast˛epujacy:
˛
• obszar na kod bootloadera (wielkość: 1024 bajty)
• superblok (wielkość: 1024 bajty)
• tablica deskryptorów grup bloków
• grupa bloków numer 1
• kopia zapasowa superbloku (opcjonalna)
• kopia zapasowa tablicy deskryptorów grup (opcjonalna)
• grupa bloków numer 2
• kopia zapasowa superbloku (opcjonalna)
• kopia zapasowa tablicy deskryptorów grup (opcjonalna)
• grupa bloków numer 3
• ...
Tablica deskryptorów oraz każda jej kopia zapasowa zawiera po jednej strukturze
group_desc dla każdej grupy bloków; struktura group_desc zawiera:
• adres bitmapy bloków
11
• adres bitmapy i-w˛ezłów
• adres tablicy i-w˛ezłów
• liczby wolnych bloków i wolnych i-w˛ezłów
• liczb˛e katalogów w danej grupie bloków
4.1.2
Superblok
Superblok jest struktura˛ opisujac
˛ a˛ podstawowa˛ strukture˛ systemu plików. Informacje
tam przechowywane sa˛ tak istotne, że zazwyczaj przechowuje si˛e kilka lub kilkanaście
kopii superbloku położonych w różnych miejscach (zapobiega to przypadkowemu zamazaniu wszystkich jednocześnie). Informacje przechowywanie w superbloku to m.in.:
• całkowita liczba bloków oraz liczba wolnych bloków
• całkowita liczba i-w˛ezłów oraz liczba wolnych i-w˛ezłów
• adres (numer) pierwszego bloku danych
• liczba bloków i i-w˛ezłów w jednej grupie bloków
• czas ostatniego sprawdzenia, liczba montowań od tamtego czasu
• numer wersji i identyfikator systemu operacyjnego
4.1.3
Grupa bloków
Każda grupa bloków rozpoczyna si˛e bitmapa˛ bloków, zaraz po niej nast˛epuja˛ bitmapa
i-w˛ezłów i tablica i-w˛ezłów, reszta to bloki danych. Bitmapy bloków i i-w˛ezłów sa˛ wielkości jednego bloku. Bitmapa bloków zawiera jeden bit dla każdego bloku danych w tej
grupie, który jest równy 0 dla bloków wolnych i 1 dla bloków zaj˛etych. Bitmapa i-w˛ezłów
w identyczny sposób przechowuje informacj˛e o zaj˛etości pozycji w tablicy i-w˛ezłów.
Przykład: najmniej znaczacy
˛ bit bajtu numer 0 niesie informacje˛ o zajeto
˛ ści bloku numer 0; najmniej znaczacy
˛ bit bajtu numer 1 niesie informacje˛ o zajeto
˛ ści bloku numer 8.
Z ograniczenia rozmiaru bitmapy bloków wynika maksymalny rozmiar grupy bloków.
Przykład: jeśli bloki maja˛ wielkość 4KB, to jedna grupa bloków może zawierać maksymalnie 4096 × 8 = 32768 bloków, czyli 128 MB.
Budowa tablicy i-w˛ezłów nie wymaga wyjaśniania — jest to po prostu ciag struktur
inode zapisanych jedna po drugiej. Należy jedynie wspomnieć, że pewna liczba i-w˛ezłów
jest zarezerwowana i reprezentuje specjalne obszary systemu plików. Liczba ta może być
różna w zależności od wersji systemu ext2. Najważniejsze z tych i-w˛ezłów opisuja:
˛
• uszkodzone bloki — i-w˛ezeł numer 1
• główny katalog — i-w˛ezeł numer 2
• obszar bootloadera — i-w˛ezeł numer 5
• katalog usuni˛etych plików — i-w˛ezeł numer 6
12
4.1.4
I-wezeł
˛
I-w˛ezeł (inode) jest struktura˛ danych opisujac
˛ a˛ jeden plik. Wobec charakterystycznej
dla wszystkich uniksowych systemów plików możliwości swobodnego operowania na nazwach plików, tzn. dodawania nowych nazw dla istniejacego
˛
pliku czy usuwania aktualnych nazw, to właśnie i-w˛ezeł jest jednoznacznie skojarzony z plikiem. Innymi słowami,
i-w˛ezeł jest konieczna˛ (tzn. nie ma pliku bez i-w˛ezła) i dostateczna˛ (czyli może istnieć
plik składajacy
˛ si˛e wyłacznie
˛
z i-w˛ezła) reprezentacja˛ pliku w systemie ext2.
Struktura inode zawiera nast˛epujace
˛ pola:
• mode — rodzaj pliku i prawa dost˛epu
• uid — identyfikator właściciela
• size — rozmiar pliku w bajtach
• atime, ctime, mtime, dtime — czasy ostatniego dost˛epu, utworzenia pliku, ostatniej
modyfikacji i usuni˛ecia pliku
• gid — identyfikator grupy
• links_count — liczba odwołań do tego i-w˛ezła
• blocks — liczba zarezerwowanych dla danego pliku bloków
• flags — dodatkowe informacje o pliku
• osdl — wartość zależna od systemu operacyjnego
• block[15] — adresy poszczególnych bloków pliku
• generation — numer wersji pliku
• file_acl — numer bloku zawierajacego
˛
list˛e kontroli dost˛epu
• dir_acl — pole wykorzystywane do pami˛etania starszych 32 bitów rozmiaru pliku
• faddr — położenie ostatniego fragmentu pliku
• osd2 — pole o zawartości zależnej od systemu operacyjnego
Kilka pól tej struktury wymaga osobnego wyjaśnienia. Wartość blocks jest wyrażona nie
w blokach systemu ext2, ale w sektorach dyskowych wielkości 512 bajtów! Interpretacja
wartości pól mode i flags odbywa si˛e przy pomocy odpowiednio zdefiniowanych masek
bitowych, opisanych np. w plikach nagłówkowych jadra
˛
Linuksa. Istnienie pola faddr
pozwala na alokacj˛e przestrzeni pod ostatni blok pliku (mniejszy od rozmiaru pełnego
bloku) we fragmentach — jednostkach mniejszych od bloku. System ext2 przewiduje
możliwość operowania na fragmentach, jednak w praktyce ta możliwość nie jest wykorzystywana.
13
4.1.5
Alokacja bloków
Numery bloków przydzielonych do danego pliku sa˛ zapisywane w strukturze i-w˛ezła.
Pierwsze 12 elementów tablicy block zawiera adresy pierwszych 12-stu bloków danego
pliku. Kolejny element tablicy block to tzw. pośredni numer bloku — blok numer
block[13] zawiera numery kolejnych bloków przydzielonych do tego pliku. Nest˛epny element, block[14], to tzw. podwójny pośredni numer bloku — blok numer block[14] zawiera
numery pośrednich numerów bloków. Wreszcie block[15] jest potrójnym pośrednim numerem bloku, czyli zawiera numery bloków podwójnych pośrednich.
Taki sposób zapisu umożliwia łatwe przydzielanie nowych bloków bez niepotrzebnego
zwi˛ekszania rozmiaru struktury inode. Wynika z niego również maksymalny rozmiar
jednego pliku (b to rozmiar bloku w bajtach):
b
b ∗ 12 + +
4
2
b
4
+
3 b
4
Bardzo istotna˛ cecha˛ systemu ext2 jest możliwość nieprzydzielania fizycznych bloków
dla pliku do chwili, kiedy nie zostanie do nich nic zapisane. Dla takich bloków funkcja
read() zwraca bloki bajtów o wartości 0. Ta cecha (zwana sparse files) jest szczególnie przydatna dla programów tworzacych
˛
duże pliki z danymi rozrzuconymi w dużych
odst˛epach od siebie (np. systemów zarzadzania
˛
bazami danych).
Należy również wspomnieć o alternatywnym sposobie alokacji przestrzeni dla pliku.
Bardzo małe pliki (do 64 bajtów) moga˛ być przechowywane bezpośrednio w strukturze
inode, w miejscu pola block[]. Aktualnie w ten sposób przechowywana bywa zawartość dowiaza
˛ ń symbolicznych, co przyspiesza dost˛ep do właściwego pliku wskazywanego
przez dowiazanie.
˛
4.1.6
Katalog
Podobnie jak w klasycznych uniksowych systemach plików katalog jest ciagiem
˛
przyporzadkowa
˛
ń nazw plików do numerów i-w˛ezłów. Dokładny format jednej pozycji katalogu
jest nastepujacy:
˛
• numer i-w˛ezła (4 bajty), 0 dla pozycji nieużywanej
• przesuni˛ecie nast˛epnej pozycji (2 bajty)
• długość nazwy pliku (1 bajt)
• typ pliku (1 bajt)
• nazwa pliku
Pole typu pliku pojawiło si˛e w późniejszych wersjach systemu ext2 — wcześniej długość
nazwy pliku była przechowywana na 2 bajtach.
Obowiazkowo
˛
pierwsze dwie pozycje katalogu to „.” wskazujaca
˛ na samego siebie oraz
„..” wskazujaca
˛ na katalog nadrz˛edny (dla katalogu głównego na samego siebie).
14
4.2 Programy narzedziowe
˛
Standardowym wyposażeniem dystrybucji systemu Linux jest pakiet e2fsprogs zawierajacy
˛ narz˛edzia operujace
˛ bezpośrednio na urzadzeniach
˛
z założonym systemem plików
Second Extended. W skład tego pakietu wchodza˛ m.in. nast˛epujace
˛ programy:
• mke2fs służacy
˛ do zakładania systemu plików ext2
• e2fsck sprawdzajacy
˛ poprawność struktury systemu plików
• tune2fs do modyfikowania parametrów systemu plików
• debugfs służacy
˛ do bezpośredniego operowania na superbloku, i-w˛ezłach i katalogach systemu plików (np. przy naprawie uszkodzeń czy odzyskiwaniu skasowanych
plików)
• lsattr i chattr do wyświetlania i modyfikowania atrybutów plików w systemie Second
Extended
Najwi˛eksze możliwości ma program debugfs — przy jego pomocy można dowiedzieć si˛e
jak wyglada
˛ struktura danych systemu ext2.
4.3 Interfejs programisty
Wymienione w poprzednim punkcie programy pakietu e2fsprogs odwołuja˛ si˛e do urza˛
dzeń blokowych bezpośrednio, poprzez pliki urzadze
˛
ń. Wykorzystuja˛ do tego celu zawarta˛ w pakiecie bibliotek˛e libext2fs. Biblioteka ta instalowana jest wraz z kompletem
plików nagłówkowych (w katalogu /usr/include/ext2fs), które zawieraja˛ kompletne definicje struktur danych systemu Second Extended. Wykorzystanie tych plików w programach przygotowywanych w ramach laboratorium pozwoli na zaoszcz˛edzenie czasu przy
żmudnym kopiowaniu tych definicji z plików nagłówkowych jadra
˛
systemu Linux.
Istotna˛ cz˛eścia˛ materiałów przygotowujacych
˛
do laboratorium jest program demonstracyjny operujacy
˛ na systemie plików ext2. Analiza kodu źródłowego może dostarczyć
brakujacej
˛
wiedzy co do metod bezpośredniego operowania na strukturach systemu plików.
5
Literatura
System operacyjny Linux, a wi˛ec także jego system plików Second Extended, podlega
szybkiej ewolucji, co utrudnia znalezienie aktualnej dokumentacji i opisów systemu
w postaci drukowanej. Najaktualniejsze informacje dołaczone
˛
sa˛ do kodów źródłowych
systemu; warto również zwrócić uwag˛e na ukazujace
˛ si˛e czasami artykuły na temat
planowanych dróg rozwoju samego systemu lub jego cz˛eści takich jak systemy plików.
Godny polecenia jest również internetowy serwis The Linux Documentation Project pod
adresem http://www.tldp.org zawierajacy
˛ m.in. przewodniki dla osób chcacych
˛
poznać
konkretne aspekty budowy jadra
˛
systemu Linux:
• Linux Kernel 2.4 Internals
http://www.tldp.org/LDP/lki/index.html
15
• The Linux Kernel Hackers’ Guide
http://www.tldp.org/LDP/khg/HyperNews/get/khg.html
• The Linux Kernel Module Programming Guide
http://www.tldp.org/LDP/lkmpg/index.html
• The Linux Programmer’s Guide
http://www.tldp.org/LDP/lpg/index.html
Dobrym źródłem informacji dla programistów piszacych
˛
programy dla systemu Linux jest
podre˛ cznik systemowy wywoływany poleceniem man oraz ogromna liczba dost˛epnych
w sieci Internet programów z otwartymi kodami źródłowymi.
16