Wikipedysta:Karol Ossowski/Dysk twardy + GNU/Linux

W Linuksie identyfikatorami dysków twardych są specjalne pliki blokowe:

  • /dev/hda - urządzenie podpięte na skraju pierwszej taśmy IDE (Primary Master)
  • /dev/hdb - urządzenie podpięte w połowie pierwszej taśmy IDE (Primary Slave)
  • /dev/hdc - urządzenie podpięte na skraju drugiej taśmy IDE (Secondary Master)
  • /dev/hdd - urządzenie podpięte w połowie drugiej taśmy IDE (Secondary Slave)

To czy urządzenie jest podłączone w trybie Master czy Slave może regulować również specjalna zworka umieszczana z tyłu dysku. Warto jeszcze dodać, że "urządzeniem" w podanym wyżej opisie może być zarówno dysk twardy jak i również jeden napędów optycznych (CD-ROM, nagrywarka itp.)

Podstawową jednostką określającą fizyczne położenie danych na dysku są trzy wartości C,H,S oznaczające odpowiednio:


Cylinder - numer cylindra
Head - numer głowic
Sector - numer sektora


Większość systemów operacyjnych nie korzysta jednak z adresowania CHS gdyż jest ono zbyt skomplikowane. W zamian za to OS (skrót od Operating System) przeliczają wartości C,H,S na logiczne numery sektorów. Ten sposób adresowania danych na dysku twardym nosi nazwę LBA (z ang. Logical Block Addressing). [dok. nt. geometrii dysku]

Struktura dysku twardego

edytuj

W dużym uproszczeniu można powiedzieć, że dysk twardy składa się z sektora MBR oraz z 4 partycji, na których można przechowywać dane.

Master Boot Record znajduje się w pierwszym sektorze dysku twardego. Jest to miejsce gdzie swoje dane przechowuje bootloader (w Linuksie jest to np. lilo lub grub) oraz gdzie znajduje się tzw. tablica partycji. Tablica partycji z kolei zawiera informacje nt. położenia(w notacji CHS i LBA) i typie wspomnianych wyżej 4 partycji.

Partycje

edytuj

Na każdym dysku mogą znajdować się 4 partycje podstawowe lub 3 partycje podstawowe i 1 partycja rozszerzona. Linux wykrywa je wg kolejności w jakiej są one wpisane w tablicy partycji i identyfikuje - tak jak to było w przypadku samych dysków - przez specjalne pliki blokowe:

<dysk>1
<dysk>2
<dysk>3
<dysk>4

gdzie: <dysk> to jedna z nazw plików blokowych będących identyfikacjami dysku. np.:

/dev/hda1
/dev/hdc4
/dev/hdb2

Partycja rozszerzona, która również może znaleźć się w tablicy MBR, to specjalny typ partycji, podzielony na jeden lub więcej mniejszych kawałków - tzw. partycji logicznych (można też się spotkać z określeniem: dyski logiczne). System wtedy identyfikuje takie partycje/dyski logiczne również za pomocą specjalnych plików blokowych:

<dysk>5
<dysk>6
<dysk>7
<dysk>8
     .
     .
     .
     .
<dysk>n

czyli np.:

/dev/hda5
/dev/hda6
/dev/hdc5
/dev/hdb9

Partycje logiczne przyjmują numery 5, 6, 7 itd. nawet jeśli nie istnieją wszystkie partycje podstawowe. Np. jeśli na dysku podłączonego w trybie Primary Master pierwszą partycję mamy rozszerzoną, a drugą podstawową, to Linux, będzie wykrywał te partycje w następujący sposób:

/dev/hda1            > partycja rozszerzona
        /dev/hda5    \
        /dev/hda6     > partycje logiczne
        /dev/hda7    /
/dev/hda2            > partycja podstawowa

Typy partycji

edytuj

W tablicy partycji poza informacją o położeniu partycji (czy też dysków logicznych) znajduje się również informacja o ich typie. Typ partycji jest określany przez unikalny kod szesnastkowy. GNU/Linux wykrywa następujące typ partycji (wydruk programu cfdisk):

