1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320
|
Large Disk HOWTO
Andries Brouwer, aeb@cwi.nl
v2.2j, 25 Novembre 1999
Notizie fondamentali sulla geometria dei dischi e sul limite dei 1024
cilindri. Traduzione di Gianluca Vezz, vezzu@tin.it.
Per la versione pi recente visitate l'URL www.win.tue.nl.
1. La problematica
Facciamo l'ipotesi di avere un disco che abbia pi di 1024 cilindri.
Ipotizziamo inoltre di avere un sistema operativo che utilizzi la
vecchia interfaccia all'I/O del disco fornita dall'INT13. Avremo
allora un problema perch tale interfaccia per indirizzare le
operazioni di I/O su di un generico cilindro impiega un campo a 10
bit, pertanto i cilindri dal 1024 in poi sono inaccessibili.
Per fortuna Linux non utilizza le chiamate al BIOS, eliminando cos
ogni eventuale problema alla radice.
Purtroppo le cose non vanno bene in due casi:
(1) Quando fate il boot Linux non sta ancora girando e quindi non pu
preservarvi dai problemi derivanti dal BIOS. Ci ha delle
ripercussioni per LILO e per analoghi boot loader.
(2) necessario che tutti i sistemi operativi installati sullo stesso
disco concordino sulla locazione delle partizioni. In altri termini,
se utilizzate, sia Linux che, per esempio, DOS, entrambi i sistemi
operativi devono interpretare la tabella delle partizioni nello stesso
modo. Ci comporta delle conseguenze per il kernel di Linux e per
fdisk.
Appresso si riporta una descrizione dettagliata di tutti gli argomenti
pi importanti. Prestate attenzione al fatto che come riferimento ho
utilizzato la versione 2.0.8 del kernel. Le altre versioni possono
avere delle leggere differenze.
2. Sommario
Hai appena acquistato un nuovo disco. Che fare adesso? Bene, dal
punto di vista software usi fdisk (o meglio ancora cfdisk) per creare
le partizioni, poi mke2fs per creare il filesystem, e per finire mount
per attaccare il nuovo filesystem a quello esistente.
Non hai bisogno di leggere questo HOWTO perch non ci sono pi
problemi con gli hard disk di grandi dimensioni attuali. La maggior
parte di quelli che sembrano essere problemi dovuta agli utenti che
pensano che ci possa essere un problema e quindi installano un gestore
dei dischi, o entrano nella modalit avanzata di fdisk, o specificano
esplicitamente la geometria del disco a LILO o la passano al kernel da
riga di comando.
Tuttavia, le tipologie di problemi pi comuni sono: (i) hardware
obsoleto, (ii) presenza di sistemi operativi sullo stesso disco e
qualche volta (iii) la fase di boot.
Consigli:
Dischi SCSI di grandi dimensioni: Linux li supporta sin dalle prime
versioni. Non richiesta nessuna azione specifica.
Dischi IDE di grandi dimensioni (superiori agli 8.4 GB): procurati un
kernel stabile recente (2.0.34 o superiore). Di norma tutto dovrebbe
procedere bene, specialmente se sarete cos saggi da non chiedere al
BIOS la traslazione del disco con la LBA o con accorgimenti simili.
Dischi IDE di grandissime dimensioni (superiori ai 33.8 GB): vai alla
sezione ``Problemi dei controller IDE con dischi di dimensioni oltre i
34 GB''. Se LILO si blocca in fase di boot specifica l'opzione
``linear'' nel file di configurazione /etc/lilo.conf.
Ci sono dei problemi legati alla geometria che possono essere risolti
fornendo esplicitamente la geometria al kernel/LILO/fdisk.
Se utilizzate una versione datata di fdisk e vi d un avviso di
``overlapping'' partitions: ignorate i messaggi, oppure controllate
con cfdisk che sia tutto a posto.
Se pensate che la dimensione del vostro disco sia sbagliata fate
attenzione a non confondere le ``unit di misura'' binarie con quelle
decimali e tenete presente che lo spazio libero che df riporta in un
disco vuoto di qualche percento pi piccolo della dimensione della
partizione perch c' dello spazio riservato alle funzionalit di
amministrazione.
Ora se pensate ancora che ci siano dei problemi o se pi semplicemente
siete curiosi proseguite nella lettura.
3. Unit di Misura e Dimensioni
Un kilobyte (kB) corrisponde a 1000 byte. Un megabyte (MB)
corrisponde a 1000 kB. Un gigabyte (GB) corrisponde a 1000 MB. Un
terabyte (TB) corrisponde a 1000 GB. Questa la definizione delle
unit di misura nel sistema internazionale (SI). Tuttavia ci sono
persone che considerano 1 MB=1024000 byte e parlano di dischetti da
1.44 MB e altre che pensano che 1 MB=1048576 byte. Nel presente
documento seguir lo standard attuale e scriver Ki, Mi, Gi, Ti per
indicare le unit binarie, cos che i floppy hanno dimensioni di 1440
KiB (1.47 MB, 1.41 MiB), 1 MiB sono 1048576 byte (1.05 MB), 1 GiB sono
1073741824 byte (1.07 GB) e 1 TiB sono 1099511627776 byte (1.1 TB).
I produttori di hard disk seguono il sistema SI utilizzando quindi la
notazione decimale. I messaggi in fase di avvio di Linux e qualche
programma come fdisk utilizzano i simboli MB e GB ad indicare
l'utilizzo della notazione binaria o l'utilizzo di una notazione mista
binaria/decimale. Prima di dire d'avere un disco pi piccolo di
quanto dichiarato dal costruttore calcolate la sua dimensione nelle
unit decimali (o pi semplicemente in byte).
A proposito della terminologia e delle abbreviazioni adottate per
specificare le unit binarie, Knuth ha suggerito una notazione
alternativa,nello specifico propone di utilizzare KKB, MMB, GGB, TTB,
PPB, EEB, ZZB, YYB e di definirli come kilobyte esteso, megabyte
esteso, ... yottabyte esteso. Lui stesso ha scritto: `Prestate
attenzione al fatto che raddoppiando le lettere si identifica sia la
natura binaria che quella di grande dimensione'. Questa una buona
proposta - `gigabyte esteso' suona meglio di `gibibyte'. Per i nostri
scopi la sola cosa importante sottolineare che un megabyte contiene
1000000 di byte e che necessario utilizzare qualche altro termine ed
abbreviazione se si sottointende qualcosa di diverso.
3.1. Dimensione dei Settori
In questa trattazione si assume che un settore abbia dimensione pari a
512 byte. Questa assunzione quasi sempre vera, ma, per esempio,
certi dischi MO (MagnetoOttici) utilizzano settori di 2048 byte.
Quindi tutte le capacit elencate sopra devono essere moltiplicate per
quattro (quando utilizzate fdisk su questi dischi controllate di avere
la versione 2.9i o superiore e date l'opzione `-b 2048).
3.2. Dimensione del Disco
Un disco con C cilindri, H testine e S settori per traccia ha C*H*S
settori totali e pu memorizzare C*H*S*512 byte. Per esempio, se
l'etichetta del disco riporta C/H/S=4092/16/63 allora il disco ha
4092*16*63=4124736 settori e pu contenere 4124736*512=2111864832 byte
(2.11 GB). C' un'accordo industriale per assegnare ai dischi pi
grandi di 8.4 GB le dimensioni C/H/S=16383/16/63, cos la dimensione
del disco non pu pi essere letta dalla terna di valori C/H/S
riportata dal disco.
4. Accesso al Disco
Per poter leggere o scrivere qualsiasi cosa su un disco occorre
specificare una posizione sul disco stesso per esempio indicando il
numero del settore o del blocco. Se il disco SCSI il numero del
settore viene passato al controller SCSI ed capito dal disco. Se il
disco un IDE che utilizza la modalit LBA si ha la stessa cosa. Ma
se il disco obsoleto, RLL o MFM o IDE senza supporto LBA allora
l'hardware del disco si aspetta una terna (cilindro,testina,settore)
per individuare il punto desiderato sul disco.
La corrispondenza tra la numerazione lineare e la terna di tre cifre
di seguito mostrata. Per un disco con C cilindri, H testine e S
settori/traccia la posizione indicata dalla notazione come terna o CHS
(c,h,s) la stessa di quella indicata dalla notazione lineare o LBA
c*H*S + h*S + (s-1) (la sottrazione di una unit legata al fatto che
nella notazione come terna i settori sono contati a partire da 1 e non
da 0).
Concludendo possiamo dire che per accedere ad un disco non SCSI
obsoleto necessario conoscerne la sua geometria ossia i valori C, H
e S.
4.1. Accesso BIOS al Disco e il Limite dei 1024 cilindri
Al contrario di altri sistemi Linux non utilizza il BIOS. Il BIOS,
antecedente all'LBA, fornisce le routine di I/O su disco attraverso
l'INT13 che prevedono come ingresso la terna (c,h,s) (pi
precisamente: AH seleziona la funzione da utilizzare, CH contiene gli
8 bit bassi del numero dei cilindri, CL contiene nei bit 7-6 i due bit
alti del numero dei cilindri e nei bit 5-0 il numero del settore, DH
contiene il numero delle testine e DL contiene il numero
identificativo del drive (80h or 81h). Questo spiega una parte dello
schema della tavola delle partizioni).
Noi abbiamo la terna CHS codificata su tre byte in cui 10 bit sono per
il numero dei cilindri, 8 per le testine e 6 per il numero dei settori
(numerati da 1 a 63). Da ci risulta come il numero dei cilindri
possa variare da 0 a 1023 e come il BIOS non sia in grado di
indirizzare pi di 1024 cilindri.
I programmi per DOS e Windows non sono stati modificati quando sono
stati introdotti i dischi IDE con il supporto LBA cos sia il DOS che
Windows continuano ad aver bisogno della geometria del disco solo per
poter dialogare con il BIOS, pur non essendo necessaria per le
operazioni di I/O. Questo significa che Linux ha bisogno di conoscere
la geometria del disco in quei sistemi ove sia richiesto il dialogo
tra BIOS e altri sistemi operativi presenti, anche con un disco
attuale.
Questi problemi sono iniziati pi o meno circa quattro anni fa, quando
apparvero dischi che non potevano essere indirizzati dalle funzioni
dell'INT13 (perch i 10+8+6=24 bits della terna (c,h,s) non possono
indirizzare pi di 8.5 GB) e fu quindi progettata una nuova
interfaccia per il BIOS: la cosidetta INT13 Estesa dove DS:SI punta ad
un Disk Address Packet di 16 byte che contiene un numero assoluto di
inizio blocco di 8 byte.
Molto lentamente il mondo Microsoft sta traghettando verso l'utilizzo
delle funzioni fornite dall'INT13 Esteso. Probabilmente fra pochi
anni nessun sistema moderno equipaggiato con hardware moderno
necessiter pi del concetto di "geometria del disco".
4.2. Storia del BIOS e dei limiti dell'IDE
Specifiche ATA (per dischi IDE) - il limite dei 137 GB
65536 cilindri (numerati da 0-65535), 16 testine (numerate da
0-15), 255 settori/traccia (numerati da 1-255), corrispondono a
267386880 settori (di 512 byte ciascuno) che equivalgono ad un
massimo di 136902082560 byte (137 GB). Questo non un problema
attuale (1999) ma lo diverr tra qualche anno.
BIOS Int 13 - il limite degli 8.5 GB
1024 cilindri (numerati da 0-1023), 256 testine (numerate da
0-255), 63 settori/traccia (numerati da 1-63), corrispondono a
8455716864 byte (8.5 GB). Questo un limite molto gravoso ai
nostri giorni perch significa che il DOS non pu utilizzare i
dischi di grosse dimensioni attuali.
Il limite dei 528 MB
Se gli stessi valori c,h,s sono utilizzati dalla chiamata
all'INT 13 del BIOS e dal controller I/O IDE entrambe le
limitazioni si sovrappongono permettendo l'accesso al massimo a
1024 cilindri, 16 testine, 63 settori/traccia per una capacit
totale di 528482304 byte (528MB), l'infame limite dei 504 MiB
del DOS con i vecchi BIOS. Questo problema si sentito a
partire dal 1993 circa e gli utenti sono ricorsi ai pi svariati
trucchi sia hardware (LBA) sia firmware (traslazione del BIOS)
sia software (gestori dei dischi). Il concetto di 'traslazione'
stato introdotto nel 1994: il BIOS pu usare una geometria per
dialogare con il disco e un'altra, contraffatta, per dialogare
con il DOS ed effettuare la conversione tra le due.
Il limite dei 2.1 GB (Aprile 1996)
Alcuni BIOS datati allocano solo 12 bit nella CMOS RAM per
memorizzare il numero dei cilindri. Come conseguenza il valore
massimo rappresentabile 4095. Da ci deriva che sono
indirizzabili solamente 4095*16*63*512=2113413120 byte. Se si
ha un disco pi grande si avr un blocco del sistema in fase di
avvio. Questo ha reso i dischi con la geometria 4092/16/63
abbastanza diffusi. Ancor'oggi molti dischi di grandi
dimensioni hanno un jumper per fornire la geometria 4092/16/63
Per ulteriori informazioni: over2gb.htm. Altri BIOS non si
bloccano ma rilevano un disco molto pi piccolo, ad esempio 429
MB invece di 2.5 MB.
Il limite dei 3.2 GB
I BIOS Phoenix 4.03 e 4.04 avevano un baco che causava il blocco
del sistema quando si impostavano nel setup della CMOS dischi
con capacit superiori ai 3277 MB. Vedi: over3gb.htm.
Il limite dei 4.2 GB (Feb 1997)
La traslazione effettuata dal BIOS (ECHS= CHS Estesa, detta
anche 'Supporto ai dischi di grandi dimensioni' o semplicemente
'Large') ricorsivamente raddoppia il numero delle testine e
contemporaneamente dimezza il numero dei cilindri passati al DOS
finch il numero dei cilindri al massimo 1024. Il DOS e
Windows95 non possono gestire 256 testine, e nel caso abbastanza
comune in cui il disco fornisce 16 testine ci significa che
questo meccanismo utilizzabile per gestire al massimo
8192*16*63*512=4227858432 byte (con una geometria contraffatta
di 1024 cilindri, 128 testine e 63 settori/traccia). da
osservare che ECHS non modifica il numero dei settori per
traccia, cos se non sono 63 la capacit gestibile sar ancora
pi bassa. Vedi: over4gb.htm.
Il limite dei 7.9 GB
Un po' furbescamente alcuni BIOS aggirano il problema precedente
fissando a 15 il numero di testine ('ECHS rivisto') in modo da
poter ottenere una geometria contraffatta con 240 testine. Sono
indirizzabili 1024*240*63*512=7927234560 byte.
Il limite degli 8.4 GB
Se il BIOS in grado di utilizzare 255 testine e 63
settori/traccia ('LBA assistita' o pi semplicemente 'LBA') pu
indirizzare 1024*255*63*512=8422686720 byte, un po' meno del
limite precedente di 8.5 GB questo perch le geometrie con 256
testine sono da evitarsi (la traslazione utilizza come numero di
testine H il primo valore della sequenza 16, 32, 64, 128, 255
per il quale la capacit totale sia minore od eguale a
1024*H*63*512, quindi calcola il numero dei cilindri C come la
capacit totale diviso per (H*63*512)).
Il limite dei 33.8 GB (Agosto 1999)
Ci sono ulteriori difficolt con dischi di dimensioni superiori
ai 33.8 GB. Il problema sta nel fatto che i valori predefiniti
di 16 testine e 63 settori/traccia corrispondoo ad un numero di
cilindri maggiore di 65535, quantit che non rappresentabile
da una variabile di tipo short. Attualmente molti BIOS non sono
in grado di gestire tali unit(vedi per esempio: Aggiornamenti
Asus per trovare versioni aggiornate del BIOS che supportino
tali unit). I kernel precedenti le versioni 2.2.14 / 2.3.21
devono essere aggiornati. Vedi ``Problemi dei controller IDE
con dischi di dimensioni superiori ai 34 GB'' pi sotto.
Per ulteriore materiale su questo argomento vedi: Breaking the
Barriers ("Rompere le barriere"), e per ulteriori dettagli IDE Hard
Drive Capacity Barriers ("Limiti della capacit degli HD IDE").
I dischi superiori agli 8.4 GB riportano la loro geometria come
16383/16/63. Ci significa che la 'geometria' obsoleta e che la
capacit totale del disco non pu pi essere calcolata dalla
geometria.
5. Avvio del sistema
Quando il sistema viene inizializzato il BIOS legge il settore 0
(definito come MBR - Master Boot Record) dal primo disco fisso (o dal
floppy) e lancia il programma che vi trova - di solito un bootstrap
loader. Il loader residente nel settore 0 non ha i suoi driver per
cui utilizza i servizi del BIOS. Ci significa che il kernel di Linux
deve essere interamente contenuto nei primi 1024 cilindri per essere
caricato.
Questo problema si risolve molto semplicemente verificando che il
kernel (e gli altri file utilizzati durante il boot, come le mappe dei
file di LILO) sia in una partizione contenuta intieramente nei primi
1024 cilindri del disco in modo che il BIOS vi possa accedere -
probabilmente questo significa utilizzare il primo o il secondo disco.
Create quindi una piccola partizione, diciamo di 10 MB, cos c'
spazio per pi di un kernel, facendo attenzione che sia contenuta
entro i primi 1024 cilindri del primo o del secondo disco. Montatela
in /boot cos LILO vi metter i file di cui necessita.
5.1. LILO e l'opzione `linear'
Un altro problema che sia il boot loader che il BIOS devono vedere
la stessa geometria del disco. LILO inoltra al kernel la richiesta di
informazioni circa la geometria ma molte volte gli autori dei driver
dei dischi hanno la brutta abitudine di utilizzare la tavola delle
partizioni per desumere la geometria del disco invece di specificare a
LILO qual la geometria utilizzata dal BIOS. Cos spesso la
geometria fornita dal BIOS non corretta. In questi casi pu essere
conveniente passare a LILO l'opzione `linear' in modo che non
necessitando dei parametri della geometria durante la fase di
inizializzazione del sistema (memorizza gli indirizzi lineari nelle
mappe) faccia la conversione in indirizzi lineari all'avvio. Perch
questa non un'opzione predefinita? Bene, occorre tener presente che
il suo uso comporta un problema. LILO con l'opzione `linear' attivata
non in grado di conoscere il numero dei cilindri come conseguenza
non pu generare nessun avvertimento se una parte del kernel si trova
oltre il limite dei 1024 cilindri. Alla fine vi potreste trovare con
un sistema che non in grado di avviarsi.
5.2. 1024 cilindri non sono 1024 cilindri
Tim Williams scrive: `Ho la mia partizione Linux nei primi 1024
cilindri e tuttavia non c' verso di di avviarla. Quando l'ho
ridimensionata a meno di 1 GB le cose sono andate a posto.' Cosa pu
essere? Bene, il disco in parola un disco SCSI con un controller
AHA2940UW che usa sia H=64, S=32 (ossia cilindri di 1 MiB = 1.05 MB)
che H=255, S=63 (ossia cilindri di 8.2 MB) a seconda delle opzioni
impostate nel firmware e nel BIOS. Senza dubbio il BIOS assume la
prima e trova il limite dei 1024 settori in corrispondenza di una
capacit di 1 GiB mentre Linux utilizza la seconda e LILO trova il
limite agli 8.4 GB.
6. Geometria dei dischi fissi, delle partizioni e 'sovrapposizione'
Se utilizzate diversi sistemi operativi sul vostro disco fisso ognuno
avr a disposizione una o pi partizioni. La posizione delle
partizioni deve essere univoca per tutti i sistemi presenti onde
evitare delle conseguenze catastrofiche.
Il MBR contiene la tavola delle partizioni che descrive la posizione
delle partizioni primarie. Nella tavola ci sono 4 campi per le 4
partizioni primarie, ogni campo descritto da una struttura del tipo
struct partizione {
char attiva; /* 0x80: avviabile; 0: non avviabile */
char inizio[3]; /* CHS del primo settore */
char tipo;
char fine[3]; /* CHS dell'ultimo settore */
int partenza; /* numero identificativo del settore a 32 bit
(si conta a partire da 0) */
int lunghezza; /* numero totale dei settori a 32 bit */
};
(dove CHS significa Cilindri/Testine/Settori - Cylinder/Head/Sector).
la struttura d informazioni ridondanti. La posizione di una
partizione si ricava dai campi inizio e fine entrambi a 24 bit e dai
campi partenza e lunghezza questi ultimi a 32 bit.
Linux utilizza solo i campi inizio e lunghezza, pu quindi gestire
partizioni che abbiano meno di 2^32 settori (circa 2TiB). Questa
dimensione centinaia di volte pi grande dei dischi attualmente
disponibili, probabilmente sar sufficiente per i prossimi otto anni e
forse oltre.
(Le partizioni possono essere molto grandi tuttavia c' un limite alla
dimensione massima di un singolo file che nei sistemi a 32 bit non pu
essere pi grande di 2GiB.)
Il DOS utlizza i campi inizio e fine e la chiamata all'INT13 del BIOS
per accedere al disco, pu quindi indirizzare dischi non pi grandi di
8.4 GB pur effettuando la traslazione (le partizioni non possono
superare i 2.1 GB perch occorre tener conto delle restrizioni imposte
al filesystem dalla FAT16). Lo stesso dicasi per Windows 3.11 e WfWG
e Windows NT 3.*.
Windows 95 ha il supporto per l'interfaccia all'INT13 Esteso e
utilizza un tipo speciale di partizione (c, e, f invece di b, 6, 5)
per indicare che tale partizione pu essere accessibile in questo
modo. Quando si utilizzano questi tipi di partizione i campi inizio e
fine contengono delle informazioni fasulle (1023/255/63). Windows 95
OSR2 ha introdotto il fylesystem FAT32 (partizioni di tipo b o c) che
permette partizioni di dimensioni al massimo di 2 TiB.
A cosa sono dovute le stupidaggini che apprendiamo da fdisk circa la
`sovrapposizione' delle partizioni quando in effetti non c' nulla di
sbagliato? Bene - qualche volta c' un `errore': se date un'occhiata
ai campi inizio e fine di tali partizioni, come fa il DOS, queste si
sovrappongono (tale `errore' non pu essere corretto perch i campi
non possono memorizzare un numero di cilindri superiore a 1024 - ci
sar sempre `sovrapposizione' non appena avrete pi di 1024 cilindri).
Tuttavia, se voi date uno sguardo ai campi inizio e lunghezza, come fa
Linux, e come fa anche Windows 95 nel caso di partizioni di tipo c, e
o f allora tutto procede per il meglio. Concludendo potete ignorare
questi avvertimenti quando usate cfdisk e sul vostro disco
installato solo Linux. Occorre prestare attenzione quando il disco
condiviso con il DOS. Usate il comando cfdisk -Ps /dev/hdx e cfdisk
-Pt /dev/hdx per controllare la tabella delle partizioni del disco
/dev/hdx.
7. Traduzione e Gestori dei Dischi
La geometria del disco (a testine, cilindri e tracce) qualcosa che
ci arriva dal tempo di MFM e RLL. In quel periodo la geometria
corrispondeva ad una realt fisica. Oggigiorno, con le interfacce IDE
o SCSI, nessuno pi interessato a conoscere la geometria `reale' del
disco. Il numero di settori per traccia variabile - ci sono pi
settori per traccia nelle zone pi esterne del disco - cosicch non
esiste un numero `reale' di settori per traccia. Anzi l'esatto
opposto: il comando IDE INITIALIZE DRIVE PARAMETERS (91h) serve per
richiedere al disco quante testine e settori per traccia pensa di
avere. abbastanza comune che i dischi di grandi dimensioni che
hanno due testine comunichino al BIOS 15 o 16 testine mentre il BIOS
ne riporta 255 all'utente.
Per l'utente meglio considerare un disco alla stregua di un vettore
di settori numerati progressivamente 0,1,...., e lasciare al
controller del disco il compito di localizzare i settori. La
numerazione progressiva definita LBA.
Si riporta adesso il funzionamento logico. Il DOS, o qualsiasi boot
loader, dialoga con il BIOS utilizzando la notazione (c,h,s). Il BIOS
converte la (c,h,s) nella notazione LBA utilizzando la falsa geometria
che l'utente sta utilizzando. Se il disco accetta la LBA allora la
utilizza nelle operazioni di I/O su disco. Altrimenti, il BIOS la
riconverte in (c',h',s') utilizzando la geometria falsa in uso e
questi nuovi valori sono impiegati nell'I/O su disco.
da rimarcare che c' un po' di confusione nell'utilizzo
dell'espressione `LBA': come termine che descrive le possibilit di un
disco significa `Linear Block Addressing' (al contrario
dell'indirizzamento CHS), mentre come termine presente nel setup del
BIOS descrive uno schema di traslazione che qualche volta viene
definito come `assisted LBA' - cfr pi sotto ``Linux e il limite degli
8 GiB dei controller IDE''.
Se il controller non supporta la LBA ma il BIOS ad effettuare la
traduzione si ha un comportamento simile a quanto descritto sopra (nel
setup del BIOS spesso indicata come modalit `Large'). In questo
caso il BIOS passa al sistema operativo la geometria (C',H',S') e
utilizza (C,H,S) per dialogare con il controller del disco. Di norma
si ha che: S = S', C' = C/N e H' = H*N, dove N rappresenta la pi
piccola potenza di due che assicura la validit della diseguaglianza
C' <= 1024 (si spreca spazio a causa dell'arrotondamento dovuto al
rapporto C' = C/N). Anche in questo caso si possono indirizzare pi
di 8.4 GB (7.8 GiB).
(La terza opzione del setup di solito `Normal', che non effettua
nessuna traslazione).
Se il BIOS non supporta n la modalit `Large' n la `LBA' si deve
ricorrere a delle soluzioni software. Gestori del disco ("Disk
Manager") come OnTrack o EZ-Drive sostituiscono con le loro routine di
gestione del disco quelle del BIOS. Di solito vengono installati
nell'MBR e nei settori seguenti (OnTrack definisce questi programmi
come DDO: Dynamic Drive Overlay) in modo che vengono eseguiti prima
del sistema operativo. Per questo motivo quando si inizializza il
sistema da dischetto ci possono essere problemi.
I risultati che si ottengono sono pi o meno gli stessi di quelli
forniti da un BIOS che effettua la traduzione - ma, quando sono
presenti pi sistemi operativi sullo stesso disco ci possono essere
molti problemi derivanti dall'utilizzo dei disk manager.
Linux compatibile con OnTrack Disk Manager dalla versione 1.3.14 e
con EZ-Drive da quella 1.3.29. Altri dettagli sono riportati appresso.
8. Traduzione dei dischi IDE operata dal kernel
Se il kernel di Linux rileva la presenza di un disk manager su un
disco IDE cerca di rimappare il disco nello stesso modo in cui l'ha
mappato il disk manager, cos vede le stesse partizioni che ad esempio
il DOS gestisce con OnTrack o EZ-Drive. Tuttavia se si specifica la
geometria da riga di comando NON viene effettuata la rimappatura del
disco. Una riga di comando del tipo `hd=cilindri,testine,settori' fa
perdere ogni compatibilit con il disk manager.
La rimappatura si fa, posto il prodotto H*C costante, variando il
valore del numero di testine (4, 8, 16, 32, 64, 128, 255) finch si
verifica C <= 1024 o H = 255.
Il titolo dei paragrafi che seguono corrisponde alle stringhe che
appaiono in fase di boot quando Linux rileva la presenza di un disk
manager. I tipi delle partizioni si devono intendere espressi in
notazione esadecimale.
8.1. EZD
EZ-Drive rilevato perch assegna alla partizione primaria numero uno
il tipo 55. La geometria rimappata come detto sopra. La tabella
delle partizioni presente nel settore 0 non viene presa in
considerazione perch viene letta quella presente nel settore 1. Il
numero dei blocchi del disco non cambiato, l'operazione di scrittura
sul settore 0 reindirizzata al settore 1. Questo comportamento pu
essere modificato ricompilando il kernel con:
#define FAKE_FDISK_FOR_EZDRIVE 0 in ide.c.
8.2. DM6:DDO
OnTrack DiskManager (sul primo disco) rilevato perch assegna alla
partizione primaria numero uno il tipo 54. La geometria rimappata
come detto sopra e tutto il disco traslato di 63 settori (cos
facendo il vecchio settore 63 diventa il nuovo settore 0). Dopo
questa operazione sul settore 0 viene letto un nuovo MBR (con la
relativa tavola della partizioni). Naturalmente la traslazione dei
settori necessaria per creare lo spazio per il DDO, questo spiega
perch negli altri dischi non si applica tale operazione.
8.3. DM6:AUX
OnTrack DiskManager (sugli altri dischi) rilevato perch assegna
alla partizione primaria numero uno il tipo 51 o 53. La geometria
rimappata come detto sopra.
8.4. DM6:MBR
Questa una vecchia versione di OnTrack DiskManager rilevata da una
firma e non da un assegnamento di tipo ad una partizione (si verifica
che l'offset trovato nel 2 e 3 byte dell' MBR non sia maggiore di 430
e che lo short trovato in questo offset sia eguale a 0x55AA, e inoltre
che sia seguito da un byte di disparit). La geometria, come nei casi
precedenti, rimappata come detto sopra.
8.5. PTBL
Si possono dedurre le informazioni necessarie alla traduzione del
disco utilizzando un test che verifica l'inizio e la fine della
partizione primaria. Se l'inizio e la fine di una partizione sono nei
settori numero 1 e 63, rispettivamente e se le testine finali sono 31,
63, 127 o 254 allora, considerato che prassi terminare le partizioni
entro le dimensioni di un cilindro, e dacch l'interfaccia IDE
utilizza al massimo 16 testine, si pu presupporre che il BIOS abbia
effettuato una traduzione e che la geometria del disco sia stata
rimappata per utilizzare 32, 64, 128 o 255 testine, rispettivamente.
Quando la geometria rilevata ha gi 63 settori per traccia e
altrettante testine non viene effettuata la rimappatura (perch questo
significa che probabilmente ne gi stata fatta una).
9. Conclusioni
Cosa significa tutto ci? Per gli utenti Linux una sola cosa: che
devono verificare che LILO e fdisk utilizzino la geometria corretta.
Per fdisk la geometria `corretta' quella utilizzata dagli altri
sistemi operativi installati sullo stesso disco mentre per LILO
quella che permette un'interazione senza errori con il BIOS in fase di
inizializzazione (di solito i due aspetti coincidono).
Come rileva la geometria fdisk? Interroga il kernel, utilizzando la
funzione ioctl.h HDIO_GETGEO. L'utente tuttavia in grado di forzare
la geometria in modo interattivo o da linea di comando.
Come rileva la geometria LILO? Interroga il kernel utilizzando la
ioctl HDIO_GETGEO. Tuttavia l'utente pu forzare la geometria
utilizzando l'opzione `disk=' nel file /etc/lilo.conf (cfr
lilo.conf(5)). possibile fornire a LILO l'opzione linear in modo da
memorizzare nella mappa dei file i valori della LBA invece dei CHS e
recuperer la geometria da utilizzare in fase di avvio mediante la
funzione 8 dell'INT 13 per richiedere la geometria del disco.
Com' in grado di rispondere il kernel? Bene, prima di tutto,
l'utente pu aver specificato una geometria esplicita fornendo le
opzioni `hda=cyls,heads,secs' al kernel da riga di comando (cfr.
bootparam(7)), probabilmtente di persona od indicando al "boot loader"
di fornire tali valori al kernel. Per esempio, si pu indicare a LILO
di fornire tali informazioni opzionali aggiungendo una riga del tipo
`append = "hda=cyls,heads,secs"' in /etc/lilo.conf (cfr.
lilo.conf(5)). D'altrocanto il kernel in grado di congetturare una
geometria utilizzando possibilmente i valori ottenuti dal BIOS o dai
dispositivi hardware.
possibile (a partire dalla versione 2.1.79) cambiare i valori della
geometria congetturata da kernel utilizzando il filesystem /proc. Per
esempio:
# sfdisk -g /dev/hdc
/dev/hdc: 4441 cylinders, 255 heads, 63 sectors/track
# cd /proc/ide/ide1/hdc
# echo bios_cyl:17418 bios_head:128 bios_sect:32 > settings
# sfdisk -g /dev/hdc
/dev/hdc: 17418 cylinders, 128 heads, 32 sectors/track
#
9.1. Calcolo dei parametri di LILO
Qualche volta utile impostare una precisa geometria da riga di
comando: `hda=cyls,heads,secs'. Quasi sempre si vuole un valore di
secs=63, lo scopo di fornire tale valore quello di specificare il
valore heads (valori ragionevoli in questo periodo sono heads=16 e
heads=255). Quali valori si potrebbero specificare per cyls? Quei
valori che forniranno la capacit totale corretta di C*H*S settori.
Per esempio, per un drive con 71346240 settori (36529274880 byte) si
potrebbe calcolare C come 71346240/(255*63)=4441 (usando, e.g., il
programma bc) e fornire quindi come parametri di avvio:
hdc=4441,255,63. Come si pu stabilire la capacit totale corretta?
Per esempio:
# hdparm -g /dev/hdc | grep sectors
geometry = 4441/255/63, sectors = 71346240, start = 0
# hdparm -i /dev/hdc | grep LBAsects
CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=71346240
indica due modi per stabilire il numero totale si settori pari a
71346240. I messaggi del kernel:
# dmesg | grep hdc
...
hdc: Maxtor 93652U8, 34837MB w/2048kB Cache, CHS=70780/16/63
hdc: [PTBL] [4441/255/63] hdc1 hdc2 hdc3! hdc4 < hdc5 > ...
riportano (perlomeno) 34837*2048=71346176 settori e
70780*16*63=71346240 settori (almeno). In questo caso il secondo val
ore quello corretto ma in generale entrambi sono arrotondati per
difetto. Questo un buon modo per definire in maniera approssimata
le dimensioni del disco quando hdparm non disponibile. Non asseg
nate mai a cyls un valore troppo grande! Nel caso di dischi SCSI il
numero preciso dei settori indicato dai messaggi forniti dal kernel
all'avvio:
SCSI device sda: hdwr sector= 512 bytes. Sectors= 17755792 [8669 MB] [8.7 GB]
(MB e GB sono arrotondati, non per difetto, e in `notazione binaria').
10. Dettagli
10.1. Dettagli sui dischi IDE - le sette geometrie
Il driver IDE pu determinare la geometria di un disco in quattro
modi. Il primo (G_user) quello di passare le informazioni da linea
di comando. Il secondo (G_bios) la lettura in fase di
inizializzazione della Tavola dei Parametri del Disco nel BIOS (solo
per il primo e il secondo disco) prima del passaggio alla modalit a
32 bit. Il terzo (G_phys) e il quarto (G_log) sono le risposte del
controller IDE al comando IDENTIFY, sono rispettivamente la geometria
`fisica' e `logica' del disco.
Il driver ha bisogno di due valori per determinare la geometria: uno
dato da G_fdisk, ottenuto da una chiamata a HDIO_GETGEO ioctl, l'altro
da G_used, che utilizzato per le operazioni di I/O. Sia G_fdisk che
G_used sono inizializzati da G_user se vengono passati i valori,
altrimenti da G_bios o da G_phys. Se G_log ha un valore ragionevole
questo viene assegnato a G_used. Nel caso in cui G_used non sia
ragionevole ma lo sia G_phys quest'ultimo valore sar assegnato a
G_used. Per `valore ragionevole' si intende un numero di testine
compreso tra 1 e 16.
Per dirla in altri termini: i parametri passati da linea di comando
forzano i valori del BIOS e determinano la geometria che vedr fdisk.
Tuttavia se i parametri si riferiscono ad una geometria tradotta con
pi di 16 testine l'I/O del kernel sar forzato dai valori ricavati
dal comando IDENTIFY.
Bisogna osservare che il G_bios piuttosto inattendibile: per i
sistemi inizializzati da un driver SCSI il primo ed il secondo disco
possono essere SCSI e la geometria che il BIOS attribuisce a sda
quella usata dal kernel per hda. Tuttavia, i dischi che non sono
impostati nel Setup del BIOS non possono essere visti da quest'ultimo.
Ci significa che, per esempio, in un sistema IDE dove non sia
presente hdb le geometrie riportate dal BIOS per il primo e per il
secondo disco siano attribuite a hda e hdc.
10.2. Dettagli sui dischi SCSI
Per i dischi SCSI la situazione diversa. Questi dischi utilizzano la
LBA per cui determinare una `geometria' del tutto irrilevante. Il
formato della tavole delle partizioni praticamente lo stesso, fdisk
deve crearsi una qualche geometria, utilizza HDIO_GETGEO, perch non
in grado di distinguere tra dischi IDE e SCSI. Come si vedr in
seguito ogni driver crea una sua geometria. Veramente una grande
confusione.
Se non si utilizza il DOS meglio evitare le impostazioni di
traduzione estese ed utilizzare se possibile 64 testine, 32 settori
per traccia (per gli esigenti pu andar bene 1MB per cilindro) cos
facendo si evitano problemi se si cambia controller. Alcuni driver
(aha152x, pas16, ppa, qlogicfas, qlogicisp) sono cos legati ai limiti
del DOS da non permettere l'utilizzo di pi di 8GiB anche nel caso in
cui Linux sia il solo sistema installato. Questo un baco.
Qual la geometria reale? La risposta pi facile che non esiste. E
se anche esistesse voi non dovreste occuparvene e di sicuro MAI E POI
MAI dovreste richiedere tali informazioni a fdisk, a LILO o al kernel.
Questa una cosa di cui di occupano il controller SCSI e il disco.
Lasciatemelo ripetere: solo gli stupidi richiedono a fdisk/LILO/kernel
la geometria di un disco SCSI.
Tuttavia se siete persone curiose ed insistenti potete leggere tali
valori dal disco stesso. Il comando READ CAPACITY d la capacit
totale del disco; MODE SENSE riporta il numero di cilindri e testine
nella Rigid Disk Drive Geometry Page (page 04, questi valori non
possono essere modificati) e il numero di byte per settore e i settori
per traccia nella Format Page (page 03). Quest'ultimo valore dipende
dalla formattazione ed variabile, le tracce pi esterne hanno pi
settori di quelle interne. Il programma scsiinfo fornisce questi
dati. Ci sono molti altri dettagli e difficolt da superare, palese
che nessuno utilizzer questo genere di informazioni (molto
probabilmente nemmeno lo stesso sistema operativo). Considerato che
stiamo parlando di fdisk e di LILO i valori tipici sono:
C/H/S=4476/27/171, valori questi che non possono essere utilizzati da
fdisk perch la tabella delle partizioni riserva per la terna C/H/S
rispettivamente 18, 8 e 6 bit.
Ma allora come fa HDIO_GETGEO a ricavare tali valori? Interrogando o
il controller SCSI o facendo delle richieste appropriate al kernel.
Qualche driver sembra pensare che le nostre richieste vogliano
determinare la geometria reale mentre a noi interessa conoscere il
valore dei parametri utilizzati da FDISK sia che si utilizzi DOS che
OS/2 (o Adaptec AFDISK, ecc...)
da sottolineare che fdisk utilizza il numero delle testine H e dei
settori per traccia S per convertire i numeri dei settori LBA nel
corrispondente indirizzo c/h/s; il numero dei cilindri C non riveste
un ruolo importante in questa conversione. Certi driver indicano che
la capacit del drive di almeno 1023*255*63 settori assegnando a
C,H,S i seguenti valori:1023,255,63. Cos facendo non si ottiene la
vera dimensione del disco e si limita l'accesso ai primi 8GB a molte
versioni di fdisk - un vero problema d'attualit.
Nelle descrizioni a seguire con M si indica la capacit totale del
disco, con C,H,S il numero di cilindri, testine e settori per traccia.
sufficente ottenere i valori di H e S se si ricava C dalla relazione
M / (H*S).
I valori predefiniti di H e S sono rispettivamente 64 e 32.
aha1740, dtc, g_NCR5380, t128, wd7000:
H=64, S=32.
aha152x, pas16, ppa, qlogicfas, qlogicisp:
H=64, S=32 se C <= 1024, altrimenti H=255, S=63, C = min(1023,
M/(H*S)). (C rappresenta un valore troncato, H*S*C non
un'approssimazione della capacit M. Per questo molte versioni
di fdisk si comportano in modo anomalo). Il sorgente ppa.c
utilizza M+1 invece di M per cui genera un messaggio d'errore
dicendo che M pi piccolo di 1 a causa di un baco in sd.c.
advansys:
H=64, S=32 se C <= 1024, se abilitata l'opzione `> 1 GB' nel
BIOS i valori assunti sono rispettivamente 255 e 63.
aha1542:
Richiede al controller quale delle due traduzioni possibili sta
utilizzando e utilizza o H=255, S=63 o H=64, S=32. Nel primo
caso durante il boot si ha il messaggio "aha1542.c: Using
extended bios translation".
aic7xxx:
H=64, S=32 se C <= 1024, inoltre se viene utilizzato il
parametro "extended" o si imposta il bit `extended' nella
SEEPROM o nel BIOS i valori saranno: H=255, S=63. L'opzione
extended viene sempre impostata se non viene rilevata nessuna
SEEPROM con il kernel 2.0.36 mentre con la versione 2.2.6 se non
viene trovata la SEEPROM l'opzione impostata solo se l'utente
specifica in fase d'avvio il parametro "extended" (nel caso
venga rilevata una SEEPROM tale parametro verr ignorato).
Tutto ci significa che un sistema che funziona con il 2.0.36
pu non avviarsi con il 2.2.6 (e richiedere l'opzione `linear'
per LILO o il parametro `aic7xxx=extended' da passare al kernel
al boot)
buslogic:
H=64, S=32 finch C >= 1024. Se si imposta la traduzione estesa
nel controller si hanno due casi a seconda che sia verificata o
meno la condizione M < 2^22: nel primo caso H=128, S=32
altrimenti H=255, S=63. Dopo aver effettuato la scelta della
terna (C,H,S) viene letta la tabella delle partizioni e si
verifica che il valore endH=H-1 appartenga ad una delle tre
condizioni possibili (H,S) = (64,32), (128,32), (255,63). Sar
utilizzata la coppia che soddisfa la condizione, tale scelta
segnalata da un messaggio durante il boot ("Adopting Geometry
from Partition Table").
fdomain:
Ricava le informazioni sulla geometria o dalla tabella dei
parametri BIOS del drive o dalla tavola delle partizioni.
Utilizza i valori: H=endH+1, S=endS per la prima partizione,
purch non sia vuota, oppure H=64, S=32 se M < 2^21 (1 GB),
H=128, S=63 se M < 63*2^17 (3.9 GB) e H=255, S=63 in tutti gli
altri casi.
in2000:
Utilizza la prima coppia di valori (H,S) = (64,32), (64,63),
(128,63), (255,63) che verifica la condizione C <= 1024.
Nell'ultimo caso il valore di C troncato a 1023.
seagate:
Legge C,H,S dal disco (orrore!). Se C o S sono troppo grandi
allora imposta S=17 e H=2 e raddoppia H finch C <= 1024.
Significa che H sar impostato a zero nel caso in cui M >
128*1024*17 (1.1 GB). Questo un baco.
ultrastor and u14_34f:
Utilizza una coppia di valori (H,S) in funzione di come il
controller mappa il disco. ((H,S) = (16,63), (64,32), (64,63))
Se il driver non specifica la geometria del disco possiamo richiedere
i dati alla tabella delle partizioni oppure utilizzare tutta la
capacit del disco.
Diamo uno sguardo alla tabella delle partizioni. Per convenzione le
partizioni terminano in un cilindro esterno per cui dato fine =
(endC,endH,endS) per una partizione qualsiasi si pone H = endH+1 e S =
endS (ricordo che i settori si contano a partire da 1). Il
procedimento descritto appresso in modo pi preciso. Tra le
partizioni non vuote si considera quella con il valore beginC pi
grande. Si controlla il valore end+1 di questa partizione, calcolato
sia come somma di partenza con lunghezza sia ipotizzando che la
partizione termini al confine di un cilindro. Se entrambi i valori
coincidono, o se endC = 1023 e la somma partenza+lunghezza multiplo
di (endH+1)*endS, allora la partizione allineata sul confine di un
cilindro. Si pongono H = endH+1 e S = endS. Nel caso in cui le
verifiche siano negative o perch non ci sono partizioni o perch non
hanno dimensioni note si utilizza la capacit del disco M.
L'algoritmo cos schematizzabile: porre H = M/(62*1024) (arrotondato
all'intero superiore), S = M/(1024*H) (arrotondato all'intero
superiore), C = M/(H*S) (arrotondato all'intero inferiore). I valori
di (C,H,S) che si ottengono sono al massimo 1024 per C e 62 per S.
11. Linux e il limite degli 8 GiB dei controller IDE
Il driver IDE di Linux ricava la geometria e la capacit di un disco
(e molte altre cose) utilizzando una richiesta ATA IDENTIFY.
Fino a poco tempo fa il driver non accettava il valore di lba_capacity
restituito se questo era maggiore del 10% rispetto alla capacit
calcolata come prodotto di C*H*S. Ci nonostante grazie ad accordi
tra i produttori di dischi IDE di grandi dimensioni (quelli con pi di
16514064 settori) forniscono i valori: C=16383, H=16, S=63 per un
totale di 16514064 settori (7.8 GB) indipendentemente dalla loro
dimensione reale che forniscono alla lba_capacity.
I kernel pi recenti (2.0.34, 2.1.90) conoscono il problema e si
comportano di conseguenza. Se avete un kernel datato che vede
solamente i primi 8 GB di un disco pi grande, e non volete
aggiornarlo, provate a cambiare la funzione lba_capacity_is_ok in
/usr/src/linux/drivers/block/ide.c come indicato:
static in lba_capacity_is_ok (struct hd_driveid *id) {
id->cyls = id->lba_capacity / (id->heads * id->sectors);
return 1;
}
Per fare un aggiornamento meno brutale utilizzate il kernel 2.1.90.
11.1. Complicazioni del BIOS
Come gi detto i dischi di grandi dimensioni forniscono la geometria
C=16383, H=16, S=63 indipendentemente dalle dimensioni reali, mentre
la dimensione reale indicata dal valore della LBAcapacity. Alcuni
BIOS non la riconoscono, e traslano il 16383/16/63 in una terna con
meno cilindri e pi testine, per esempio 1024/255/63 o 1027/255/63.
Cos, il kernel non deve solo riconoscere la geometria 16383/16/63 ma
anche quella generata da tali BIOS. Dal kernel 2.2.2 questa
operazione di riconoscimento funziona in modo corretto (prendendo dal
BIOS i valori H e S e calcolando C =capacit/(H*S)). Di norma questo
problema si risolve impostando nei parametri del BIOS il disco come
Normal (o, ancor meglio a None, non fornendo nessuna indicazione al
BIOS). Se questa strada non percorribile perch dovete fare il boot
da questo disco oppure avete una partizione DOS/Windows, e non
possibile aggiornare la versione del kernel alla 2.2.2 o superiori,
passate al kernel i parametri durante il boot.
Se il BIOS riporta la geometria 16320/16/63 ci fatto per ottenere
dopo la traduzione la terna 1024/255/63.
11.2. Impostare il numero delle testine per mezzo dei ponticelli
(Jumpers)
Molti dischi hanno dei ponticelli che permetto di selezionare una
geometria a 15 o a 16 testine. La configurazione predefinita quella
a 16 testine. A volte entrambe le geometrie indirizzano lo stesso
numero di settori altre quella a 15 testine ne indirizza un numero
inferiore. C' una buona ragione come spiega Petri Kaukasoina per
spiegare queste due opzioni: `Ho impostato un disco IBM Deskstar 16 GP
(modello IBM-DTTA-351010) da 10.1 GiB per utilizzare 16 testine come
da configurazione predefinita ma il mio vecchio PC (con BIOS AMI) non
si avviava cos ho dovuto spostare il ponticello sull'opzione che d
15 testine. hdparm -i riporta RawCHS=16383/15/63 e LBAsects=19807200.
Io utilizzo una configurazione 20960/15/63 per poter sfruttare tutta
la capacit del disco.' Per ulteriori informazioni su come
ponticellare tali dischi visitate il sito:
http://www.storage.ibm.com/techsup/hddtech/hddtech.htm.
11.3. Ridurre la capacit totale di un disco mediante l'uso dei pon
ticelli
Molti dischi hanno dei ponticelli che permettono di mostrare le
dimensioni del disco pi piccole di quelle che sono. un po' stupido
a farsi e probabilmente nessun utente Linux vorrebbe mai utilizzare
tale espediente ma alcuni BIOS non riescono a gestire i dischi di
grandi dimensioni andando in "crash". La soluzione pi comune
quella di non far vedere il disco all'avvio al BIOS, ma possibile
farlo solo se il disco non quello di avvio.
Il primo limite grave era il limite di 4096 cilindri (che corrisponde,
con 16 testine e 63 settori/traccia a 2,11 GB). Per esempio, il disco
Fujitsu MPB3032ATU da 3.24 GB ha la geometria predefinita da
6704/15/63 ma pu essere poticellato per fornire una geometria
4092/16/63 e riportare di conseguenza una LBAcapacity di 4124736
settori, in questo modo il sistema operativo non pu congetturare che
la dimensione reale pi grande. In questi casi (con un BIOS che si
"schianta" se riconosce la reale dimensione del disco necessario
ricorrere al ponticello) necessario informare Linux sulle dimensioni
del disco fornendo i parametri all'avvio.
Questo un caso sfortunato. Molti dischi possono essere
"ponticellati" in modo da sembrare dischi da 2 GB e fornire quindi una
geometria ridotta tipo 4092/16/63 o 4096/16/63 ma in grado di fornire
il valore corretto della LBAcapacity. Tali dischi sono in grado di
lavorare bene e di utilizzare la capacit totale con Linux
indipendentemente dalle impostazioni dei ponticelli.
Un limite pi recente quello dei ``33.8 GB''. I kernel di Linux
precedenti alla versione 2.3.21 devono essere aggiornati per poter
gestire dischi IDE di dimensioni superiori a queste. Alcuni dischi
che superano tale limite possono essere ponticellati per sembrare dei
dischi da 33.8 GB. Per esempio l'IBM Deskstar (DPTA-353750) da 37.5
GB pu essere ponticellato per sembrare un disco da 33.8 GB e fornire
la geometria 16383/16/63 come un qualsiasi altro disco di grandi
dimensioni, ma la LBAcapacity di 66055248 (che corrisponde a
65531/16/63 o 4111/255/63). Linux per poter utilizzare la capacit
totale di tali dischi, ponticellati per indicare la capacit di 33.8
GB, ha bisogno che venga fornita la geometria in fase di avvio. Vedi
anche: the BIOS 33.8 GB limit.
12. Il limite dei 65535 cilindri in Linux
La chiamata HDIO_GETGEO memorizza il numero dei cilindri in una
variabile di tipo short. Questo vuol dire che se si hanno pi di
65535 cilindri il loro valore verr troncato e (per una tipica
configurazione SCSI com 1MiB di cilindri) un disco da 80 GiB apparir
come uno da 16 GiB. Una volta riconosciuto tale problema facile
evitarlo.
12.1. Problemi dei controller IDE con dischi di dimensioni superiori
ai 34 GB
I dischi superiori ai 33.8 GB non sono utilizzabili con i kernel
precedenti alla versione 2.3.21. Appresso si riportano i dettagli.
Ipotizziamo l'acquisto di un nuovo disco IBM-DPTA-373420 con una
capacit di 66835440 settori (34.2 GB). I kernel ante 2.3.21
riporterebbero una dimensione di 769*16*63 = 775152 settori (0.4 GB)
che una cosa spiacevole. Se fornissimo i parametri hdc=4160,255,63
da linea di comando non otterremmo alcun effetto - tale valori
sarebbero ignorati. Ma cosa succede? La funzione idedisk_setup()
utilizza la geometria fornita dal disco (che 16383/16/63) e
sovrascrive i valori specificati dall'utente da linea di comando che
vengono utilizzati solo per impostare la geometria da passare al BIOS.
La funzione current_capacity() o idedisk_capacity() ricalcola il
numero dei cilindri come 66835440/(16*63)=66305 poich tale valore
memorizzato in una variabile short diviene 769.Fino a quando
lba_capacity_is_ok() non distrugge id->cyls ogni sua chiamata
successiva riporter il valore falso, di conseguenza la capacit del
disco diviene 769*16*63. disponibile un aggiornamento per diverse
versioni del kernel. Una "patch" per la versione 2.0.38 pu esere
trovata presso: ftp.kernel.org. Una "patch" per la versione 2.2.12
pu essere trovata presso: www.uwsg.indiana.edu I kernel della serie
2.2.14pre gestiscono tali dischi. La serie 2.3.* gestisce questi
dischi a partire dalla versione 2.3.21. possibile "risolvere" il
problema a livello hardware utilizzando un ``ponticello'' (jumper) per
impostare la dimensione di 33.8 GB. In molti casi sar necessario un
aggiornamento del ``BIOS'' se si vuole utilizzare tali dischi come
dischi d'avvio del sistema.
13. Partizioni estese e logiche
``In precedenza'', abbiamo visto la struttura dell'MBR (settore 0): il
codice del boot loader seguito da 4 voci della tavola delle partizioni
da 16 byte ciascuna e dalla firma AA55. Le voci della tavola delle
partizioni di tipo 5 o F o 85 (Hex) hanno un significato speciale:
descrivono le partizioni estese, che sono porzioni di disco che
verranno ripartizionate in partizioni logiche (una partizione estesa
non che un contenitore di partizioni logiche e non pu essere
utilizzata di per se stessa). Solo la posizione del primo settore di
una partizione estesa importante. Questo primo settore contiene una
tavola delle partizioni con quattro voci: una per la partizione
logica, una per quella estesa e due inutilizzate. In questo modo si
ottiene una catena di tavole delle partizioni, sparse per il disco,
dove la prima descrive tre partizioni primarie e una estesa mentre le
tavole seguenti descrivono una partizione logica e la posizione della
prossima tavola.
importante capire questo: quando qualcuno fa qualcosa di stupido
partizionando un disco si chiede: "I miei dati ci sono ancora?" La
risposta : s. Ma, se si creano partizioni logiche verr riscritta la
tavola delle partizioni che le descrive e ogni dato presente perso.
Il programma sfdisk mostrer l'intera catena. Ecco un esempio:
# sfdisk -l -x /dev/hda
Disk /dev/hda: 16 heads, 63 sectors, 33483 cylinders
Units = cylinders of 516096 bytes, blocks of 1024 bytes, counting from 0
Device Boot Start End #cyls #blocks Id System
/dev/hda1 0+ 101 102- 51376+ 83 Linux
/dev/hda2 102 2133 2032 1024128 83 Linux
/dev/hda3 2134 33482 31349 15799896 5 Extended
/dev/hda4 0 - 0 0 0 Empty
/dev/hda5 2134+ 6197 4064- 2048224+ 83 Linux
- 6198 10261 4064 2048256 5 Extended
- 2134 2133 0 0 0 Empty
- 2134 2133 0 0 0 Empty
/dev/hda6 6198+ 10261 4064- 2048224+ 83 Linux
- 10262 16357 6096 3072384 5 Extended
- 6198 6197 0 0 0 Empty
- 6198 6197 0 0 0 Empty
...
/dev/hda10 30581+ 33482 2902- 1462576+ 83 Linux
- 30581 30580 0 0 0 Empty
- 30581 30580 0 0 0 Empty
- 30581 30580 0 0 0 Empty
#
possibile costruire una tavola delle partizioni scorretta. Molti
kernel entrano in un loop se qualche partizione estesa punta a se
stessa o ad una precedente nella catena. possibile avere due
partizioni estese in una tabella delle partizioni cos che la tabella
si divide (questo capita per esempio con fdisk che non riconosce ogni
5, F e 85 come partizioni estese e che crea una 5 dopo una F).
Programmi non standard tipo fdisk possono risolvere queste situazioni
anche se richiedono del lavoro manuale per riparare le partizioni. Il
kernel di Linux accetta una divisione nei livelli pi esterni. In
questo modo possibile avere due catene di partizioni logiche.
Talvolta pu essere utile - per esempio, si pu usare il tipo 5 che
visto dal DOS e il tipo 85, invisibile al DOS, cos che il DOS FDISK
non vada in crash perch la partizione logica supera il cilindro 1024.
14. Risoluzione dei problemi
Molte persone pensano di avere problemi anche quando non ce ne sono.
Oppure pensano che i loro problemi siano legati alla geometria del
disco quando alla fine dei conti la geometria non c'entra nulla con il
problema. Tutto quello che ho esposto potr sembrare complicato ma
maneggiare la geometria dei dischi estremamente facile: non fate
niente e tutto funzioner correttamente; o forse passate a LILO
l'opzione `linear' se al boot non andate oltre a LI. Guardate i
messaggi del kernel al boot e ricordate: meno giocherellate con le
geometrie (specificando il numero di testine e cilindri a LILO o a
fdisk o dalla riga di comando al kernel) e pi possibilit avete che
tutto funzioni. Per dirla in poche parole, va gi tutto bene di
default.
E ricordate che Linux non utilizza in nessuna riga di codice la
geometria del disco per questo motivo non avrete problemi
utilizzandolo dovuti alla geometria. La geometria del disco
utilizzata solamente da LILO e da fdisk. Di converso, se LILO
fallisce l'inizializzazione del sistema ci pu essere un problema
legato alla geometria. Se sistemi operativi diversi non capiscono la
tavola delle partizioni allora c' un problema legato alla geometria.
Non c' nient'altro. In particolare se il montaggio delle periferiche
ha dei problemi, state tranquili non sono legati alla geometria del
disco ma a qualcos'altro.
14.1. ai dischi IDE una geometria errata. Problema: avviando il sis
tema da un disco SCSI viene assegnata
possibile che un disco fornisca la sua geometria in modo errato. Il
kernel di Linux interroga il BIOS per conoscere la geometria di hd0 e
hd1 (i driver del BIOS indicati come 80H e 81H) e assume che questi
dati siano per hda e hdb. Ma in un sistema SCSI, in cui i primi due
dischi possono essere SCSI, pu succedere che al quinto disco, che
il primo disco IDE hda, sia assegnata la geometria di sda. Questo
tipo di problemi si risolvono facilmente fornendo i parametri della
geometria `hda=C,H,S' in fase di inizializzazione o in /etc/lilo.conf.
14.2. Un non problema: dischi identici possono avere geometria
diversa?
`Posseggo due dischi eguali da 10 GB della IBM. Tuttavia fdisk
fornisce delle dimensioni diverse. Guarda:
# fdisk /dev/hdb
Disk /dev/hdb: 255 heads, 63 sectors, 1232 cylinders
Units = cylinders of 16065 * 512 bytes
Device Boot Start End Blocks Id System
/dev/hdb1 1 1232 9896008+ 83 Linux native
# fdisk /dev/hdd
Disk /dev/hdd: 16 heads, 63 sectors, 19650 cylinders
Units = cylinders of 1008 * 512 bytes
Device Boot Start End Blocks Id System
/dev/hdd1 1 19650 9903568+ 83 Linux native
Cos' capitato?'
Cosa sta succedendo? Bene, prima di tutto questi dischi sono entrambi
da 10 giga: le dimensioni di hdb sono 255*63*1232*512 = 10133544960, e
quelle di hdd 16*63*19650*512 = 10141286400, cos non c' nulla di
errato e il kernel li vede entrambi come dischi da 10.1 GB. Perch la
differenza di dimensione? dovuta al fatto che il kernel acquisisce i
dati per i primi due dischi IDE da BIOS e il BIOS ha rimappato hdb in
modo che abbia 255 testine (e 16*19650/255=1232 cilindri).
L'arrotondamento ti costa almeno 8 MB.
Se vuoi rimappare hdd devi passare, come fatto prima, i parametri
`hdd=1232,255,63' al kernel in fase di inizializzazione.
14.3. Un non problema: fdisk vede molti blocchi in meno di df?
fdisk ti dice quanti blocchi ci sono nel disco. Se tu crei un
filesystem sul disco, diciamo con mke2fs, allora questo filesystem ha
bisogno di spazio per mantenere le informazioni relative a se stesso -
di solito circa il 4% della dimensione del filesystem, di pi se il
numero degli inode alto. Per esempio:
# sfdisk -s /dev/hda9
4095976
# mke2fs -i 1024 /dev/hda9
mke2fs 1.12, 9-Jul-98 for EXT2 FS 0.5b, 95/08/09
...
204798 blocks (5.00%) reserved for the super user
...
# mount /dev/hda9 /somewhere
# df /somewhere
Filesystem 1024-blocks Used Available Capacity Mounted on
/dev/hda9 3574475 13 3369664 0% /mnt
# df -i /somewhere
Filesystem Inodes IUsed IFree %IUsed Mounted on
/dev/hda9 4096000 11 4095989 0% /mnt
#
Abbiamo una partizione con 4095976 blocchi, creiamo un filesystem di
tipo ext2 nella stessa, la montiamo e scopriamo che ha solo 3574475
blocchi - 521501 blocchi (12%) sono "persi" perch dedicati agli inode
e ad altre informazioni. da osservare che la differenza tra il
numero di blocchi totale 3574475 e il numero di blocchi disponibili
per gli utenti 3369664 pari a 13 blocchi in pi dei 204798 riservati
al root. Quest'ultimo numero pu esserre modificato utilizzando
tune2fs. Questa opzione `-i 1024' ragionevole solo per sistemi che
devono contenere molti piccoli file come le news e simili. Il valore
predefinito sarebbe:
# mke2fs /dev/hda9
# mount /dev/hda9 /somewhere
# df /somewhere
Filesystem 1024-blocks Used Available Capacity Mounted on
/dev/hda9 3958475 13 3753664 0% /mnt
# df -i /somewhere
Filesystem Inodes IUsed IFree %IUsed Mounted on
/dev/hda9 1024000 11 1023989 0% /mnt
#
Ora solo 137501 blocchi (3.3%) sono usati per gli inode, cos abbiamo
guadagnato rispetto a prima 384 MB (ogni inode accupa 128 byte).
D'altro canto, questo filesystem pu contenere al massimo 1024000 di
file (pi che sufficienti), contro i 4096000 (troppi) di prima.
|