Genis Disk mini-NASIL Burak Kelleci , burak@compclub.itu.edu.tr Esin Tolga Akay , tolga@compclub.itu.edu.tr Cengiz Gunay , cengiz@compclub.itu.edu.tr Surum 1.1, 23.1.1997 Disk geometrisi ve diskler icin 1024 silindir siniri hakkinda 1. Giris 1024 silindirden daha fazlasina sahip bir diskiniz oldugunu dusunun. Ustune de BIOS'u kullanan bir isletim sistemine sahip oldugunuzu dusunun. O zaman bir probleminiz vardir, cunku alisildik INT13 BIOS diske G/C (giris/cikis) arabirimi, G/C'nin yapildigi silindir numarasi icin 10 bit kullanir ve boylelikle 1024'ten sonraki silindirler erisilemez. Neyse ki, Linux BIOS kullanmaz, oyleyse problem yok. Aslinda, iki sey disinda: 1. Sisteminizi actiginizda, henuz Linux calismaya baslamamisken, sizi BIOS problemlerinden kurtaramayacaktir. Bunun LILO ve benzeri acilis yukleyicilerine birtakim etkileri vardir. 2. Butun isletim sistemlerinin, bolumlemelerin nerde oldugu hakkinda anlasmalari icin bir diski kullanmalari gerekmektedir. Bir baska sekilde, Linux ve mesela DOS'u ayni diskte kullaniyorsaniz, ikisinin de bolumleme tablosunu ayni sekilde yorumlamasi gerekir. Bunun Linux cekirdegi ve fdisk'e etkisi vardir. Asagida butun ilgili durumlari iceren, biraz detayli bir aciklama var. Benim 2.0.8 surum cekirdek kaynaklarini referans kullandigimi unutmayin. Diger surumler biraz farkedebilir. 2. Acilma Sistem acildiginda, BIOS ilk diskin (ya da disketin) 0. sektorunu (MBR-Ana Acilis Kaydi olarak bilinir) okur ve orada bulunan koda atlar ve calistirir. Genelde bir suruklemeli acilis yukleyici. Orada bulunan bu ufak suruklemeli acilis yukleyicilerin genelde kendi disk surucu kodlari bulunmaz ve BIOS servislerini kullanirlar. Bu da bir Linux cekirdeginin ancak tamamiyle ilk 1024 silindir dahilinde bulunmasi halinde acilis yaptirilabilecegini gosterir. Bu problem kolayca cozulebilir: Cekirdegin (ve belki acilis sirasinda kullanilan baska dosyalarin; LILO harita dosyalari gibi), BIOS'un erisebildigi bir diskin - genelde bu ilk ya da ikinci disk olur - tamamiyle ilk 1024 silindiri icerisinde bulunan bir disk bolumu icerisinde bulundugundan emin olun. Bir baska nokta da BIOS ve acilis yukleyicisinin disk geometrisi hakkinda anlasmalaridir. LILO'ya `linear' (dogrusal) opsiyonunu vermek yararli olabilir. Ek detaylar asagida. 3. Disk Geometrisi ve Bolumler Eger disklerinizde bircok isletim sistemleri varsa, o zaman herbiri bir ya da daha fazla disk bolumu kullanirlar. Bu bolumlerin bulunduklari yer hakkindaki bir anlasmazlik, felaketler dogurabilir. MBR ana bolumlerin nerede bulundugunu gosteren bir bolumleme tablosu icerir. 4 tablo girisi bulunur ve herbiri suna benzer struct bolum { char aktif; /* 0x80: acilis yapabilir, 0: yapamaz*/ char bas[3]; /* ilk sektor icin CHS */ char tip; char son[3]; /* son sektor icin CHS */ int baslangic; /* 32 bit sektor numarasi (0'dan baslayarak) */ int uzunluk; /* 32 bit sektor sayisi*/ }; (CHS Silindir/Kafa/Sektor(Cylinders/Headz/Sectors)'u ifade eder). Bu yuzden, bu bilgi fazladir: bir bolumun yeri hem 24-bit baslangic ve bitis bilgileri, hem de 32-bit baslangic ve uzunluk bilgileri ile verilir. Linux sadece baslangic ve uzunluk bilgilerini kullanir, ve boylelikle 2^32 sektorden buyuk olmayan bolumlerle ugrasabilir, bu da, en fazla 2TB'lik bolumlerdir. Bu bugun varolan disklerden yaklasik ikiyuz kat daha fazladir, onun icin onumuzdeki on yil falan icin yeterli olacaktir. Ne yazik ki, BIOS INT13 cagrisi uc bayt icine kodlanmis CHS kullanir, bunun icinde 10 bit silindir numarasi icin, 8 bit kafa numarasi icin ve 6 bit iz sektoru numarasi icin. Uygun silindir numaralari 0-1023, kafa numaralari 0-255 ve iz sektor numaralari i se 1-63 (Evet, bir iz uzerindeki sektor numaralari 1'den baslar, 0'dan degil) arasindadir. Bu 24 bit ile 8455716864 bayt (7.875 GB) adreslenebilir, 1983'te bulunan disklerden ikiyuz kat daha buyuk. Daha da ne yazik ki, standart IDE arabirimi iz basina 256 sektor, 65536 silindir ve 16 kafaya izin verir. Bu kendi icinde 2^37 = 137438953472 bayta (128 GB) ulasima izin verir, ama 63 sektor ve 1024 silindir BIOS kisitlamalariyla birlestiginde sadece 528482304 bayt (504 MB) adreslenebilir hafiza kalir. 4. Ceviri ve Disk Yoneticileri Hic kimse sabit disklerin gercek yapisi ile ilgilenmez. Aslinda her ize dusen sektor sayisi bile degiskendir. Cunku diskin kenarina yakin izlere, ic taraftakilere gore daha fazla sektor duser. Yani gercekte her ize dusen sabit sayida sektor yoktur. Kullanici icin en iyisi, sektorleri dogrusal bir dizi seklinde numaralandirmak ve sektorun yasadigi gercek yerin bulunmasini disk denetleyicisine birakmaktir. Bu lineer numaralandirma LBA olarak bilinmektedir. (c,h,s) sektorunun lineer adresi, (C,H,S) geometrisine sahip bir disk icin c*H*S + h*S + (s-1)'dir. Butun SCSI ve bazi IDE denetleyiciler, LBA'yce konusurlar. Eger BIOS, 24 bitlik (c,h,s)'yi LBA'ya cevirirse ve LBA modunda calisan disk denetleyicisine beslerse, 7.875 GB adreslenebilmektedir. Bu butun diskler icin yeterli olmasa da bir gelismedir. Bu arada BIOS tarafindan kullanilan CHS'nin artik gercekle bir al akasi yoktur. Bunun bir benzeri disk denetleyicisi LBA modunda calismazken, fakat BIOS ceviriyi bilirken olmaktadir. (Bu genellikle setup'da Large(Genis/buyuk) diye gecer.) Simdi BIOS isletim sistemine (C',H',S') geometrisini gostermektedir ve disk denetleyicisiyle kon usmak icin de (C,H,S)'yi kullanmaktadir. Burda genellikle; S=S', C'=C/N ve H'=H*N'dir ve N, C' <= 1024 kosulunu saglayacak sekilde secilir. (ki C'=C/N'ye yuvarlarken mumkun olan en az kapasite bosa harcansin.) Bu metodla, yine, 7.875 GB'a kadar adresleme mumkundur. Eger BIOS Large ve LBA tanimiyorsa, bu sorunu yazilimla da cozebiliriz. OnTrack veya EZ-Drive gibi disk yoneticileri BIOS'un disk kontrol rutinlerini kendilerininkilerle degistirmektedirler. Bu genellikle, disk yoneticisinin kodunu MBR((Master Boot Record )ana acilis kaydi)'ye ve devam eden sektorlere yerlestirmesiyle yapilir(OnTrack bu koda DDO der; Dynamic Drive Overlay), boylelikle herhangi bir isletim sistemi acilmadan once bu kod calisabilir. Bu yuzden bilgisayari disketle actigimizda, disk yonetici d isketten yuklenmezse sorunla karsilasiriz. Olay, cevirmen BIOS durumuyla hemen hemen ayni sekilde calisir. Eger diskte birkac isletim sistemi birden calistiriliyorsa, disk yoneticileri soruna neden olabilir. Linux, surum 1.3.14'ten itibaren OnTrack ve surum 1.3.29'dan itibaren EZ-Drive disk yoneticilerini desteklemektedir. Asagida bazi ek detaylara yer verilmistir. 5. IDE Diskler Icin Cekirdekten Disk Cevirisi Eger Linux cekirdegi bir IDE diskte bir disk yoneticisi belirlerse diski, disk yoneticisinin yaptigi gibi adreslemeye calisir, ki ayni bolumlemeyi gorsun. Eger diskin geometrisi 'hd=cyls, heads,sects' komut satiriyla cekirdege belirtilirse bunu YAPMAZ. Bu yontem, disk yoneticisi ile uyumlulugu oldurebilir. Bu adresleme, C<=1024 veya H=255 olana kadar H*C sabit kalmak sartiyla kafa sayisi olarak 4,8,16,32,64,128,255 denenerek yapilir. Detaylar su sekildedir - altkisim basliklari denk gelen acilis mesajlarinda verilen kelimelerdir. Burada ve bu yazinin icindeki heryerde bolumleme tipleri onaltilik olarak verilmistir. 6. Sonuclar Peki butun bunlarin anlami ne ? Linux kullanicilari icin tek bir sey; LILO & fdisk'in dogru geometri kullanmalari. Dogru tanimi, fdisk icin disk uzerinde calisan diger isletim sistemleri tarafindan kullanilan geometri, LILO icinse acilis esnasinda BIOS ile basarili etkilesimi saglayacak geometridir. (Bu ikisi genelde cakisir.) fdisk, diskgeometri hakkinda nasil bilgi alir ? HDIO_GETGEO ioctl (giris cikis kontrolu)'i kullanarak cekirdege sorar. Fakat kullanici aradan etkiyerek veya komut satirindan bu geometriyi cigneyerek degistirebilir. LILO geometri hakkinda nasil bilgi alir ? HDIO_GETGEO ioctl (giris cikis kontrolu)'i kullanarak cekirdege sorar. Fakat kullanilan geometriyi `disk=' secenegi ile cigneyerek belirleyebilir. LILO'ya linear (dogrusal) secenegi de verilebilir. O zaman, harita dosyasina (map file) CHS yerine LBA adreslerini koyarak, kullanilacak geometriye acilis esnasinda karar verir. (Kesme 13h, Fonksiyon 8 ile surucu geometrisini ogrenir.) Cekirdek ne cevap verecegini nasil bilebilir ? Herseyden once, kullanici 'hd=silindir,kafa,sektor' komut satiri secenegi ile geometriyi acikca belirtmis olabilir. Aksi takdirde, cekirdek donanima soracaktir. 6.1 IDE detaylari Uzerinde dikkatle durursak: IDE surucusu geometri bilgisi icin dort kaynaga sahip. Birincisi (G_user) kullanici tarafindan komut satirindan belirtilir. Ikincisi (G_bios) 32-bit moduna gecmeden once sistem baslangicinda okunan BIOS Fixed Disk Parameter Table (BOIS Sabit Disk Parametre Tablosu)'dir (sadece birinci ve ikinci diskler icin). Ucuncusu (G_phys) ve dorduncusu (G_log) IDE denetleyicisi tarafindan IDENTIFY(tanimla) komutunun cevabi olarak yollanir - bunlar fiziksel ve kullanimdaki mantiksal geometrilerdir. Diger bir taraftan, surucunun geometri icin iki degere ihtiyaci vardir. Bir taraftan HDIO_GETGEO ioctl tarafindan gonderilen G_fdisk ve diger taraftan G/C (giris/cikis) icin asil kullanilan G_used. G_fdisk ve G_used, ikisi de, eger verilmisse G_user'a esitlenirler, yoksa ve CMOS'ta da bu sekilde belirtilmisse G_bios'a, aksi takdirde G_phys'e esitlenirler. Eger G_log mantikli gorunuyorsa, G_used ona esitlenir. Aksi takdirde eger G_used mantiksiz gorunuyorsa ve G_phys mantikli gorunuyorsa, G_used G_phys'e esitlenir. Burada mantikli lafi kafa sayisinin 1-16 sinirlari icerisinde olmasidir. 6.2. SCSI detaylari SCSI icin durum biraz farkli; SCSI komutlari zaten mantiksal blok numaralari kullandiklarindan, gercek G/C kullanimda bir `geometri' tamamiyle gerceklenemez oluyor. Ama, bolumleme tablosu hala ayni oldugu icin fdisk'in hala bir geometri uydurmasi gerekir ve hatta HDIO_GETGEO'yu burada kullanir - aslinda fdisk, IDE ve SCSI diskler arasinda fark tanimaz. Asagidaki detayli aciklamalardan gorulebilecegi gibi, birtakim suruculer herbiri birsekilde farkli bir geometri bulmustur. Acikcasi, buyuk bir karmasa. Eger DOS veya benzeri kullanmiyorsaniz, eger mumkunse butun harici cevirme seceneklerinden kacinin ve sadece 64 kafa, iz basina 32 sektor (hos, kullanisli bir silindir basina 1 MB icin), ki diski bir denetleyiciden baskasina tasidiginizda sorun cikmasin. Linux fdisk'inin H ve S kafa ve izbasina sektor sayilarina, LBA sektor numaralarini c/h/s adreslerine cevirmek icin ihtiyac duydugunu, fakat bu ceviride C silindir sayisinin hicbir rol oynamadigini unutmayin. Bazi suruculer, (C,H,S) = (1023,255,63) kullanarak diskin en az 1023*255*63 sektor belirtir. Bu hos degildir, cunku gercek boyutu ortaya koymaz ve de bircok fdisk versiyonu kullanicisini disklerinin 8 GB'i ile sinirlarlar - ki bu gunlerde gercek bir kisitlama. Sorunsuz gunlere..