01 FAT12                 24 NEC DOS               81 Minix / old Linux     C1 DRDOS/sec (FAT-12)
02 XENIX root            39 Plan 9                82 Linux swap / Solaris  C4 DRDOS/sec (FAT-16 <
03 XENIX usr             3C PartitionMagic recov  83 Linux                 C6 DRDOS/sec (FAT-16)
04 FAT16 <32M            40 Venix 80286           84 OS/2 hidden C: drive  C7 Syrinx
05 Extended              41 PPC PReP Boot         85 Linux extended        DA Non-FS data
06 FAT16                 42 SFS                   86 NTFS volume set       DB CP/M / CTOS / ...
07 HPFS/NTFS             4D QNX4.x                87 NTFS volume set       DE Dell Utility
08 AIX                   4E QNX4.x 2nd part       88 Linux plaintext       DF BootIt
09 AIX bootable          4F QNX4.x 3rd part       8E Linux LVM             E1 DOS access
0A OS/2 Boot Manager     50 OnTrack DM            93 Amoeba                E3 DOS R/O
0B W95 FAT32             51 OnTrack DM6 Aux1      94 Amoeba BBT            E4 SpeedStor
0C W95 FAT32 (LBA)       52 CP/M                  9F BSD/OS                EB BeOS fs
0E W95 FAT16 (LBA)       53 OnTrack DM6 Aux3      A0 IBM Thinkpad hiberna  EE EFI GPT
0F W95 Ext'd (LBA)       54 OnTrackDM6            A5 FreeBSD               EF EFI (FAT-12/16/32)
10 OPUS                  55 EZ-Drive              A6 OpenBSD               F0 Linux/PA-RISC boot
11 Hidden FAT12          56 Golden Bow            A7 NeXTSTEP              F1 SpeedStor
12 Compaq diagnostics    5C Priam Edisk           A8 Darwin UFS            F4 SpeedStor
14 Hidden FAT16 <32M     61 SpeedStor             A9 NetBSD                F2 DOS secondary
16 Hidden FAT16          63 GNU HURD or SysV      AB Darwin boot           FD Linux raid autodetec
17 Hidden HPFS/NTFS      64 Novell Netware 286    B7 BSDI fs               FE LANstep
18 AST SmartSleep        65 Novell Netware 386    B8 BSDI swap             FF BBT
1B Hidden W95 FAT32      70 DiskSecure Multi-Boo  BB Boot Wizard hidden
1C Hidden W95 FAT32 (LB  75 PC/IX                 BE Solaris boot
1E Hidden W95 FAT16 (LB  80 Old Minix             BF Solaris

Jak widać powyżej, do Linuksa odnoszą się 2 typy partycji: 'Linux Swap / Solaris' i 'Linux' o kodach odpowiednio 82 i 83. Partycje 'Linux Swap / Solaris' w systemach GNU/Linux są tzw. partycjami wymiany i są one wykorzystywane do zwiększania wydajności pamięci RAM komputera.
Drugi typ noszący nazwę po prostu 'Linux' jest typem przeznaczonym do przechowywania danych na systemach Linuksowych, czyli jest on zgodny z podstawowym zastosowaniem dysków twardych :)

Rozruch komputera a tablica partycji

edytuj

W konfiguracji BIOSu komputera można ustawić kolejność urządzeń rozruchowych (boot device) jakie ma być użyte do załadowania systemu operacyjnego. BIOS w czasie inicjowania pracy użyje pierwsze aktywne urządzenie, które zostało tam ustawione. Standardowo w większości BIOSów jako pierwszego urządzenia rozruchowego używa się stacji dyskietek, dalej jeśli nie ma żadnej dyskietki włożonej do stacji, wybierany jest napęd optyczny (np. CD-ROM), a dopiero na końcu jeśli i w napędzie optycznym nie ma płyty zdolnej do załadowania systemu operacyjnego, komputer wybiera dysk twardy. Wówczas, gdy BIOS "zwróci się" do dysku twardego o załadowanie systemu operacyjnego, do pamięci ładowany jest sektor MBR. Komputer próbuje uruchomić tzw. bootloadera, czyli program zarządzający procesem ładowania systemu/ów operacyjnego/ych zainstalowanym/ych na dysku, lub jeśli MBR nie jest w niego wyposażony, wyszukuje flagi BOOT przypisanej do którejś z partycji, i z tej zaznaczonej w ten sposób partycji próbuje ładować system. Jeżeli również flaga BOOT nie jest ustawiona, wtedy komputer inicjuje system z pierwszej partycji dysku twardego.


Partycjonowanie dysków twardych w Linuksie

edytuj

W systemie GNU/Linux do edycji tablicy partycji można użyć kilka programów. Najpopularniejszymi z nich są nieśmiertelny fdisk i cfdisk

fdisk, to podstawowe narzędzie do obsługi tablicy partycji w systemie Linux. Podobne programy pod tą samą nazwą występują również w innych systemach (np. Windows, OS/2). Pomimo różnic w każdym przypadku fdisk stosowany jest do jednej i tej samej czynności - partycjonowania dysków twardych. W systemie Linux fdisk jest programem operującym bezpośrednio na tablicy partycji. Potrafi on m.in. dodawać/usuwać partycje, zmieniać ich typ i etykietę, ustawiać flagę boot, a także zmieniać geometrie dysku i wiele innych operacji. Obsługa tego programu odbywa się poprzez wpisywanie jednoliterowych komend, na które program reaguje interaktywnie prosząc o ew. parametry. Każdą komendę jak i wpisane parametry należy potwierdzić klawiszem Enter. Np. aby utworzyć nową partycje należ wpisać literkę 'n' (i wcisnąć enter), po czym gdy program zapyta się o typ partycji wybrać 'l' (dysk logiczny) lub 'p' (partycja podstawowa) po czym wybrać początek i koniec partycji. Przykładowa "rozmowa" z programem może wyglądać następująco

Command (m for help): m
Command action
  a   toggle a bootable flag
  b   edit bsd disklabel
  c   toggle the dos compatibility flag
  d   delete a partition
  l   list known partition types
  m   print this menu
  n   add a new partition
  o   create a new empty DOS partition table
  p   print the partition table
  q   quit without saving changes
  s   create a new empty Sun disklabel
  t   change a partition's system id
  u   change display/entry units
  v   verify the partition table
  w   write table to disk and exit
  x   extra functionality (experts only)

Command (m for help): n
Command action
  l   logical (5 or over)
  p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-2434, default 1):  
Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-11, default 11): +12M

