Next Previous Contents

10. Λεπτομέρειες

10.1 IDE - οι επτά γεωμετρίες

Ο IDE οδηγός έχει πέντε πηγές πληροφοριών για τη γεωμετρία. Η πρώτη (G_user) είναι αυτή που δηλώνεται από τον χρήστη στη γραμμή εντολών. Η δεύτερη (G_bios) είναι ο πίνακας παραμέτρων δίσκων του BIOS (Fixed Disk Parameter Table) (για τον πρώτο και δεύτερο δίσκο μόνο) που διαβάζεται κατά την εκκίνηση του συστήματος, πριν την αλλαγή σε λειτουργία 32-bit. Η τρίτη (G_phys) και τέταρτη (G_log) επιστρέφονται από τον ελεγκτή IDE ως απάντηση στην εντολή IDENTIFY - είναι η `φυσική' και `τρέχουσα λογική' γεωμετρία αντίστοιχα.

Από την άλλη, ο οδηγός χρειάζεται δύο τιμές για τη γεωμετρία: από τη μία την G_fdisk, που επιστρέφεται από το HDIO_GETGEO ioctl, και από την άλλη την G_used, που χρησιμοποιείται για το πραγματικό I/O. Και οι δύο χρησιμοποιούν το G_user εάν έχει δοθεί, το G_bios όταν αυτές οι πληροφορίες είναι διαθέσιμες σύμφωνα με το CMOS, ή το G_phys αν κανένα από τα προηγούμενα δεν είναι διαθέσιμο. Εάν το G_log φαίνεται λογικό τότε το G_used ρυθμίζεται σε αυτό. Διαφορετικά, αν το G_used δεν είναι σωστό και το G_phys φαίνεται λογικό χρησιμοποιείται το G_phys για να ρυθμιστεί το G_used. `Λογικό' σημαίνει ότι ο αριθμός των κεφαλών είναι 1-16.

Με άλλα λόγια: η γραμμή εντολών υπερβαίνει το BIOS, και θα καθορίσει τί θα δει το fdisk, αλλά αν καθορίζει την μεταφραζόμενη γεωμετρία (με παραπάνω από 16 κεφαλές), για το Ι/Ο του πυρήνα θα χρησιμοποιηθούν οι τιμές της εντολής IDENTIFY.

Σημειώστε ότι το G_bios είναι αρκετά αναξιόπιστο: για συστήματα που ξεκινάνε με SCSI ο πρώτος και δεύτερος δίσκος μπορούν να είναι SCSI και η γεωμετρία που αναφέρει το BIOS για sda μπορεί να χρησιμοποιηθεί από τον πυρήνα για τα hda. Επίσης, οι δίσκοι που δεν αναφέρονται στο setup του BIOS δεν βλέπονται από το BIOS. Αυτό σημαίνει ότι, π.χ., σε ένα σύστημα με IDE δίσκους μόνο, αν το hdb δε δοθεί στο BIOS setup, η γεωμετρία που αναφέρεται από το BIOS για τον πρώτο και δεύτερο δίσκο θα χρησιμοποιηθεί για τα hda και hdc.

10.2 SCSI λεπτομέρειες

Στην περίπτωση του SCSI τα πράγματα είναι λίγο διαφορετικά, αφού οι SCSI εντολές ήδη χρησιμοποιούν λογικούς αριθμούς, ώστε η `γεωμετρία' είναι τελείως άσχετη από το Ι/Ο. Παρόλα αυτά, ο πίνακας κατατμήσεων είναι ίδιος, και έτσι το fdisk πρέπει να βρει τη γεωμετρία, ενώ χρησιμοποιεί και το HDIO_GETGEO. Ακόμη, το fdisk δεν διαχωρίζει μεταξύ των IDE και SCSI δίσκων. Όπως θα δείτε από την παρακάτω περιγραφή, οι διάφοροι οδηγοί χρησιμοποιούν ο καθένας κάπως διαφορετική γεωμετρία. Αρκετά μπερδεμένη κατάσταση.

Αν δεν χρησιμοποιείτε το DOS, τότε αποφύγετε όλες τις ρύθμισης των μεταφράσεων, χρησιμοποιείστε 64 κεφαλές, 32 τομείς/ίχνος (για ένα βολικό 1 MiB ανά κύλινδρο), αν είναι δυνατόν, ώστε να μην έχετε προβλήματα όταν μεταφέρετε τον δίσκο από τον έναν ελεγκτή στον άλλο. Μερικοί SCSI οδηγοί (aha152x, pas16, ppa, qlogicfas, qlogicisp) για να διατηρήσουν συμβατότητα με το DOS δε θα σας επιτρέψουν να χρησιμοποιήσετε πάνω από 8 GiB ακόμα και σε σύστημα με μόνο Linux. Αυτό είναι bug.

