Duże dyski Andries Brouwer, aeb@cwi.nl <mailto:aeb@cwi.nl> v1.0, 960626 wersja polska piotr.pogorzelski@ippt.gov.pl <mailto:piotr.pogorzelski@ippt.gov.pl> wersja 1.0, 5 marca 1997 Wszystko na temat geometrii dysków i granicy 1024 cylindrów. ______________________________________________________________________ Spis treści 1. Postawienie problemu 2. Ładowanie systemu (Booting) 3. Geometria dysku i partycje 4. Translacja i Disk Managery 5. Translacja wykonywana przez jądro dla dysków IDE 5.1 EZD 5.2 DM6:DDO 5.3 DM6:AUX 5.4 DM6:MBR 5.5 PTBL 6. Konsekwencje 6.1 Szczególy IDE 6.2 Szczegóły SCSI 7. Od tłumacza ______________________________________________________________________ 1. Postawienie problemu Załóżmy, że posiadasz dysk z więcej niż 1024 cylindrami. Co więcej załóżmy, że posiadasz system który korzysta z BIOSu. Wtedy masz problem. Masz problem ponieważ zwykły interfejs We/Wy twojego dysku realizowany przez przerwanie BIOSu INT13, które do przekazywania numeru cylindra, na którym ma zostać wykonana operacja We/Wy korzysta z 10-cio bitowego pola, przez co cylindry o numerze 1024 i wiekszym są niedostępne. Na szczęście Linux nie korzysta z BIOSu, więc nie ma tego problemu. No prawie, poza dwoma przypadkami: (1) Kiedy uruchamiasz swój system, Linux jeszcze nie działa i nie potrafi uchronić cię przed kłopotami z BIOSem. Ma to wpływ na pracę LILO i innych ładowaczy systemów (boot loaders). (2) Wszystkie systemy operacyjne korzystające z tego samego dysku muszą zgadzać się co do położenia poszczególnych partycji. Innymi słowy, jeśli korzystasz na jednym dysku z Linuxa i powiedzmy DOSu, wtedy oba muszą interpretować tabelę partycji w ten sam sposób. Ma to wpływ na sposób zachownia jądra i programu fdisk. Poniżej znajdziesz sczegółowy opis wszelkich istotnych szczegółów. Zauważ, że wszelkie informacje odnoszą się do jądra w wersji 2.0.8. Inne wersje jądra mogą zachowywać się troszkę inaczej. 2. Ładowanie systemu (Booting) Podczas ładowania systemu, BIOS odczytuje z pierwszego dysku twardego (lub z dyskietki) sektor 0 (znany jako główny sektor startowy (Master Boto Record, MBR)) i wykonuje skok do znalezionego tam kodu - zwykle do programu ładowania początkowego. Te małe programy ładujące (ładowacze) jakie się tam znajdują, nie posiadają wlasnych drajwerów dyskowych i korzystają z funkcji BIOSu. To znaczy, że jądro Linuxa może zostać załadowane, tylko wtedy gdy w całości znajduje się poniżej 1024 cylindra. Ten problem można bardzo łatwo rozwiązać. Upewnij się, że jądro (i być może inne pliki wykorzystywane do startu systemu, np. pliki odzworowań programu LILO) znajdują się na partycji, która w całości zawiera się w obszrze ponizej 1024 cylindra dysku, do którego BIOS ma dostęp - zwykle pierwszy lub drugi dysk twojego komputera. Poza tym ładowacz i BIOS muszą się zgadzać w sprawie geometrii dysku. Tutaj może okazać się pomocne skorzystanie w konfiguracji LILO z opcji linear. Więcej szczegółów później. 3. Geometria dysku i partycje Jeśli posiadasz na jednym dysku kilka systemów operacyjnych, wtedy każdy z nich używa jednej lub więcej partycji. Niezgodność w ocenie, gdzie te partycje się dokładnie znajdują może mieć katastrofalne konsekwencje. Rekord MBR zawiera tabelę partycji określającą, gdzie znajdują się partycje (podstawowe). Tabela zawiera 4 pozycje (dla 4 partycji) i wygląda mniej więcej tak: struct partition { char active; /* 0x80: startowa, 0: nie strtowa */ char begin[3]; /* CHS pierwszego sektora partycji */ char type; char end[3]; /* CHS ostatniego sektora partycji */ int start; /* 32 bitowy numer sektora (licząc od 0) */ int length; /* 32 bitowa liczba sektorów */ }; (gdzie CHS oznacza numer cylindra/głowicy/sektora). Jak widać informacja jest nadmiarowa: lokalizacja partycji jest podana zarówno w 24-ro bitowych polach begin i end, oraz w 32-dwu bitowych polach start i length. Linux korzysta jedynie z pól start i length, dlatego potrafi obsłużyć partycje o liczbie sektorów nie przekraczającej 2^32 tzn. partycje o rozmiarze nie większym niż 2 TB. Czyli dwieście razy większą od dysków obecnie dostępnych na rynku. Możemy mieć nadzieje, że będzie to wystarczające na najbliższe 10 lat, a może więcej. Niestety, funkcja BIOSu INT13 korzysta z inforamacij CHS zakodowanych w polach 3bajtowych, przy czym na numer cylindra przeznaczonych jest 10 bitów, 8 bitów na numer głowicy i 6 bitów na numer sektora na ścieżce. Dozwolone numery cylindrów to 0-1023, głowic 0-255 i dozwolona liczba sektorów na ścieżce wynosi 1-63 (tak, sektory na ścieżce są liczone od 1, a nie od 0). Na tych 24 bitach można zaadresować nie więcej niż 8455716864 bajtów (7.875 GB), dwieście razy więcej niż rozmiar dysków dostępnych w roku 1983. Kolejne, ważniejsze (groźniejsze) ograniczenie polega na tym, że standard interfejsu IDE pozwala jedynie na: 256 sektorów na ścieżce, 65536 cylindrów i 16 głowic. Sam w sobie pozwala na dostęp do 2^37 = 137438953472 bajtów (128 GB), lecz w połączeniu z ograniczeniami nałożonymi przez BIOS, faktycznie umożliwia na dostęp tylko do 528482304 bajtów (504 MB). Nie jest to wystarczające dla dostępnych obecnie dysków i ludzie są zmuszeni do stosowania różnego rodzaju sztuczek, zarówno sprzętowych, jak i programowych. 4. Translacja i Disk Managery Nikogo nie interesuje jaka jest `rzeczywista' geometria dysku. Tak na prawdę, liczba sektorów na ścieżce często jest zmienna - więcej na ścieżkach zewnętrznych i mniej na ścieżkach wewnętrznych - nie ma tak na prawdę `rzeczywstej' liczby sektorów na ścieżce. Dla użytkownika najwygodniej jest traktować dysk jako liniową tablicę sektorów, ponumerowanych 0,1 ... i pozostawić sterownikowi zadanie odnalezienia położenia danego sektora na dysku. To numerownie liniwe znane jest pod skrótem LBA. Adres liniowy należacy do sektora (c,h,s) dla dysku o geometrii (C,H,S) jest równy c*H*S+h*S+(s-1). Wszystkie sterowniki SCSI porozumiewają się według standardu LBA, niektóre sterowniki IDE również. BIOS zamienia 24-bitowe pole (c,h,s) na adres LBA i przekazuje to sterownikowi, który rozumie co to jest LBA. Dzięki temu ponownie mamy dostęp do 7.785 GB. Nie jest to wystarczające dla wszystkich dysków, lecz jest to lepsze niż to co było. Zauważ, że CHS wykorzystywane przez BIOS nie ma żadnego związku z rzeczywistością. Coś poddobnego dzieje się w sytuacji, gdy sterownik nie rozumie adresów LBA, lecz BIOS wie o translacji (w Setupie BIOSu jest to zwykle oznaczane jako `Large'). Teraz BIOS prezentuje systemowi operacyjnemu geometrię (C',H',S') i używa geometrii (C,H,S) do komunikacji ze sterownikiem. Zwykle S=S' C'=C/N i H'=H*N, gdzie N jest najmniejszą potęgą 2, zapewniającą spełnienie warunku ' <= 1024 (w celu zminimalizowania marnującej się przestrzeni przez zaokrąglenie w dół C'=C/N). Ta metoda również pozwala uzyskać dostęp do 7.875 GB. Jeśli BIOS nic nie wie na tema `Large' lub LBA, wtedy pozostają rozwiązania oparte na odpowiednich drajwerach. Takie programy, jak OnTrack lub Ez-Drive zamieniają programy obsługi dysku należące do BIOSu na własne. Często jest to realizowane, przez umieszenie kodu należacego do Disk Managera w rekordzie MBR i kolejnych sektorach dysku (OnTrack nazywa to DDO: Dynamic Drive Overlay) aby był on uruchamiany przed załadowniem jakiegokolwiek systemu operacyjnego. To wyjaśnia kłopoty związane ze startowniem systemu z dyskietki, dla dysków z zainstalowanym programem Disk Manager. Efekt całego tego zamieszania jest mniej więcej taki sam, jak w przypadku translacji przez BIOS - lecz w sytuacjach, gdy na jednym dysku znajduje się wiele systemów operacyjnych programy typu Disk Manager mogą sprawiać wiele kłopotów. Linux od wersji 1.3.14 rozpoznaje istnienie programu Boot Manager firmy OnTrack i od wersji 1.3.29 firmy EZ-Drive. Więcej szczegółów znajdziesz dalej. 5. Translacja wykonywana przez jądro dla dysków IDE Jeśli jądro Linuxa rozpozna istnienie na dysku IDE programu typu disk manager, spróbuje przeprowadzić identyczną translację jaką robi ten właśnie program, tak aby widzieć te same partycje co np. MS-DOS z programe OnTrack lub EZ-Drive. Jeśli jednak w parametrach startowych zostanie przekazana geometria dysku, nie jest wykonywana żadna translacja. Tak więc opcja startowa `hd=cyls,heads,secs' może zniszczyć zgodność z programem typu disk manager. Translacja wykonywana przez jądro polega na wypróbowaniu kolejno liczby głowic równej 4, 8 ,16, 32, 128, 255 (utrzymując stałą wartość H*C) aż do spełnienia warunku C <= 1024 lub H = 255. Trochę uwag na temat tekstu poniżej - nagłówki podrozdziałów są identyczne z pojawiającymu się w komunikatach startowych. Tutaj i w całym tekscie typy partycji podane są szesnastkowo. 5.1. EZD Rozpoznano drajwer EZ-Drive poniważ pierwsza partycja podstawowa jest typu 55. Geometria dysku podlega opisanej powyżej translacji i tabela partycji z sektora 0 zostaje pominięta - zmiast tego korzystamy z tabeli partycji znajdującej się w sektorze 1. Numery bloków dyskowych pozostają niezmienione, lecz zapis sektora 0 zostaje przekierowany do sektora 1. To zachownie może zostać zmienione przez ponowne skompilowanie jądra przy zdefiniowaniu w pliku ide.c #define FAKE_FDISK_FOR_EZDRIVE 0 . 5.2. DM6:DDO Rozpoznano drajwer OnTrack Manager (na pierwszym dysku) ponieważ pierwsza partycja podstawowa jest typu 54. Geometria dysku podlega op...
Porozmawiajmy.TV