Wprowadzenie do urządzeń blokowych
Rzućmy okiem na aspekty Gentoo Linux oraz ogólnie Linuksa związane z dyskami. Omówimy systemy plików, partycje oraz urządzenia blokowe. Następnie opiszemy proces podziału twardego dysku tak, aby jak najlepiej wykorzystać dostępne miejsce.
Zaczniemy od omówienia urządzeń blokowych. Najpopularniejszym z nich prawdopodobnie jest /dev/sda reprezentujący w Linuksie pierwszy napęd. Napędy SATA i SCSI otrzymują nazwy z rodziny/dev/sd*. Dzięki libata, nawet stare napędy IDE są nazywane /dev/sd*. Urządzenie to dawniej nazywało się /dev/hda.
Urządzenia blokowe stanowią abstrakcyjny interfejs dysków. Programy użytkownika mogą z nich korzystać nie martwiąc się o to czy napędy są typu IDE, SCSI czy jakiegoś innego. Przechowywane dane adresuje się jako ciąg 512-bajtowych bloków.
Partycje
Teoretycznie przeznaczenie na system całego dysku jest możliwe, zazwyczaj nie jest to jednak zbyt dobre rozwiązanie. Zamiast tego dzielimy napęd na mniejsze i dużo łatwiejsze w zarządzaniu urządzenia blokowe. W systemach opartych na architekturze x86 nazywane są one partycjami.
Wyróżniamy trzy rodzaje partycji: podstawowe, rozszerzone oraz logiczne.
Informacje o partycjach podstawowych przechowywane są w MBR (master boot record). Jako że jest on bardzo mały (512 bajtów), mieszczą się w nim dane maksymalnie czterech takich partycji (na przykład od /dev/sda1 do /dev/sda4).
Specjalną odmianą partycji podstawowych są partycje rozszerzone (również obowiązuje je powyższy limit). Przechowują one wewnątrz siebie kolejne partycje. W ten sposób można ominąć niewygodną granicę i lepiej zagospodarować przestrzeń dyskową.
Partycje umieszczone i opisane wewnątrz rozszerzonych nazywamy logicznymi. Dane o nich nie znajdują się w MBR.
Zaawansowane metody przechowywania danych
Płyty instalacyjne dla architektury x86 posiadają obsługę EVMS oraz LVM2, co znacznie rozszerza możliwości partycjonowania dysków. W Podręczniku skupimy się na tworzeniu zwykłych partycji, warto jednak wiedzieć, że możliwe jest korzystanie również z nowocześniejszych rozwiązań.
Projektowanie schematu podziału
Domyślny schemat podziału
Można pominąć samodzielne rozrysowywanie schematu podziału dysku i po prostu skorzystać z naszego:
Partycja | System plików | Rozmiar | Opis |
/dev/sda1 | ext2 | 32M | Partycja rozruchowa |
/dev/sda2 | (swap) | 512M | Partycja wymiany |
/dev/sda3 | ext3 | Pozostałe wolne miejsce | Partycja główna |
W dalszej części tekstu wyjaśnimy jak wiele i jak dużych partycji należy utworzyć. Można pominąć te informacje i przejść bezpośrednio do partycjonowania dysku przy pomocy fdisk.
Ilość partycji ściśle zależy od danego środowiska. Na przykład, jeśli administruje się systemem mającym wielu użytkowników, prawdopodobnie uzna się za stosowne oddzielenie /home, aby poprawić bezpieczeństwo i uprościć tworzenie kopii zapasowych. Jeżeli docelowym zastosowaniem Gentoo jest serwer poczty, na osobnej partycji należy umieścić /var, gdzie przechowywane są listy. Dobry wybór systemu plików może znacznie zwiększyć wydajność. Oddzielenie /opt jest dobrym rozwiązaniem na serwerach gier, gdyż większość używanego oprogramowania zostanie tam zainstalowana. Powód jest podobny jak przy /home: bezpieczeństwo i kopie zapasowe. Na pewno warto zapewnić dużo wolnego miejsca na /usr, ponieważ będą tam się znajdowały nie tylko dane wszystkich zainstalowanych pakietów, ale również ważące 500 MB drzewo Portage i kody źródłowe programów.
Jak widać, wiele zależy od oczekiwanego rezultatu. Rozdzielenie partycji ma wiele zalet:
Niestety zbyt rozbudowany schemat podziału niesie ze sobą spore problemy. Źle zaplanowany zaowocuje pustkami na zbyt dużych i ciasnotą na zbyt małych partycjach.
W przykładzie pokażemy partycjonowanie dysku o rozmiarze 20GB wykorzystywanego w laptopie z zainstalowanym serwerem poczty, stron internetowych oraz środowiskiem Gnome:
Listing 2.1: Przykładowy podział dysku
$ df -h
Filesystem | Type | Size | Used | Avail | Use% | Mounted on |
/dev/sda5 | ext3 | 509M | 132M | 351M | 28% | / |
/dev/sda2 | ext3 | 5.0G | 3.0G | 1.8G | 63% | /home |
/dev/sda7 | ext3 | 7.9G | 6.2G | 1.3G | 83% | /usr |
/dev/sda8 | ext3 | 1011M | 483M | 477M | 51% | /opt |
/dev/sda9 | ext3 | 2.0G | 607M | 1.3G | 32% | /var |
/dev/sda1 | ext2 | 51M | 17M | 31M | 36% | /boot |
/dev/sda6 | swap | 516M | 12M | 504M | 2% | <not mounted> |
/usr jest niemal w pełni zajęty (wykorzystane 83%), ale po instalacji wszystkich potrzebnych pakietów nie będzie się on zbytnio rozrastał. Przeznaczenie kilku gigabajtów na /var może wydać się zbyt rozrzutne. Należy jednak zwrócić uwagę, że Gentoo kompiluje tam domyślnie wszystkie pakiety. Jeżeli chcemy, aby /var posiadało mniejszy rozmiar, na przykład 1GB, powinniśmy zmodyfikować zmienną PORTAGE_TMPDIR w pliku /etc/make.conf, aby zawierała partycję z odpowiednią ilością wolnego miejsca do kompilacji ekstremalnie dużych pakietów takich jak na przykład OpenOffice.
Partycjonowanie dysku przy pomocy fdisk
Teraz przedstawimy proces tworzenia partycji wypisanych w naszym przykładowym schemacie podziału dysku. Oto on:
Partycja | Opis |
/dev/sda1 | Partycja rozruchowa |
/dev/sda2 | Partycja wymiany |
/dev/sda3 | Partycja główna |
Ten schemat oczywiście można (i zwykle należy) zmodyfikować stosownie do własnych potrzeb.
fdisk to popularne i bardzo wygodne narzędzie służące do partycjonowania dysków. Zacznijmy od uruchomienia go dla naszego dysku (pokażemy to na przykładzie /dev/sda):
Uruchamianie fdisk
# fdisk /dev/sda
Po chwili ukaże się taki znak zachęty fdisk:
Znak zachęty fdisk
Command (m for help):
Aby wyświetlić obecną konfigurację partycji wpisujemy p:
Przykładowa konfiguracja partycji
Command (m for help): p
Disk /dev/sda: 240 heads, 63 sectors, 2184 cylinders
Units = cylinders of 15120 * 512 bytes
Device | Boot | Start | End | Blocks | Id System |
/dev/sda1 * | 1 | 14 | 105808+ | 83 | Linux |
/dev/sda2 | 15 | 49 | 264600 | 82 | Linux swap |
/dev/sda3 | 50 | 70 | 158760 | 83 | Linux |
/dev/sda4 | 71 | 2184 | 15981840 | 5 | Extended |
/dev/sda5 | 71 | 209 | 1050808+ | 83 | Linux |
/dev/sda6 | 210 | 348 | 1050808+ | 83 | Linux |
/dev/sda7 | 349 | 626 | 2101648+ | 83 | Linux |
/dev/sda8 | 627 | 904 | 2101648+ | 83 | Linux |
/dev/sda9 | 905 | 2184 | 9676768+ | 83 | Linux |
Na prezentowanym dysku znajduje się siedem linuksowych systemów plików (każdy na osobnej partycji, oznaczonej jako „Linux”) oraz partycja wymiany (oznaczona jako „Linux swap”).
Usuwanie partycji
Zacznijmy od usunięcia starych partycji. Służy do tego polecenie d z odpowiednim dla każdej partycji numerem. Na przykład, aby pozbyć się /dev/sda1, należy wpisać:
Usuwanie partycji
Command (m for help): d
Partition number (1-4): 1
Partycja została zaznaczona do usunięcia. Nie będzie więcej pojawiać się po wpisaniu p, ale pozostanie nienaruszona dopóki zmiany nie zostaną fizycznie zapisane na dysku. Po popełnieniu błędu przy dzieleniu dysku wystarczy wpisać q i wcisnąć enter, aby wszystkie dokonane modyfikacje poszły w niepamięć.
Aby pozbyć się wszystkich istniejących partycji wpisujemy p, aby wyświetlić ich listę, a następnie po kolei kasujemy je poleceniem d z odpowiednim numerem. Na koniec p powinno dawać następujący rezultat:
Pusta tablica partycji
Disk /dev/sda: 30.0 GB, 30005821440 bytes
240 heads, 63 sectors/track, 3876 cylinders
Units = cylinders of 15120 * 512 = 7741440 bytes
Device Boot Start End Blocks Id System
Command (m for help):
Kiedy już nasza tymczasowa kopia tablicy partycji będzie pusta możemy rozpocząć dzielenie dysku. Pokażemy to na przykładzie naszego domyślnego schematu, który należy oczywiście odpowiednio zmienić dla danej sytuacji, aby możliwie najlepiej spełniał konkretne przed nim stawiane zadania.
Rozpoczniemy od utworzenia niewielkiej partycji rozruchowej. Wpisujemy n, aby ją założyć, a następnie p, aby nadać jej typ podstawowy i 1, ponieważ będzie to pierwsza taka partycja. Zapytani o pierwszy cylinder wciskamy enter, a przy pytaniu o ostatni wpisujemy +32M, by nadać jej rozmiar 32 MB oraz ustawić flagę partycji rozruchowej:
Zakładanie partycji rozruchowej
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-3876, default 1): (Enter)
Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-3876, default 3876): +32M
Teraz polecenie p powinno pokazywać taką listę:
Partycja rozruchowa
Command (m for help): p
Disk /dev/sda: 30.0 GB, 30005821440 bytes
240 heads, 63 sectors/track, 3876 cylinders
Units = cylinders of 15120 * 512 = 7741440 bytes
Device Boot Start End Blocks Id System
/dev/sda1 1 14 105808+ 83 Linux
Musimy również oznaczyć naszą partycję jako uruchamialną. W tym celu skorzystamy z polecenia a. Na kolejnych wydrukach podziału w kolumnie „Boot” przy naszej partycji pojawi się znak *.
Następnie tworzymy partycję wymiany. Ponownie korzystamy z polecenia n, potem wpisujemy p (gdyż ma to być partycja podstawowa) i 2, ponieważ będzie ona drugą tego typu. Zapytani o pierwszy cylinder wciskamy enter, a w odpowiedzi na pytanie o ostatni wpisujemy +512M (aby nadać partycji rozmiar 512 MB). Na koniec wpisujemy t (aby zmienić jej typ), 2 (aby wybrać tę, którą właśnie stworzyliśmy) i 82 (co nada jej typ „Linux Swap”). Teraz polecenie p powinno pokazywać następującą listę:
Wydruk podziału po utworzeniu partycji wymiany
Command (m for help): p
Disk /dev/sda: 30.0 GB, 30005821440 bytes
240 heads, 63 sectors/track, 3876 cylinders
Units = cylinders of 15120 * 512 = 7741440 bytes
Device Boot Start End Blocks Id System
/dev/sda1 * 1 14 105808+ 83 Linux
/dev/sda2 15 81 506520 82 Linux swap
Na koniec tworzymy partycję główną. Jeszcze raz posłużymy się poleceniem n. Zapytani o rodzaj wciskamy p (aby była partycją podstawową), następnie 3 (gdyż będzie już trzecią tego typu, czyli w naszym przypadku /dev/sda3), a na pytanie o pierwszy i ostatni cylinder wciskamy enter, dzięki czemu zajmie ona całą pozostałą wolną przestrzeń. Ostatecznie polecenie p powinno pokazać następującą listę:
Wydruk podziału po utworzeniu partycji głównej
Command (m for help): p
Disk /dev/sda: 30.0 GB, 30005821440 bytes
240 heads, 63 sectors/track, 3876 cylinders
Units = cylinders of 15120 * 512 = 7741440 bytes
Device Boot Start End Blocks Id System
/dev/sda1 * 1 14 105808+ 83 Linux
/dev/sda2 15 81 506520 82 Linux swap
/dev/sda3 82 3876 28690200 83 Linux
Zapisywanie podziału partycji
Aby zachować ustalony podział i opuścić fdisk, należy wpisać w.
Zachowywanie zmian i zamykanie fdisk
Command (m for help): w
Po utworzeniu partycji można przejść do zakładania systemów plików.
Zakładanie systemów plików
Po utworzeniu partycji trzeba założyć na nich odpowiednie systemy plików. Osoby, którym wszystko jedno jaki system plików wybiorą lub te, które są zadowolone z domyślnych ustawień z Podręcznika mogą przejść do zakładania systemów plików na partycji. Pozostali muszą czytać dalej, aby dowiedzieć się więcej na ich temat.
Systemy plików
Jądro Linux obsługuje wiele różnych systemów plików. W tym tekście omówimy ext2, ext3, ReiserFS, XFS i JFS, ponieważ są one najczęściej używane w systemach linuksowych.
ext2 to sprawdzony i popularny linuksowy system plików, którego główną wadą jest to, że nie posiada księgowania. Powoduje to, że jego regularne kontrole przy starcie systemu bywają długotrwałe. Obecnie istnieją nowoczesne systemy plików z księgowaniem, które można szybko sprawdzić i to właśnie te polecamy naszym użytkownikom. Księgowanie zapobiega długotrwałym kontrolom podczas uruchamiania systemu oraz ewentualnym błędom spójności danych. Jeśli zamierzamy instalować Gentoo na bardzo mały dysku (mniejszym niż 4GB) musimy przekazać ext2 informacje o rezerwacji wystarczającej ilości inode w trakcie tworzenia systemu plików poprzez wydanie komendy mke2fs -T small /dev/.
ext3 to odpowiednik ext2 posiadający księgowanie w trybach full oraz ordered, dzięki czemu w razie awarii dane odzyskiwane są błyskawicznie. ext3 używa indeksu drzewa HTree, który zapewnia wysoką wydajność w prawie wszystkich zastosowaniach. W skrócie, ext3 to bardzo dobry i niezawodny system plików. Jeśli zamierzamy instalować Gentoo na bardzo mały dysku (mniejszym niż 4GB) musimy przekazać ext2 informacje o rezerwacji wystarczającej ilości inode w trakcie tworzenia systemu plików poprzez wydanie komendy mke2fs -j -T small /dev/.
JFS to bardzo wydajny system plików IBM wyposażony w księgowanie. Jest lekki, szybki i godny polecenia. Oparto go na drzewie B+ dzięki czemu doskonale sprawdza się w wielu bardzo różnych zastosowaniach.
ReiserFS to system plików z księgowaniem oparty na drzewie B+. Wykazuje się doskonałą wydajnością przy obsłudze bardzo wielu małych plików (kosztem zwiększonego obciążenia procesora). Nie jest tak aktywnie rozwijany jak inne systemy plików.
XFS to system plików z księgowaniem metadanych, który został zaprojektowany z myślą o skalowalności i nie posiada wielu dodatkowych możliwości. Nie jest on również zbyt odporny na problemy sprzętowe.
Aby założyć na woluminie lub partycji system plików, należy skorzystać z odpowiednich narzędzi:
System plików | Program do jego zakładania |
ext2 | mke2fs |
ext3 | mke2fs -j |
reiserfs | mkreiserfs |
xfs | mkfs.xfs |
jfs | mkfs.jfs |
Na przykład, aby założyć ext2 na partycji rozruchowej (w naszym przypadku /dev/sda1) oraz ext3 na partycji głównej (w naszym przypadku /dev/sda3), należy wykonać następujące polecenia:
Zakładanie systemu plików na partycji
# mke2fs /dev/sda1
# mke2fs -j /dev/sda3
Przed przejściem do dalszych kroków należy stworzyć systemy plików na wszystkich partycjach.
Aby utworzyć partycję wymiany, należy skorzystać z programu mkswap.
Tworzenie partycji wymiany
# mkswap /dev/sda2
Do aktywowania partycji wymiany używa się programu swapon:
Aktywacja partycji wymiany
# swapon /dev/sda2
Teraz tworzymy i aktywujemy partycję wymiany za pomocą powyższych poleceń.
Montowanie
Po założeniu partycji i utworzeniu na nich systemów plików nadszedł czas na ich zamontowanie. Służy do tego program mount. Należy utworzyć odpowiednie katalogi dla montowanych partycji. W przykładzie zamontujemy partycję rozruchową i główną:
Montowanie partycji
# mount /dev/sda3 /mnt/gentoo
# mkdir /mnt/gentoo/boot
# mount /dev/sda1 /mnt/gentoo/boot
Uwaga: Aby przenieść /tmp na osobną partycję, należy po jego zamontowaniu odpowiednio zmienić prawa dostępu: chmod 1777 /mnt/gentoo/tmp. Dotyczy to również /var/tmp.
Konieczne będzie także zamontowanie systemu plików proc (wirtualny interfejs jądra) w katalogu /proc, ale najpierw musimy umieścić odpowiednie pliki na partycjach.