W powyższym przykładzie używamy notacji CHS do określania położenia partycji, ale fdisk potrafi stosować również LBA (do zmiany służy: 'u'). Wszystkie zmiany na tablicy partycji pozostają nietknięte dopóki nie zapisze się ich przy użyciu komendy 'w'.

UWAGA fdisk modyfikuje jedynie tablice partycji, nie potrafi on w żaden sposób ingerować w same partycje, tym bardziej zmieniać ich rozmiaru bez utraty zawartych na nich danych, ustanawiać dla nich system plików itp.

cfdisk

edytuj

Naprawianie uszkodzonej tablicy partycji

edytuj

testdisk

edytuj

Dane na partycjach dyskowych są uporządkowane wg ustalonej struktury, którą nazywamy systemem plików. GNU/Linux potrafi obsługiwać wiele systemów plików takich jak FAT32 używane w systemach Win9x/ME, NTFS (nie w pełni) czy HFS+ znane z komputerów Macintosh. Jednakże stosowanie ich w partycjach na których znajduje się tylko i wyłącznie Linux, nie jest dobrym pomysłem gdyż istnieją systemy plików dedykowane specjalnie pod Linuksa:

system plików opis cechy
ext3 [opis ext3] + [plusy ext3]
- [minusy ext3]
ext2 Starszy brat ext3. Główna różnica pomiędzy nim, a ext3 to tzw. księgowanie - ext2 nie obsługuje księgowania, co sprawia, że ext2 nie nadaje się na współczesne stacje robocze. [więcej o ext2] + [plusy ext2]
- [minusy ext2]
ReiserFS [opis resierfs] + [plusy reiserfs]
- [minusy reiserfs]
XFS [opis XFS] + [plusy XFS]
- [minusy XFS]
JFS [opis JFS] + [plusy JFS]
- [minusy JFS]

Zakładanie systemu plików

edytuj

mkfs

Diagnostyka i naprawa uszkodzonego systemu plików

edytuj

badblocks

