Большие IDE жесткие диски


Дилемма


Существует две возможности, одна - можно заставить Linux поверить в описание диска в CMOS, предназначенное для DOS; другая - поступиться 12Мб объема диска и только использовать первые 1024 цилиндра. (все числа, приводимые в этой главе даны для IDE жесткого диска Conner 540Mb)

Рассмотрим простой вариант:

Загрузите машину и прервите начальную загрузку (нажав клавишу Del), чтобы войти в секцию конфигурации CMOS. Выберите базовую конфигурацию и посмотрите тип вашего жесткого диска. Тип может называться "user" или "47", именно для диска этого типа вам нужно отыскать информацию о количестве цилиндров, головок и секторов из имеющегося списка.

НЕ ИЗМЕНЯЙТЕ ЧИСЛО СЕКТОРОВ!

На самом деле диск содержит 1048 цилиндров, 16 головок и 63 сектора на дорожке. Однако цилиндры и головки отображаются таким образом, чтобы соответствовать пониманию мира, специфичного для DOSа, где не может существовать более чем 1024 цилиндра на устройстве (это и понятно, всего 10 бит для адреса, 2^10=1024). Простейший способ - это установить число цилиндров в 1024, головок в 16, но оставив прежнее число секторов, равное 63. Это будет стоить вам 24 цилиндров или
                     24*(540/1048) = 12Mб,
но при этом вы получите геометрию, не отличающуюся от настоящего диска. Тогда инсталляция будет проста и без ухищрений.

Теперь рассмотрим вариант непростой:

Пусть CMOS определил цилиндров 524, головок 32 и секторов 63.
Загрузитесь с диска boot, который у вас уже сделан.
На ПЕРВУЮ подсказку введите реальную геометрию диска (НЕ то, что определил CMOS!).
В этом случае напечатайте:
          ramdisk hd=1048,16,63
вы можете указать геометрию для второго IDE устройства, включая второй параметр после первого, как в этом примере:
          ramdisk hd=1048,16,63 hd=xxxxx,yy,zz
(подставьте ваши параметры вместо x,y,z)
Продолжите процесс загрузки.
После того, как вы сообщили эту информацию, замените boot дискету на root. Когда Linux загрузится, зарегистрируйтесь как 'root' и вызовите утилиту fdisk. Предполагая, что IDE диск первый, введите:
          fdisk /dev/hda
Затем проделайте следующую процедуру:
  1. нажмите 'p', чтобы просмотреть существующие разделы;
    удалите любой раздел, который вам не нужен (будем надеяться - в этом случае все!);
  2. нажмите 'x', чтобы войти в эксперт-меню;
  3. нажмите 'c', чтобы изменить число цилиндров на значение в CMOS;
    (в нашем примере 524).
  4. нажмите 'h', чтобы проделать аналогичную процедуру для указания числа головок;
    (в нашем примере 32).
  5. вернитесь в главное меню fdisk, чтобы определить ваши разделы, как-будто бы вы имеете нормальное число цилиндров и головок;
  6. нажмите 'w', чтобы сохранить новую таблицу разделов и выйти.

После того, как таблица разделов будет заново создана, продолжите инсталляцию, используя 'setup' и все должно быть прекрасно.

Обратите внимание, что когда вы пожелаете вновь использовать fdisk, вам придется еще раз полностью проделать только что описанную процедуру, чтобы заставить систему поверить в то, что она видит. Cейчас Linux, DOS и CMOS все видят одну и ту же (искаженную) картину реальности!

Пожалуйста, заметьте еще, что вышеописанная техника работает с любым устройством, имеющем более чем 1024 цилиндра. Формула проста: Сократите количество цилиндров на такой коэффициент, чтобы получить число меньшее 1024, а затем умножьте количество головок на этот коэффициент.

НЕ ИЗМЕНЯЙТЕ ЧИСЛО СЕКТОРОВ!

Для правильной работы LILO вы должны включить предложение "append" в файл конфигурации LILO, '/etc/lilo.conf', чтобы описать для него реальную геометрию диска. Вставьте следующие строки в начало вашего файла конфигурации:
             append="hd=cccc,hhhh,ssss"
             linear
где
cccc = кол-во цилиндров
hhhh = кол-во головок
ssss = кол-во секторов

Если у вас два IDE диска, укажите геометрию обоих, как здесь:

             append="hd=cccc,hhhh,ssss hd=CCCC,HHHH,SSSS"
             linear
где
cccc = кол-во цилиндров для диска C:
hhhh = кол-во головок для диска C:
ssss = кол-во секторов для диска C:

CCCC = кол-во цилиндров для диска D:
HHHH = кол-во головок для диска D:
SSSS = кол-во секторов для диска D:

(не забудьте перезапустить '/sbin/lilo', чтобы внести необходимые изменения)
С этими добавленными параметрами LILO будет иметь возможность загружаться с нового, "большого" жесткого диска.


Небольшой экскурс в EIDE (Enhanced IDE)


Ядра, версии которых выше 1.1.40, не имеют проблем с использованием больших IDE устройств (IDE устройства с более чем 1024 цилиндрами). Однако много дистрибутивов еще используют старые версии ядра для своих инсталляционных дисков, так что будет уместно немного рассказать об истоках этих проблем.

