Anterior Siguiente Indice

6. Consecuencias

¿Qué significa todo esto? Para los usuarios de Linux tan sólo una cosa: deben de asegurarse de que LILO y fdisk usan la geometría correcta, donde `correcta' se define para fdisk como la misma geometría usada por los otros sistemas operativos presentes en el mismo disco, y para LILO como la geometría que hará posible una interacción exitosa con la BIOS en el momento del arranque. (Normalmente ambos coinciden).

¿Cómo averigua fdisk la geometría? Pregunta al núcleo, empleando la llamada ioctl HDIO_GETGEO. No obstante, el usuario puede interponerse a dicha geometría, interactivamente o en la línea de comandos.

¿Cómo averigua LILO la geometría? Pregunta al núcleo, usando la llamada ioctl HDIO_GETGEO. No obstante, el usuario puede descartar dicha geometría empleando la opción `disk='. Se puede pasar también la opción linear a LILO, que almacenará en tal caso direcciones LBA en lugar de CHS en su fichero de mapeo, averiguando la geometría a usar al arrancar (mediante el empleo de de la INT13, función 8 para preguntar la geometría del disco).

Cómo sabe el núcleo qué responder? Veamos, para comenzar, el usuario puede haber especificado una geometría explícitamente con la opción, en la línea de comandos N del T: Al prompt de LILO, el ``LILO boot:'' que aparece al encender el ordenador si LILO está instalado. `hd=cyls,heads,secs'. En cualquier caso distinto, el núcleo preguntará al hardware.

6.1 Detalles IDE

Permítame elaborar. El controlador N del T: ``driver'' en el original, software IDE tiene cuatro fuentes de información acerca de la geometría. La primera, (G_user) es la especificada por el usuario en la línea de comandos. La segunda (G_bios) es la Tabla de Parámetros de Disco Duro de la BIOS. (para el primer y segundo disco solamente). Esto se lee al arrancar el sistema, antes de cambiar a modo 32 bits. La tercera (G_phys) y cuarta (G_log) son proporcionadas por la controladora IDE como respuesta al comando IDENTIFY --son las geometrías ``físicas'' y ``lógicas actuales''--.

Por otra parte, el controlador (driver, software;) precisa dos valores para la geometría: por una parte G_fdisk, devuelto por la llamada ioctl HDIO_GETGEO, y por otra, G_used que es empleada actualmente para las operaciones de E/S. Tanto G_fdisk como G_used son inicializadas a G_used si se especifica éste, a G_bios cuando dicha información está presente de acuerdo a la CMOS, y a G_phys en los demás casos. Si G_log parece razonable, entonces G_used se inicializa como él. En cualquier otro caso, si G_used no parece razonable y sí lo parece G_phys, entonces G_used se inicializa a G_phys. `Razonable' aquí significa que el número de cabezas esté en el rango 1-16.

Dicho con otras palabras: la línea de comandos descarta la BIOS, y determinará lo que fdisk va a ver, pero si especifica una geometría que ya ha sufrido traslación, (más de 16 cabezas), para operaciones de E/S a nivel núcleo será sustituida por lo retornado por el comando IDENTIFY.

6.2 Detalles SCSI

La situación para los discos SCSI es ligeramente diferente, ya que los comandos SCSI usan ya números de bloque lógicos, por lo que la `geometría' es completamente irrelevante para las operaciones de E/S.

No obstante, el formato de la tabla particiones continúa siendo el mismo, por lo que fdisk tendrá que inventarse alguna geometría, y también usará HDIO_GETGEO aquí --de hecho, fdisk no distingue entre discos IDE o SCSI--. Como uno puede ver a raíz de la descripción detallada anterior, los distintos drivers inventan cada uno, una geometría diferente de algún modo. Un gran follón, de hecho.

Si no usa DOS o similar, evite todas las configuraciones con traslación extendida, empleando simplemente 64 cabezas, y 32 sectores por pista (para un bonito y práctico 1 MB por cilindro), si es posible, de modo que no aparezcan problemas cuando cambie el disco de una controladora a otra.

Algunos controladores de discos SCSI (aha152x, pas16, ppa, qlogicfas, qlogicisp) son tan paranoicos con la compatibilidad con DOS que no permitirán a un sistema sólo-Linux emplear más de 8Gb. Esto es un fallo.

¿Qué es ``geometría real''? La respuesta más sencilla es que no existe tal cosa. Y si la hubiese, no debería querer saberla, y desde luego NUNCA, JAMÁS decírsela a LILO o fdisk.

Esto es un asunto a tratar exclusivamente entre la controladora SCSI y el disco. Permítame repetírselo: sólo los tontos le dicen a fdisk/LILO/kernel la verdadera geometría de un disco SCSI.

Si aún así es usted curioso e insiste, debería preguntarle al propio disco. Existe el importante comando READ CAPACITY que proporcionará el tamaño total del disco, así como existe el comando MODE SENSE, que proporciona el número de cilindros y cabezas (información que no puede ser cambiada) de la Página de Geometrías de Disco Duro (página 04), y que extrae de la Página de Formateo (página 03) el número de de bytes por sector, así como de sectores por pista. Este último número es típicamente dependiente de las marcas N del T: No marca comercial, marca física. , variando el número de sectores por pista --las pistas externas tienen más sectores que las internas.

El programa Linux scsiinfo proporcionará esta información. Existen más detalles y complicaciones, pero está claro que nadie (probablemente ni siquiera el sistema operativo) quiere usar esta información.

Más aún, en lo que a nosotros concierne respecto a fdisk y LILO, obtendremos respuestas típicamente como C/H/S=4476/27/171 --valores que no pueden ser empleados por fdisk porque la tabla de particiones reserva sólo 10/8/6 bits para C/H/S.

¿Entonces de dónde averigua la llamada al kernel HDIO_GETGEO su información? O bien de la controladora SCSI, o bien mediante cultas averiguaciones. Algunos controladores parecen pensar que queremos saber la `realidad', pero por supuesto lo único que queremos saber es qué utilizarán los FDISK de DOS u OS/2 (o el AFDISK de Adaptec, etc).

