Next Previous Contents

6. Konsekuensi

Apakah arti semua ini? Bagi para user Linux hanya satu hal: mereka harus memastikan bahwa LILO dan fdisk menggunakan geometri yang benar, di mana arti kata 'benar' bagi fdisk adalah geometri yang digunakan harus sama dengan geometri yang digunakan oleh sistem operasi lain pada disk tersebut, dan arti kata 'benar' bagi LILO adalah geometri tersebut memungkinkan dilakukannya interaksi dengan BIOS pada saat boot. (Biasanya kedua hal tadi dipenuhi secara bersamaan).

Bagaimana fdisk dapat mengetahui geometri? fdisk akan bertanya kepada kernel menggunakan HDIO_GETGEO ioctl. Namun user dapat mengatasi (override) geometri baik secara interaktif maupun melalui baris perintah.

Bagaimana LILO dapat mengetahui geometri? LILO akan bertanya kepada kernel menggunakan HDIO_GETGEO ioctl. Namun user dapat mengatsi geometri menggunakan opsi "disk = ". Seseorang dapat pula memberikan opsi linier terhadap LILO yang menyebabkan LILO akan menyimpan alamat LBA kedalam file map menggantikan alamat CHS, serta menemukan geometri yang akan digunakannya saat boot (menggunakan INT13 Function 8 untuk menanyakan geometri drive).

Bagaimana kernel mengetahui jawaban di atas? Terlebih dahulu, user mungkin telah memberikan spesifikasi sebuah geometri secara eksplisit melalui opsi baris perintah "hd = cyls, head, sect"; kalau tidak, maka kernel akan bertanya kepada hardware.

6.1 IDE secara terinci

Baiklah akan penulis jelaskan lebih lanjut. Driver IDE memiliki 4 sumber informasi mengenai geometri. Pertama (G_user) spesifikasi dari user melalui baris perintah. Kedua (G_bios) adalah Tabel Parameter Fixed Disk (hanya untuk disk pertama dan kedua) yang dibaca pada saat startup sistem sebelum berpindah ke mode 32-bit. Ketiga (G_phys) dan Keempat (G_log) berasal dari controller IDE sebagai respon terhadap perintah IDENTIFY, masing-masing merupakan geometri "physical" dan "current logical".

Di sisi lain, sebuah driver memerlukan dua nilai bagi geometri, yaitu: G_fdisk berasal dari HDIO_GETGEO ioctl, dan G_used yang digunakan sesungguhnya untuk melakukan I/O.

G_fdisk dan G_used kedua-duanya akan diberi nilai inisial dengan nilai dari: G_user, atau dengan G_bios jika informasi ini tersedia di CMOS, dan terakhir dengan G_phys jika semua yang disebut sebelumnya tidak tersedia. G-used akan diset ke G_log jika nilai G-log dapat diterima (reasonable); sebaliknya, jika G_used tidak dapat diterima (unreasonable) sedangkan G_phys dapat diterima maka G_used diset ke G_phys. Dalam hal ini arti istilah "dapat diterima" adalah nomor head yang dimilikinya berada diantara angka 1-16.

Dengan perkataan lain: baris perintah dapat mengatasi (overriden) BIOS dan akan menentukan apa yang dilihat fdisk, tetapi jika baris perintah memberikan spesifikasi terjemahan geometri (dengan head lebih dari 16) maka spesifikasi bagi keperluan I/O kernel akan diatasi oleh output dari perintah IDENTIFY.

6.2 SCSI secara terinci

Situasi pada SCSI agak sedikit berbeda karena perintah SCSI telah menggunakan penomoran block secara logika sehingga "geometri" tidak berguna untuk I/O aktual. Namun, format dari tabel partisi masih tetap sama, sehingga fdisk harus menemukan suatu geometri dan menggunakan HDIO_GETGEO - fdisk sungguh tidak membedakan antara disk IDE dengan SCSI. Seperti yang dapat dilihat pada deskripsi dibawah ini, setiap driver menggunakan geometri yang berbeda-beda. Betul-betul keadaan yang kacau.

