Large-Disk-HOWTO.pl.txt

(22 KB) Pobierz
  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&nbsp;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...
Zgłoś jeśli naruszono regulamin