Probleme bei der Verwendung von großen Festplatten Die Verwendung größerer Festplatten kann beim PC aufgrund der ungünstigen Beschränkungen des IDE-Standards und des BIOS zu Problemen führen. Einerseits kann das BIOS des PCs nur Festplatten mit maximal 256 Köpfen, 63 Sektoren und 1024 Zylindern verwalten, während der IDE-Standard nach dem CHS-Modell (Cylinders, Heads, Sectors) maximal 16 Köpfe, 255 Sektoren und bis zu 65536 Zylinder erlaubt. Die Schnittmenge aus beiden (16 Köpfe, 63 Sektoren und 1024 Zylinder) ergibt eine maximal zulässige Größe von nur 504 MB. Der neuere Enhanced-IDE Standard umgeht diese Einschränkung, indem er durch das LBA-Verfahren (logische Block Adressierung) einfach alle Sektoren der Platte fortlaufend durchnumeriert. Die zweite Möglichkeit, diese Einschränkung zu umgehen, bietet das erweiterte (Extended) CHS-Modell, das von neueren BIOS-Versionen unterstützt wird. Dieses Modell erweitert die Zahl der möglichen Köpfe auf 256. Die sich aus beiden Ansätzen ergebende Grenze liegt jeweils bei knapp 7,9 GB. Bei (E-)IDE sollte es im Normalfall zu keinen Problemen beim Betrieb von Linux mit großen Platten kommen. Gibt es doch Schwierigkeiten, so versuchen Sie zuerst dem (E-)IDE Treiber mit dem Bootparameter "hdx=cyl,heads,sect" die wirklichen Werte Ihrer Festplatte zu übergeben ("hdx" steht dabei für "hda" bis "hdd"). Damit vermeiden Sie, daß Linux vom BIOS aufgrund dessen Einschränkungen falsche Festplattenparameter erhält. Lesen Sie noch die folgenden Absätze, um zu sehen, wie Sie bei den Parametern zu einer Zylinderzahl von weniger als 1024 kommen. Linux selbst kennt die Einschränkungen des BIOS nicht, da es unabhängig vom BIOS direkt auf die Hardware zugreift. Bei SCSI wird grundsätzlich der oben erwähnte LBA-Modus benutzt. Allerdings gibt es hier im Gegensatz zu EIDE bei Festplatten, die größer als 1 GB sind, unter Umständen das Problem, daß die Festplattenparameter für `fdisk' und `lilo' angepaßt werden müssen. Sie erkennen dies an den entsprechenden Warnungen und Hinweisen, die "fdisk" meldet, wenn Sie es während der Installation aufrufen (siehe nächster Absatz). Die Anpassung für `lilo' müssen Sie durch einen entsprechenden Eintrag in der Datei `/etc/disktab' vornehmen, die Anpassung für `fdisk' im Expert-Modus von `fdisk'. Das prinzipielle Vorgehen dazu werden wir Ihnen noch anhand eines Beispiels zeigen. Die Schwierigkeit bei der Verwendung großer Festplatten liegt darin, daß die Partitionstabelle bereits zum Bootzeitpunkt gelesen werden muß, wenn noch kein Betriebssystem aktiv ist. Der Zugriff auf den Bootsektor geschieht über das BIOS des PCs, das die oben erwähnten Einschränkungen von 256 Köpfen, 63 Sektoren und 1023 Zylindern besitzt. Aus diesem Grund versucht der Kontroller bei Festplatten mit mehr als 1023 Zylindern eine Übersetzung der Festplattenwerte so vorzunehmen, daß diese über das BIOS akzeptiert werden. Der Zugriff auf die Partitionstabelle selbst ist immer unproblematisch, da sie über den ersten Zylinder, ersten Sektor und ersten Kopf erreicht werden kann, die unabhängig von irgendeiner Übersetzung immer auf die gleiche Art angesprochen werden. Damit ergibt sich zum Bootzeitpunkt aus der BIOS-Einschränkung die Grenze, daß maximal 1023 Zylinder der Festplatte angesprochen werden können. Somit müssen sich alle Daten, die Sie für den Bootvorgang benötigen (wie z.B. der Bootloader oder der Betriebssystemkernel) unterhalb des 1024ten Zylinders befinden. Jenseits dieser Grenze können Sie zwar gefahrlos Partitionen anlegen, aber dann nicht direkt von diesen Partitionen booten. Ebenso kann es im Zusammenspiel mit anderen Betriebssystem zu Problemen kommen. Als einfache (aber nicht konsequente) Abhilfe legen Sie die Linux Boot-Partition unterhalb von 1023 Zylindern an. Diese muß nur den Kernel und das Root-Dateisystem enthalten und kann somit relativ klein gehalten werden (15 MB genügen). Die `/usr'-Partition können Sie dann auch oberhalb von 1023 Zylindern plazieren. Legen Sie die Linux-Partitionen am besten mit dem "fdisk" eines anderen Betriebssystems (z.B von OS/2) an und ändern Sie bei der Installation von Linux dann nur die System-ID der gewünschten Partition auf den Typ Linux (ID 83, linux native). Die bessere Lösung besteht darin, daß Sie "fdisk" im Expert-Modus die richtige Aufteilung von Zylindern, Sektoren und Köpfen angeben, die der Kontroller verwendet und die vom BIOS akzeptiert wird. Das folgende Bild zeigt Ihnen exemplarisch die Umsetzung von den physikalischen Werten der Festplatte zur direkten Blockadressierung, die dann am Ende vom Betriebssystem verwendet wird, um die Festplatte anzusprechen. Links sehen Sie, daß sich die physikalische Aufteilung der Platte meist von den nach außen gemeldeten logischen Werten unterscheidet. In Wirklichkeit sind meist deutlich weniger Köpfe auf der Platte vorhanden als diese nach außen hin vorgibt. Die logischen Werte, die die Platte liefert, sollen sich in die Begrenzungen von IDE bzw. BIOS einfügen. Handelt es sich um einen EIDE oder SCSI-Kontroller, so wird vom Kontroller selbst nochmals eine Umsetzung der Werte vorgenommen. Bei SCSI sind dies meistens 64 Köpfe und 32 Sektoren, da sich aus dieser Einteilung eine "runde" Größe von 64*32*512 Bytes = 1 MB pro Zylinder ergibt. EIDE nutzt die Reserven des Enhanced IDE Standards (XCHS-Modell) aus und erhöht die Zahl der Köpfe auf 255. Die letzte Umsetzung wird vom Betriebssystem selbst vorgenommen. Linux benutzt hier die logische Blockadressierung (LBA), die die Blöcke linear vom ersten bis zum letzten Block auf der Festplatte direkt anspricht. Viele Kontroller verwenden zwei unterschiedliche Abbildungen, um für die Anzahl der Zylinder einen Wert unter 1024 zu erhalten. Zuerst versucht der Kontroller meistens, die Anzahl der Köpfe zu verdoppeln. Ergibt sich daraus keine Zylinderanzahl unter 1024, so bildet der Kontroller die tatsächlichen Werte von Köpfen und Sektoren auf die maximal mögliche Anzahl ab, um so die Anzahl der Zylinder zu minimieren. Dieses Vorgehen entspricht z.B. der Extended Translation bei den Adaptec-Kontrollern AHA 274x/284x/294x. Die NCR-Kontroller verwenden eine Variante, bei der die Zahl der Köpfe und Sektoren gerade so groß wie nötig gewählt wird, um die Grenze von 1023 Zylindern einzuhalten. Dadurch wird der Verschnitt beim Anlegen von Partitionen minimiert, da diese immer genau an Zylinder grenzen beginnen und enden. Die Übersetzung eines Adaptec-Kontrollers ergibt beispielsweise bei einer 4 GB Platte eine Anzahl von 255 Köpfen, 63 Sektoren und 522 Zylindern. Ohne diese Übersetzung meldet "fdisk" 64 Köpfe, 32 Sektoren und 4095 Zylinder. Ihre Aufgabe besteht nun darin, die Übersetzung, die der Kontroller vornimmt, herauszufinden und diese Werte im Expert-Modus von "fdisk" für die Festplatte einzutragen. Beachten Sie dabei, daß die Gesamtkapazität der Festplatte immer gleich bleiben muß. Wir wollen Ihnen nun anhand eines Testrechners mit einer 4 GB SCSI-Festplatte das notwendige Vorgehen erklären. Diese Festplatte besitzt mehr als 1023 Zylinder und das Linux "fdisk" gibt während der Installation eine Warnung bezüglich der Geometrie der Platte aus: The number of cylinders for this disk is set to 4095. This is larger than 1024, and may cause problems with: 1) software that runs at boot time (e.g., LILO) 2) booting and partitioning software form other OSs (e.g., DOS FDISK, OS/2 FDISK) Wenn Sie sich nun mit "p" die Partitionstabelle ausgeben lassen, so werden Sie eine Reihe von Fehlermeldungen sehen: Device Boot Begin Start End Blocks Id System /dev/sda1 1 1 754 771088+ 6 DOS 16-bit>32M Partition 1 does not end on cylinder boundary: phys=(95, 254, 63) should be (95, 63, 32) /dev/sda2 * 97 754 1954 1228972+ 82 Linux swap Partition 2 does not end on cylinder boundary: phys=(248, 254, 63) should be (248, 63, 32) /dev/sda3 1274 1954 2456 514080 a5 BSD/386 Partition 3 does not end on cylinder boundary: phys=(312, 254, 63) should be (312, 63, 32) /dev/sda4 2362 2456 4095 1678792+ 5 Extended Partition 4 does not end on cylinder boundary: phys=(521, 254, 63) should be (521, 63, 32) /dev/sda5 2362 2456 2707 257008+ 83 Linux /dev/sda6 2394 2707 2770 64228+ 83 Linux native /dev/sda7 2402 2770 3436 682731 6 DOS 16-bit>32M /dev/sda8 2487 3436 4095 674698+ 6 DOS 16-bit>32M Wie können nun die gesuchten neuen Werte für "fdisk" gefunden werden? In unserem Beispiel mit der 4 GB Festplatte ergibt sich bei den von "fdisk" gemeldeten 64 Köpfen, 32 Sektoren und 4095 Zylindern eine Gesamtkapazität von 64*32*4095*512 Bytes = 4095 MB. Setzt man nun für die Anzahl der Köpfe 255 und die Anzahl der Sektoren 63 ein (einen Hinweis darauf, daß diese Annahme richtig scheint, sehen Sie an den Fehlermeldungen in der obigen Partitionstabelle), so ergibt sich folgende Gleichung: 255*63*Zylinder*512 Bytes = 4095 MB, da sich die Gesamtkapazität ja nicht ändern darf. Löst man die Gleichung nach den Zylindern auf, so erhält man eine Anzahl von 522 Zylindern. Diese neuen Werte müssen nun in das "fdisk" eingetragen werden. Sie müssen dazu mit dem Kommando "x" in den Expert-Modus von "fdisk" wechseln und die neuen Parameter für die Köpfe, Sektoren und Zylinder eingeben. Im Expert-Modus können Sie dies mit den Befehlen "c" (cylinders), "h" (heads) und "s" (sectors) vornehmen. Dies sind nach obiger Rechnung 255 Köpfe und 63 Sektoren. Tragen Sie bitte niemals 256 Köpfe ein, wenn Sie DOS benutzen wollen. DOS stürzt nämlich bei einer Kopfanzahl von 256 Köpfen kommentarlos ab. Geben Sie nun also die neuen Werte ein: Expert command (m for help): h Number of heads (1-256): 255 Expert command (m for help): s Number of sectors (1-63): 63 Warning: setting sector offset for DOS compatiblity Expert command (m for help): c Number of cylinders (1-65535): 522 Nachdem diese Werte nun im Expert-Modus von "fdisk" eingetragen worden sind, kehren Sie mit "r" wieder in das normale Hauptmenü von "fdisk" zurück. Jetzt sollten alle Warnungen verschwunden sein, was Ihnen zeigt, daß Sie die richtigen Werte gefunden haben: Command (m for help): p Disk /dev/sda: 255 heads, 63 sectors, 522 cylinders Units = cylinders of 16065 * 512 bytes Device Boot Begin Start End Blocks Id System /dev/sda1 1 1 96 771088+ 6 DOS 16-bit>32M /dev/sda2 * 97 97 249 1228972+ 82 Linux swap /dev/sda3 250 250 313 514080 a5 BSD/386 /dev/sda4 314 314 522 1678792+ 5 Extended /dev/sda5 314 314 345 257008+ 83 Linux native /dev/sda6 346 346 353 64228+ 83 Linux native /dev/sda7 354 354 438 682731 6 DOS 16-bit>32M /dev/sda8 439 439 522 674698+ 6 DOS 16-bit>32M Sind die Fehlermeldungen nicht verschwunden, so haben Sie noch nicht die richtig en Werte ermittelt. Wiederholen Sie das Eintragen neuer Werte solange, bis die Fehlermeldungen verschwunden sind und vergessen Sie nicht, sich diese Werte in Ihren Hardwareunterlagen zu notieren. Nach der Eingabe der korrekten Werte im Expert-Modus können Sie mit "fdisk" normal weiterarbeiten. Beachten Sie, daß Sie die Werte im Expert-Modus leider jedesmal neu eingeben müssen, sobald Sie "fdisk" aufrufen, da diese nirgendwo zwischengespeichert werden. Wollen Sie auch "lilo" einsetzen, um Linux direkt von Festplatte booten zu können, so müssen Sie noch die richtigen Einträge für die Datei "/etc/disktab" bestimmen. Diese erhalten Sie, wenn Sie mit "u" die "fdisk"-Anzeige der Partitionierung von Units nach Sektoren umstellen. Diese Sektorangaben entsprechen den Blockangaben des LBA-Modus. Command (m for help): u Changing display/entry units to sectors Lassen Sie sich dann erneut die Partitionstabelle ausgeben: Command (m for help): p Disk /dev/sda: 255 heads, 63 sectors, 522 cylinders Units = sectors of 1 * 512 bytes Device Boot Begin Start End Blocks Id System /dev/sda1 63 63 1542239 771088+ 6 DOS 16-bit>32M /dev/sda2 * 1542240 1542240 4000184 1228972+ 82 Linux swap /dev/sda3 4000185 4000185 5028344 514080 a5 BSD/386 /dev/sda4 5028345 5028345 8385929 1678792+ 5 Extended /dev/sda5 5028408 5028408 5542424 257008+ 83 Linux native /dev/sda6 5542488 5542488 5670944 64228+ 83 Linux native /dev/sda7 5671008 5671008 7036469 682731 6 DOS 16-bit>32M /dev/sda8 7036533 7036533 8385929 674698+ 6 DOS 16-bit>32M Sie sehen, daß jetzt Start, Größe und Ende der Partitionen nicht mehr in Zylindern, sondern in Sektoren (die Linux zum Zugriff auf die Festplatte verwendet) angegeben sind. Tragen Sie diese Sektorwerte nun in die Datei "/etc/disktab" ein. Die Einträge in dieser Datei sollten dann für unser Beispiel folgendermaßen aussehen: # Dev. BIOS Secs/ Heads/ Cylin Part. # num. code track cylin. ders offset 0x801 0x80 63 255 522 63 # /dev/sda1 0x802 0x80 63 255 522 1542240 # /dev/sda2 0x803 0x80 63 255 522 4000185 # /dev/sda3 0x805 0x80 63 255 522 5028408 # /dev/sda5 0x806 0x80 63 255 522 5542488 # /dev/sda6 0x807 0x80 63 255 522 5671008 # /dev/sda7 0x808 0x80 63 255 522 7036533 # /dev/sda8 Hoffentlich hat Sie dieses Vorgehen jetzt nicht zu sehr verwirrt. Wir können Ihnen nicht garantieren, daß diese Methode für jeden Kontroller zum gewünschten Ergebnis führt, aber das prinzipiell notwendige Vorgehen sollte Ihnen durch dieses Beispiel doch etwas klarer geworden sein.