Jika Anda tidak menggunakan DOS atau sejenisnya, hindarilah setiap seting bagi partisi extended, jika memungkinkan gunakanlah hanya 64 head, 32 sector per-track (agar lebih baik dan mudah: 1 MB per-silinder), agar tidak menimbulkan masalah saat memindahkan disk tersebut dari satu controller ke controller lainnya. Beberapa driver SCSI (ah152x, pas16, ppa, qlogicfas, qlogicisp) sangat kaku dengan DOS kompatibilitas sehingga tidak mengizinkan sistem Linux menggunakan lebih dari 8GB. Ini merupakan suatu bug.

Apakah geometri yang sesungguhnya? Jawaban paling mudah adalah: Tidak ada. Jika memang ada, Anda mungkin tidak ingin mengetahuinya, dan sangat pasti tidak akan pernah memberikannya kepada fdisk, LILO, atau kernel. Geometri riil hanya merupakan keperluan controller SCSI dan disk. Penulis ulangi: hanya orang-orang yang aneh saja yang akan memberikan geometri riil dari disk SCSI kepada fdisk/LILO/kernel.

Namun jika Anda betul-betul ingin tahu, Anda dapat mencari jawaban dari disk itu sendiri. Perintah READ CAPACITY merupakan perintah penting untuk mendapatkan ukuran total dari disk. Perintah MODE SENSE: di dalam "Rigid Disk Drive Geometry Page" (page 04), akan memberikan jumlah silinder dan head (informasi ini tidak dapat diubah), di dalam "Format Page" (page 03) akan memberikan jumlah byte per-sector dan sector per-track. Angka yang terakhir ini umumnya tergantung kepada notch, sedangkan jumlah sector per-track bervariasi - track yang lebih luar akan memiliki jumlah sector lebih besar dibandingkan track yang lebih dalam. Banyak sekali hal-hal rinci dan kompleks, dan jelas sekali bahwa tidak seorangpun (bahkan mungkin tidak juga sistem operasi) ingin menggunakan informasi ini. Selanjutnya, selama kita hanya berkepentingan dengan fdisk dan LILO, seseorang mendapat jawaban seperti C/H/S=4476/27/171 - nilai-nilai tersebut tidak dapat digunakan bagi fdisk karena tabel partisi hanya mneyediakan tempat 10 resp. 8 resp. 6 bit bagi C/H/S.

Lalu, dari manakah HDIO_GETGEO kernel mendapatkan informasi? Informasi tersebut dapat berasal dari controller SCSI atau merupakan hasil pendugaan cerdas (educated guess). Beberapa driver nampaknya mengira kita ingin mengetahui hal yang sesungguhnya, padahal yang ingin kita ketahui hanyalah apakah yang akan digunakan oleh FDISK dari DOS atau OS/2 (atau AFDISK dari adaptec, dst) itu.

Perlu dicatat bahwa fdisk Linux membutuhkan angka-angka jumlah head (H) dan sector per-track (S) untuk membuat konversi LBA menjadi alamat c/h/s, tetapi C (jumlah silinder) tidak berperan dalam konversi ini. Beberapa driver menggunakan (C,H,S) = (1023, 255, 63) untuk memberi tanda bahwa kapasitas drive sekurang-kurangnya berjumlah 1023*255*63 sector. Hal ini disayangkan, karena hal tersebut tidak menunjukan ukuran sesungguhnya, dan akan membatasi pemakai dari kebanyakan versi fdisk hanya sampai 8 GB dari disk mereka - sangat membatasi untuk kebutuhan saat ini.

Di dalam keterangan dibawah ini, M menunjukkan kapasitas total dari disk; C, H, S masing-masing menunjukkan jumlah silinder, jumlah head, dan jumlah sector per-track. Jika C didefinisikan sebagai M/(H*S), nilai tersebut sudah cukup untuk mendapatkan nilai-nilai H dan S.

Secara default, H=64, S=32

aha1740, dtc, g_NCR5380, t128, wd7000: H=64, S=32

aha152x, pas16, ppa, qlogicfas, qlogicisp: H=64, S=32; kecuali apabila C > 1024 maka H=255, S=63, C=min(1023, M/(H*S)). (Sehingga nilai C dipotong, dan H*S*C tidak merupakan pendekatan bagi kapasitas disk M. Hal ini akan membingungkan hampir semua versi dari fdisk). File ppa.c menggunakan M+1 sebagai pengganti M dan menyatakan bahwa sebagai akibat bug di dalam sd.c maka M berbeda 1).

