|
141001 г.Мытищи МО Ул.Институтская д:1 ком:101 (095) 588-52-39, 588-55-62 E-mail: [email protected] |
Сервер Лаб. Космической информатики каф.ВТ Московский Государственный Университет Леса
|
---|
Что значит все выше сказанное? Для пользователей Линукс только одну вещь: необходимость быть уверенными в том, что LILO и fdisk используют правильную геометрию. Правильная геометрия для fdisk - та, которая используется ОС находящейся на том же диске, а для LILO - та которая позволяет успешно взаимодействовать с BIOS во время загрузки. (обычно эти две геометрии совпадают)
Как fdisk
узнает о геометрии? Он спрашивает ядро,используя
HDIO_GETGEO
ioctl. Но пользователь может заставить
fdisk
использовать другую геометрию в интерактивном режиме или в
командной строке.
Как LILO узнает о геометрии? Оно запрашивает ядро, используя
HDIO_GETGEO
ioctl. Но пользователь также может обойти эту
геометрию, указав специальный параметр `disk=
' в файле
/etc/lilo.conf
(см. lilo.conf(5)). Возможно также задание опции
linear
, которая заставит LILO хранить в его map файле LBA адреса,
вместо CHS и будет определять геометрию при загрузке с помощью INT13(функция 8).
Как ядро узнает о геометрии? Во первых, возможно,что пользователь указал
детальную геометрию в командной строке ядра
`hda=
cyls,
heads,
secs'
(см. bootparam(7)),вручную или указав загрузчику необходимость передать эти
параметры ядру. Например,для LILO нужно добавить строку `append =
"hda=
cyls,
heads,
secs"
'
в /etc/lilo.conf
(см. lilo.conf(5)). Или же ядро может само
догадаться о геометрии, опросив BIOS или "железо".
Начиная с версии ядра 2.1.79 возможно указание геометрии ядру с помощью
файловой системы /proc
. Например:
# 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
#
Иногда бывает удобно указать какую либо конкретную геометрию указав
`hda=
cyls,
heads,
secs'
в командной строке ядра. Почти всегда необходимо указывать secs=63, для
того чтобы указать heads. (Наиболее удачными значениями на сегодняшний
день будут heads=16 и heads=255.) Что необходимо указать для
cyls? Это должно быть число соответствующее полной емкости диска в
секторах C*H*S. Например для диска с 71346240 секторами (36529274880 байт) С
должно быть вычислено как 71346240/(255*63)=4441 (посчитать это можно например с
помощью bc
) , и заданы следующие параметры
hdc=4441,255,63
. Как можно узнать полную емкость диска? Например ,
# 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
дает два способа нахождения полного числа секторов -
71346240. Нахождение путем просмотра сообщений выдаваемых ядром при загрузке
# dmesg | grep hdc
...
hdc: Maxtor 93652U8, 34837MB w/2048kB Cache, CHS=70780/16/63
hdc: [PTBL] [4441/255/63] hdc1 hdc2 hdc3! hdc4 < hdc5 > ...
говорит нам о (как минимум) 34837*2048=71346176
секторах и соотвественно о 70780*16*63=71346240 секторах. В данном случае вторая
величина корректна, но в общем то обе могут быть округлены в меньшую сторону.
Это хороший способ получить представление о размере диска когда
hdparm
не доступен. Но некогда не задавайте слишком большое
значение для cyls! В случае с SCSI дисками, точное число секторов
выдается ядром при загрузке.
SCSI device sda: hdwr sector= 512 bytes. Sectors= 17755792 [8669 MB] [8.7 GB]
(и MB, GB округляются, но никогда в меньшую сторону, и
являются `двоичными').