Ποια είναι η πραγματική γεωμετρία; Η ευκολότερη απάντηση είναι ότι δεν υπάρχει. Ακόμα κι αν υπήρχε, δε θέλετε να την ξέρετε και σίγουρα ΠΟΤΕ δε θα πείτε στο fdisk ή το LILO ή τον πυρήνα ποια είναι. Είναι καθαρά μεταξύ του SCSI ελεγκτή και του δίσκου. Να το επαναλάβω: μόνο κάποιος ανόητος λέει στα fdisk/LILO/kernel την πραγματική γεωμετρία ενός SCSI δίσκου.

Αλλά αν είστε περίεργοι και επιμένετε μπορείτε να ρωτήσετε τον δίσκο. Υπάρχει η σημαντική εντολή READ CAPACITY που θα δώσει το μέγεθος του δίσκου και υπάρχει και η MODE SENSE εντολή που στη σελίδα Rigid Disk Drive Geometry (04) δίνει τον αριθμό των κεφαλών και των κυλίνδρων (αυτά δε μπορούν να αλλάξουν) και στη σελίδα Format (03) δίνει τον αριθμό των bytes ανά τομέα και τομέων ανά ίχνος. Το τελευταίο νούμερο δεν είναι σταθερό, αφού ο αριθμός τομέων/ίχνος εξαρτάται από την περιοχή του δίσκου: στο εξωτερικό του δίσκου υπάρχουν περισσότεροι τομείς/ίχνος. Το πρόγραμμα scsiinfo στο Linux θα σας δώσει αυτές τις πληροφορίες. Υπάρχουν πολλές λεπτομέρειες και επιπλοκές και είναι ξεκάθαρο ότι κανείς (ούτε και το ίδιο το λειτουργικό) δε θέλει να ξέρει. Ακόμη, εφόσον μας ενδιαφέρει το fdisk και το LILO, η συνήθεις απαντήσεις είναι του τύπου C/H/S=4476/27/171 - τιμές που δε μπορούν να χρησιμοποιηθούν από το fdisk αφού ο πίνακας κατατμήσεων χρησιμοποιεί 10/8/6 bits για τα C/H/S.

Και τότε από που το HDIO_GETGEO βρίσκει τις πληροφορίες; Από τον ελεγκτή SCSI ή κάνοντας μια εκτίμηση. Μερικοί οδηγοί νομίζουν ότι θέλουμε την πραγματική γεωμετρία αλλά, φυσικά, θέλουμε μόνο ό,τι το DOS ή το fdisk του OS/2 (ή το AFDISK της Adaptec, κλπ) χρησιμοποιούν.

Σημειώστε ότι το fdisk του linux χρειάζεται τον αριθμό κεφαλών και τομέων/ίχνος Η και S για να μετατρέψει LBA νούμερα σε c/h/s αλλά ο αριθμός των κυλίνδρων C δεν χρειάζεται. Μερικοί οδηγοί χρησιμοποιούν (C,H,S) = (1023,255,63) για να δείξουν ότι η χωρητικότητα του δίσκου είναι τουλάχιστον 1023*255*63 sectors. Αυτό είναι ατυχές, αφού δεν μας δίνει το πραγματικό μέγεθος και θα περιορίσει τα περισσότερα fdisk σε περίπου 8 GiB - ένας αρκετά σοβαρός περιορισμός.

Στην περιγραφή παρακάτω, το Μ δηλώνει την συνολική χωρητικότητα του δίσκου και C, H, S ο αριθμός των κυλίνδρων, κεφαλών και τομείς/ίχνος. Αρκούν τα H, S αν χρησιμοποιήσουμε το C ως M / (H*S).

Κατά σύμβαση, H=64, S=32.

aha1740, dtc, g_NCR5380, t128, wd7000:

H=64, S=32.

aha152x, pas16, ppa, qlogicfas, qlogicisp:

H=64, S=32 εκτός εάν C > 1024, οπότε H=255, S=63, C = min(1023, M/(H*S)). (Το C συμπτύσσεται και το H*S*C δεν είναι προσέγγιση του M. Αυτό θα μπερδέψει τις περισσότερες εκδόσεις του fdisk.) Το ppa.c χρησιμοποιεί M+1 αντί του M και λέει ότι αυτό είναι λόγω ενός bug στο sd.c, όπου το M είναι εκτός κατά 1.

advansys:

H=64, S=32 εκτός αν C > 1024 και ακόμη η επιλογή `> 1 GB' του BIOS είναι ενεργοποιημένη, οπότε H=255, S=63.

aha1542:

Ρωτήστε τον ελεγκτή ποια από τις δυο μεταφράσεις χρησιμοποιεί και χρησιμοποιήστε είτε H=255, S=63 ή H=64, S=32. Στην πρώτη περίπτωση θα δείτε κατά την εκκίνηση "aha1542.c: Using extended bios translation".

aic7xxx:

H=64, S=32 εκτός αν C > 1024, και είτε η επιλογή "extended" κατά την εκκίνηση δίνεται ή το `extended' bit χρησιμοποιείται στα SEEPROM ή BIOS, οπότε H=255, S=63. Στο Linux 2.0.36 αυτή η μετάφραση πάντα χρησιμοποιείται αν δε βρεθεί SEEPROM, αλλά στο Linux 2.2.6 αν δε βρεθεί SEEPROM ή μετάφραση χρησιμοποιείται αν ο χρήστης το επιθυμεί, χρησιμοποιώντας την παράμετρο εκκίνησης (αν βρεθεί SEEPROM, η παράμετρος αγνοείται). Αυτό σημαίνει ότι το setup που δουλεύει στο 2.0.36 μπορεί να μην εκκινήσει στο 2.2.6 (και να απαιτεί την επιλογή `linear' στο LILO, ή την παράμετρο `aic7xxx=extended' στον πυρήνα).

buslogic:

H=64, S=32 εκτός εάν C >= 1024, και η extended μετάφραση ενεργοποιήθηκε στον ελεγκτή, οπότε αν M < 2^22 τότε H=128, S=32; αλλιώς H=255, S=63. Όμως, αφού γίνει αυτή η επιλογή για (C,H,S), ο πίνακας κατατμήσεων διαβάζεται και αν για τις τρεις πιθανότητες (H,S) = (64,32), (128,32), (255,63) η τιμή τελικόH=H-1 βρεθεί, εκείνο το ζευγάρι (H,S) χρησιμοποιείται, και το μήνυμα "Adopting Geometry from Partition Table" τυπώνεται κατά την εκκίνηση.

fdomain:

Βρείτε τη γεωμετρία στις παραμέτρους δίσκων του BIOS, ή διαβάστε τον πίνακα κατατμήσεων και χρησιμοποιήστε H=τελευταίοH+1, S=τελευταίοS για την πρώτη κατάτμηση, εφόσον είναι άδεια, ή χρησιμοποιήστε H=64, S=32 για M < 2^21 (1 GiB), H=128, S=63 για M < 63*2^17 (3.9 GiB) και H=255, S=63 διαφορετικά.

in2000:

Χρησιμοποιήστε το πρώτο από τα (H,S) = (64,32), (64,63), (128,63), (255,63) που θα δώσει C <= 1024. Στην τελευταία περίπτωση, κόφτε το C σε 1023.

seagate:

Διαβάστε τα C,H,S από τον δίσκο. Εάν το C ή S είναι πολύ μεγάλο, τότε βάλτε S=17, H=2 και διπλασιάστε το H μέχρι C <= 1024. Αυτό σημαίνει ότι το H θα είναι 0 αν M > 128*1024*17 (1.1 GiB). Αυτό είναι bug.

ultrastor and u14_34f:

Ένα από τα τρία (H,S) = (16,63), (64,32), (64,63) χρησιμοποιείται, ανάλογο με τον τρόπο λειτουργίας του ελεγκτή.

Αν ο οδηγός δεν δίνει τη γεωμετρία, μαντεύουμε χρησιμοποιώντας τον πίνακα κατατμήσεων ή χρησιμοποιώντας την συνολική χωρητικότητα.

Κοιτάξτε τον πίνακα κατατμήσεων. Εφόσον, κατά σύμβαση, οι κατατμήσεις τελειώνουν σε όριο κυλίνδρους, μπορούμε, με δεδομένο ότι όριο = (τελικόC,τελικόH,τελικόS) για οποιαδήποτε κατάτμηση, απλά βάζουμε H = τελικόH+1 και S = τελικόS. (Θυμηθείτε ότι οι τομείς μετριούνται από το 1.) Με περισσότερες λεπτομέρειες, γίνονται τα παρακάτω. Αν δεν υπάρχει ελεύθερη κατάτμηση, διαλέγουμε την κατάτμηση με το μεγαλύτερο αρχικόC. Για αυτή την κατάτμηση, κοιτάμε το τελικό+1, υπολογισμένο προσθέτοντας τα αρχή και μήκος και υποθέτοντας ότι η κατάτμηση τελειώνει σε όριο κυλίνδρου. Αν και οι δυο τιμές συμφωνούν ή αν τελικόC = 1023 και αρχή+μήκος είναι ακέραιο πολλαπλάσιο του (τελικόH+1)*τελικόS, τότε υποθέτουμε ότι η κατάτμηση είναι όντως ευθυγραμμισμένη με το όριο του κυλίνδρου, και βάζουμε H = τελικόH+1 και S = τελικόS. Αν αυτό αποτύχει, είτε επειδή δεν υπάρχουν κατατμήσεις, είτε επειδή έχουν περίεργες τιμές, τότε κοιτάμε πάλι μόνο τη χωρητικότητα του δίσκου Μ. Αλγόριθμος: βάζουμε H = M/(62*1024) (στρογγυλοποιημένο κατά πάνω), S = M/(1024*H) (στρογγυλοποιημένο πάνω), C = M/(H*S) (στρογγυλοποίηση κάτω). Αυτό έχει το αποτέλεσμα να έχουμε τα (C,H,S) με το C το πολύ 1024 και το S το πολύ 62.


Next Previous Contents