advansys: H=64, S=32; kecuali jika C > 1024 dan opsi "> 1 GB" pada BIOS di-enable maka H=255, S=63

aha1542 Controller akan diminta untuk menentukan skema penterjemahan yang akan digunakan: apakah H=255, S=63 ataukah H=64, S=32. Dalam kasus pertama, akan muncul pesan boot "aha1542.c: Using extended bios translation".

aic7xxx: H=64, S=32; kecuali jika C > 1024, dan apakah parameter "extended" boot telah diberikan atau "extended" bit di dalam SEEPROM telah diset, dalam hal ini H=255, S=63

buslogic: H=64, S=32; kecuali jika C >= 1024 dan penterjemahan "extended" dari controller sudah di-enable, dalam kasus ini jika M < 2^22 dipenuhi maka H=128, S=32, jika tidak dipenuhi maka H=255, S=63. Sesudah membuat pilihan mengenai (C,H,S), tabel partisi dibaca dan jika nilai endH=H-1 ditemui pada salah-satu pasangan (H,S) dari ketiga kemungkinan pasangan berikut: (64,32), (128, 32), (255, 63) maka pasangan (H,S) tersebut digunakan, dan pesan boot menampilkan "Adopting Geometry from Partition Table".

fdomain: Cari informasi geometri di dalam Drive Parameter Table dari BIOS, atau bacalah tabel partisi dan gunakan H=endH+1, S=endS untuk partisi pertama apabila partisi tersebut tidak kosong; atau gunakan H=64, S=32 untuk M < 2^21 (1 GB), H=128, S=63 untuk M < 63*2^17 (3.9 GB), atau H=255, S=63 untuk yang lainnya.

in2000: Gunakan (H,S) pertama dari urutan: (64,32), (64,63), (128,63), (255,63) yang memenuhi C <=1024. Dalam kasus terakhir, C dipotong menjadi 1023.

seagate: Membaca C,H,S dari disk. (Horror!) Jika C atau S terlalu besar maka tetapkan S=17, H=2 dan kalikan H dengan 2 sampai tercapai C <=1024. Ini berarti H=0 jika M > 128*1024*17 (1.1 GB). Ini merupakan bug.

ultrastor dan u14_34f: Salah satu mapping berikut: ((H,S) = (16,63), (64,32), (64,63)) digunakan tergantung dari mode mapping controller-nya.

Jika driver tidak memberikan spesifikasi geometri, kita akan kembali melakukan pendugaan menggunakan tabel partisi atau menggunakan kapasitas total dari disk.

Perhatikan kembali tabel partisi. Berdasarkan konvensi (convention), ujung sebuah partisi terletak pada batas silinder, jika diketahui end = (endC, endH, endS) untuk setiap partisi maka kita dapat menetapkan H=endH+1 dan S=endS. (Ingatlah bahwa penomoran sector mulai dari nomor 1.) Lebih tepat lagi, dilakukan hal berikut ini. Jika tidak terdapat partisi kosong, ambillah partisi yang memiliki nilai beginC terbesar. Dari partisi tersebut lihatlah isi field end+1, jumlahkan isi field-field start dan length, serta dilakukan asumsi bahwa partisi tadi berakhir pada batas silinder. Jika end+1 dan start+length memiliki nilai yang sama; atau jika endC=1023 serta hasil penjumlahn start+length merupakan multiple integral dari (endH+1)*endS maka dapat ditetapkan bahwa H=endH+1 dan S=endS juga dengan asumsi bahwa batas partisi ini terletak pada batas silinder. Jika cara ini tidak berhasil disebabkan karena tidak adanya partisi atau ukuran partisinya agak asing, maka perhatikan saja ukuran kapasitas disk M. Dengan algoritma sbb:

        H = M/(62*1024)         (dibulatkan keatas),
        S = M/(1024*H)          (dibulatkan keatas),
        C = M /(H*S)            (dibulatkan kebawah).

Cara ini menghasilkan (C,H,S) dengan C < 1024 dan S < 62.


Next Previous Contents