edytuj

(Qt)Parted

edytuj

czyli wszystko czego potrzebujesz do obsługi dysku twardego w Linuksie


Struktura katalogów

edytuj

Główny katalog w systemach *nix (czyli także w GNU/Linuksie) jest oznaczany przez '/'. W katalogu '/' znajdują się wszystkie inne podkatalogi systemu. np.:

/
|
|-> /usr
|     |-> /usr/bin
|     |-> /usr/share
|     `-> /usr/bin
|     
`--> /home
       |-> /home/piotr
       |-> /home/radek
       `-> /home/jola

W GNU/Linuksie pliki i katalogi rozmieszczone są wg specjalnego standardu w:FHS (Filesystem hierarchy standard). Standard ten zakłada następującą strukturę katalogów:

katalog co zawiera
/bin pliki binarne, programy niezbędne dla systemu
/boot dane dla programu rozruchowego (np. lilo, grub)
/dev specjalne pliki blokowe identyfikujące urządzenia (np. dysk twardy - /dev/hda)
/etc pliki konfiguracyjne
/home pliki konfiguracyjne i dane użytkowników
/lib biblioteki systemowe
/mnt obce systemy plików (np. partycje Windows)
/media wymienne systemy plików (np. dyskietka, cdrom)
/opt statyczne pakiety oprogramowania
/proc informacje nt. komputera pochodzące z jądra systemu
/root dane administratora systemu
/sbin programy dla administratora systemu
/srv dane
/tmp pliki tymczasowe
/usr oprogramowanie
/var zmienne dane umieszczane przez programy (np. logi systemowe)

Punkty montowania

edytuj

Aby można było partycję używać w systemie musi ona zostać zamontowana w odpowiednim punkcie montowania. Punkt montowania to folder w strukturze katalogów systemu, które jest uważane za "miejsce od którego zaczyna się partycja", korzeń. Np. dla partycji /dev/hda1 przechowującej dane użytkowników wg standardu FHS punktem montowania powinien być /home.


Do prawidłowego działania GNU/Linux potrzebuje partycje, która będzie zamontowana w głównym katalogu systemu: /. Na tej partycji zwanej root partition będą przechowywane dane zamieszczone w katalogu / i w katalogach podrzędnych o ile któryś z tych podkatalogów nie stanowi punktu montowania innej partycji. Np. jeśli mamy dwie partycje: /dev/hda1 o punkcie montowania / i partycje /dev/hda2 o punkcie montowania /home, to wszystkie dane systemu będą przechowywane w partycji /dev/hda1 poza katalogiem /home, który będzie przechowywany w partycji /dev/hda2.


Partycjonowanie dysku twardego w praktyce

edytuj

Krok 1: rozplanowanie dysku.
krok 2: wybór systemu plików
Krok 3: partycjonowanie

Krok 1

edytuj

Jest to chyba najważniejszy krok całej operacji.
Generalnie w celu partycjonowania dysku twardego można pójść w 2 różne drogi:

  1. Droga pierwsza:
    (archiwizacja danych na innym nośniku) -> "sformatowanie" całego dysku -> partycjonowanie dysku od zera
  2. Droga druga:
    (kopia zapasowa danych na innym nośniku) -> modyfikacja obecnej struktury dysku

Jaką drogę wybierzesz zależy od Ciebie. Przede wszystkim, jeśli masz możliwość wrzucenia wszystkich potrzebnych Ci danych (a najlepiej obraz całego dysku) np. na płytę lub inny dysk, to na pewno 1 droga jest bardziej wskazana i łatwiejsza do realizacji.

Jeśli obecne dane nie są Ci w w ogóle potrzebne lub dysk jest po prostu nowy, to również pewnie wybierzesz drogę pierwszą.


Jeśli nie masz jednak możliwości archiwizacji danych, na których Ci zależy lub np. nie masz zbyt wiele czasu możesz skorzystać z drugiej drogi, która jest bardziej niebezpieczna ale za to jest też bardziej elastyczna.

Droga pierwsza

edytuj

Jeśli zależy Ci na danych, które obecnie masz na dysku, to przed zabraniem się do pracy, musisz dokonać ich archiwizacji na innym nośniku. Najlepszym rozwiązaniem byłoby jednak "zrzucenie" wszystkich danych na płytę, inny dysk lub gdziekolwiek indziej. Wtedy bowiem można by "sformatować" cały dysk i ustawić partycje od zera.

Droga druga

edytuj

Najlepiej zanim dokona się pierwszych zmian w strukturze dysku, dokonać kopii najważniejszych plików, bez których nie jesteś w stanie się obejść. Jeśli nie masz gdzie zrzucić danych, to pamiętaj, że to co będzie zaraz napisane robisz na własną odpowiedzialność i w pewnych nieoczekiwanych okolicznościach Twoje dane mogą ulec zniszczeniu.


Jeśli masz zamiar zmniejszać rozmiar partycji Windowsowych (FAT32 i NTFS) to przed tą operacją wskazana jest ich defragmentacja, w przeciwnym razie może dojść do utraty danych.


Modyfikacji obecnej struktury dysku twardego można przeprowadzić zarówno z poziomu systemu GNU/Linux jak i podczas instalacji tegoż systemu na komputerze. Często jednak partycjonując instalatorem nie masz możliwości zachowania istniejących już na dysku danych. Obecnie ze znanych mi dystrybucji to Mandrake/Mandriva Linux oraz SuSe posiada możliwość zmiany rozmiaru partycji NTFS i FAT32 nie tracąc przy tym danych.


Partycjonowaniem jak było wyżej napisane mogą zająć się również specjalnie ku temu stworzone programy dla GNU/Linuksa. Jednym z takich programów jest np. qtparted, który tak jak instalatory SuSe i Mandrivy potrafi zmieniać rozmiar partycji Windows nie tracąc przy tym danych.


Trzecia możliwość, to użycie znanego programu Partition Magic, który jednak jest programem płatnym.

[opis parted, qtparted, fdisk, cfdisk, mkfs itp.]

Zwiększanie wydajności dysku twardego

edytuj

Jednym z częstych hamulców, które nakłada na komputer system Linux jest brak włączonej obsługi DMA (Direct Memory Access) w dyskach twardych. Powoduje, to znaczne obniżenie wydajności dysku, a w konsekwencji wolne działanie komputera, który wciąż oczekuje na dane od dysku twardego. Aby się przekonać czy nasz system ma włączoną obsługę DMA wydamy polecenie:

# hdparm <dysk>

gdzie <dysk> jest identyfikatorem Twojego dysku twardego w Linuksie: np. /dev/hda, /dev/hdc itd. prawidłowe "wyjście" powinno wyglądać mniej-więcej tak:

multcount    =  0 (off)
IO_support   =  1 (32-bit)
unmaskirq    =  1 (on)
using_dma    =  1 (on)
keepsettings =  0 (off)
readonly     =  0 (off)
readahead    = 256 (on)
geometry     = 38792/16/63, sectors = 39102337, start = 0

jak widać wartości IO_Support i using_dma są włączone. Jeśli u was któraś z wymienionych parametrów jest równa 0 (off), to może to być przyczyną niskiej wydajności systemu. Jeśli tak właśnie jest, to proponuję sprawdzić szybkość dysku poleceniem:

# hdparm -t <dysk>

po czym włączyć obsługę DMA i 32-bitowy przesył danych:

# hdparm -d1 -c1 -k1 <dysk>

i znów sprawdzić szybkość dysku, która powinna znacznie wzrosnąć, w przeciwnym wypadku oznacza, to że Twój dysk jest bardzo stary i nie obsługuje technologii DMA.

Obsługa DMA dysków twardych nie zawsze jest włączona w jądrze gdyż wcześniej powodowało, to problemy na dyskach, które tej technologii nie obsługiwały. Większość w miarę współczesnych "twardzieli" jednakże wspiera DMA, co nie zawsze jest wykrywane przez system. Jeżeli Twój dysk obsługuje DMA, a nie jest to standardowo włączone w systemie to masz 2 sposoby żeby zmusić Twojego Linuksa do pełnego wykorzystywania dysku:

  • w jądrze systemu odznaczyć opcję: [opcja]
  • za każdym razem zaraz przy uruchamianiu systemu włączać DMA poleceniem: hdparm

Odzyskiwanie danych

edytuj