Nótese que el fdisk de Linux necesita los números H y S de las cabezas y sectores por pista para convertir de números de sectores LBA a localizaciones c/h/s, pero el número C de cilindros no tienen nada que ver en esta conversión. Algunos controladores usan (C,H,S) = (1023,255,63) para indicar que la capacidad del disco es al menos 1023*255*63 sectores. Esto no resulta muy afortunado, ya que no revela la capacidad actual, y limitará a los usuarios de la mayoría de las versiones de fdisk a alrededor de 8 Gb máximo en sus discos --una verdadera limitación hoy en día--.

En la descripción que sigue, M denota la capacidad total del disco, y C, H, S el número de cilindros, cabezas y sectores por pista. Basta con proporcionar H, S si tenemos en cuenta a C como definido por M / (H*S).

Por defecto, H=64, S=32.

aha1740, dtc, g_NCR5380, t128, wd7000:

H=64, S=32.

aha152x, pas16, ppa, qlogicfas, qlogicisp:

H=64, S=32 a menos que C > 1024, en cuyo caso H=255, S=63, C = min(1023, M/(H*S)). (C por tanto es truncado, y H*S*C no es una aproximación a la capacidad del disco M. Esto causará confusión en la mayoría de las versiones de fdisk.) El código ppa.c emplea M+1 en lugar de M y dice que ello se debe a un error en sd.c, en el que a M le falta 1.

advansys:

H=64, S=32 a menos que C > 1024 y más aún si la opción `> 1 GB' está activado en la BIOS, en cuyo caso H=255, S=63.

aha1542:

Pregunte a la controladora cuál de los dos esquemas de traslación posibles está en uso, y emplee tanto H=255, S=63 como H=64, S=32. En el último caso habrá un mensaje al arrancar: "aha1542.c: Using extended bios translation".

aic7xxx:

H=64, S=32 a menos que C > 1024, y además o bien el parámetro de arranque "extended" haya sido especificado en el arranque, o si el bit "extended" ha sido especificado en la SEEPROM o BIOS, en cuyo caso H=255, S=63.

buslogic:

H=64, S=32 a menos que C >= 1024, y que además se haya configurado la controladora para hacer traslaciones extendidas, en cuyo caso si M < 2^22 entonces H=128, S=32; de otro modo, H=255, S=63. No obstante, tras hacer esta elección para (C,H,S), se lee la tabla de particiones, y si para alguna de las tres posibilidades (H,S) = (64,32), (128,32), (255,63) el valor endH=H-1 aparece por alguna parte, entonces es usado dicho par (H,S), y un mensaje será mostrado al arranque: "Adopting Geometry from Partition Table".

fdomain:

Averigüe la información acerca de la geometría de la Tabla de Parámetros de Disco de la BIOS, o lea la tabla de particiones y use H=endH+1, S=endS para la primera partición, teniendo en cuenta que no esté vacía, o use H=64, S=32 para M < 2^21 (1 GB), H=128, S=63 para M < 63*2^17 (3.9 GB) y S=63 en otro caso.

in2000:

Emplee los primeros (H,S) = (64,32), (64,63), (128,63), (255,63) que hagan que C <= 1024. En el último caso, trunque C a 1023. Use los primeros de (H,S) = (64,32), (64,63), (128,63), (255,63)

seagate:

Lea C,H,S del disco. (¡Horror!) Si C o S es demasiado grande, ponga S=17, H=2 y vaya doblando H hasta que C <= 1024. Esto significa que H será establecida a 0 si M > 128*1024*17 (1.1 GB). Esto es un error de programación (bug).

ultrastor y u14_34f:

Uno de los tres mapeos ((H,S) = (16,63), (64,32), (64,63)) es empleado dependiendo del modo de mapeo de la controladora.

Si el driver no especifica la geometría, volveremos a realizar una averiguación inteligente usando la tabla de particiones, o usando la capacidad total del disco.

Mire la tabla de particiones. Dado que por convención las particiones terminan en el límite de un cilindro, podemos, dado un end = (endC,endH,endS) de una partición, poner simplemente H = endH+1 y S = endS. (Recuerde que los sectores son numerados a partir de 1). De un modo más preciso, se hace lo siguiente: Si hay alguna partición que no esté vacía, escoja la partición con el beginC mayor. Para dicha partición, mire a end+1, calculados ambos añadiendo start y length y asumiendo que estas particiones terminan en los límites de un cilindro. Si ambos valores concuerdan, o si endC = 1023 y start+length es múltiplo integral de (endH+1)*endS, asuma entonces que dicha partición está realmente alineada con el límite de un cilindro, y ponga H = endH+1 y S = endS.

Si esto falla, bien debido a que no hay particiones, o porque poseen tamaños extraños, tenga en cuenta entonces únicamente la capacidad del disco M. Algoritmo: ponga H = M/(62*1024) (redondeando hacia arriba), S = M/(1024*H) (redondeando hacia arriba), C = M/(H*S) (redondeando hacia abajo).

Esto tiene el efecto de producir un (C,H,S) con C siendo como mucho 1024 y S como mucho 62.


Anterior Siguiente Indice