Существует возможность использовать Linux на больших IDE устройствах без ограничения его местонахождения на диске. Поговорим на примере DOS и Linux, но это справедливо и для других систем.


Подоплека и терминология


Секторы на ATA (IDE) устройствах имеют размер 512 байт. Существует два способа адресации секторов. Первый способ - это форма логического адреса блока (LBA, Logical Block Address), или логическая форма, где секторы нумеруются линейно, начиная с 0.

Вторым способом адресации является форма "цилиндр-головка-сектор", (Cylinder-Head-Sector, CHS) или физическая форма, в которой адресация каждого сектора происходит триплетом "цилиндр-головка-сектор".

Чтобы преобразовать адреса из логической формы в физическую, необходимо знать, сколько головок приходится на цилиндр и сколько секторов на дорожке. Если общее число цилиндров также известно, можно определить объем диска. Количество цилиндров, головок на цилиндр, секторов на дорожке и называется дисковой геометрией.

Старым контроллерам и BIOS-ам требовалась адресация секторов в физической форме. Linux же везде использует логические адреса, исключая возможно самый нижний уровень, когда он транслирует их в физическую форму для контроллера. Linux не использует BIOS ни в чем, кроме как определения геометрии диска.

Таблица разделов записывает начало и конец каждого раздела в обоих формах, логической и физической. И DOS fdisk и Linux fdisk предполагают, что эти значения соответствуют друг другу. DOS fdisk добывает геометрию диска, запрашивая BIOS; Linux fdisk получает эту информацию, запрашивая ядро.

MS-DOS и интерфейс BIOS используют 10-битовое поле для хранения номера цилиндра, поэтому они могут предоставить доступ только к цилиндрам 0-1023. Этого не достаточно для современных устройств, которые имеют тенденцию к тому, чтобы иметь 63 сектора/дорожке, 16головок/цилиндр и большое количество цилиндров. Решением может быть следующий ход: EIDE BIOS будет говорить "неправильные" данные, когда запрашивается геометрия диска, деля пополам или даже на 4 реальное количество цилиндров и, соответственно, увеличивая в два или четыре раза количество головок. Затем всякий раз, когда поступает физически адресованный запрос I/O, BIOS будет предполагать, что запрос базируется на фиктивной геометрии диска и будет конвертировать его соответствующим образом для контроллера. Этот процесс называется "трансляцией адреса".


Неправильное решение


Можно использовать программу 'setup' BIOS, чтобы полностью выключить трансляцию адреса. Вам придется вручную установить значения для цилиндров/головок/секторов в реальной геометрии или, это возможно, выключить трансляцию адреса в зависимости от того, как работает ваш 'setup'.

Затем вы можете перекроить разделы на диске с помощью DOS и/или Linux fdisk, инсталлируя обе операционные системы, и это будет работать, правда, с некоторыми ограничениями.

Проблема заключается в том, что BIOS еще нельзя использовать для доступа к цилиндрам с номерами большими 1023. Таким образом, все ваши DOS разделы должны будут размещаться ниже этого предела. Например, LILO использует BIOS, чтобы сделать всю "грязную" работу; поэтому, если вы хотите, чтобы LILO загружал Linux, вы должны быть уверены, что ядро (читай весь корневой раздел) лежит в первых 1023 цилиндрах. Сам Linux, однако, счастливым образом будет иметь доступ ко всему диску.


Правильное решение


Ограничения досаждают и мы постараемся обойти их. Очевидно, что нужно оставить трансляцию адреса и подойти к решению проблемы с другой стороны.

Во время загрузки передадим ядру реальную геометрию диска. Это можно сделать в ответ на подсказку LILO, напечатав

     <image-name> hd=<cylinders>,<heads>,<sectors>
Эту опцию можно передавать автоматически, используя директиву "append" в вашем файле конфигурации LILO.

Сейчас ядро сможет узнать устройство и иметь к нему доступ, но когда пользовательская программа, например, fdisk или инсталлятор LILO, запросят у ядра геометрию диска, ядро вернет реальную, а не фиктивную геометрию. Таким образом, Linux fdisk (запросивший ядро) и DOS fdisk (запросивший BIOS) будут иметь противоречия относительно того, как должна выглядеть таблица разделов. Инсталлятор LILO будет вычислять физические адреса, которые несовместимы с тем, что требует BIOS (а следовательно и LILO во время работы). Эта проблема fdisk имеет простое решение: надо войти в эксперт-меню и установить фиктивные значения для цилиндров и головок (как в BIOS). Затем отредактировать таблицу разделов, записать ее и выйти, уверенно полагая, что сейчас Linux fdisk и DOS fdisk не будут иметь никаких разногласий.

Проблема с LILO также легко решается: добавьте директиву "linear" в ваш файл конфигурации LILO, 'lilo.conf'. Это заставит LILO использовать логические адреса вместо физических, чтобы запоминать свои данные, и вычислять физические адреса во время загрузки, а не во время инсталляции. Таким образом будет использоваться геометрия, которую снабжает BIOS, вместо геометрии, которую снабжает ядро, и все будет правильно работать.


Подведем итоги на примере


Пусть у нас есть 1 Gb EIDE диск, на котором мы установили Linux. Опишем процедуру, которую мы использовали.

УрбанСофт