2004 г.
Linux для пользователя
Виктор Костромин,
http://rus-linux.net/
Глава 9. Подключение и настройка аппаратных устройств
9.5. Жесткий диск
9.5.1. Нумерация
Сначала приведем дополнительные сведения о нумерации жестких дисков в системе Linux (табл. 9.3).
Таблица 9.3. Нумерация жестких дисков
Тип жесткого диска | Старший номер | Наименование устройства | Младший номер |
|
|
| Диск 1 | Диск 2 |
IDE на 1 контроллере | 22 | /dev/hda и /dev/hdb | 0 … 63 | 64 … 127 |
IDE на 2 контроллере | 33 | /dev/hdc и /dev/hdd | 0 … 63 | 64 … 127 |
SCSI | 8 | /dev/sd | 0 … 15 | 16 … 31 |
Первые жесткие диски на обоих IDE-контроллерах получают младшие номера 0, а вторые диски — номера 64 (и имена /dev/hda и /dev/hdb). По этим номерам происходит обращение ко всему диску в целом, независимо от количества разделов на этом диске. Разделы на дисках получают, соответственно, следующие по порядку номера: первый раздел на первом диске — номер 1 и имя /dev/hda1, второй раздел — номер 2 и имя /dev/hda2 и так далее.
Более двух дисков на IDE-контроллере не бывает, и более двух контроллеров на персональные компьютеры обычно не ставят, так что всего бывает не более 4 IDE-дисков (/dev/hd[a-d]).
Аналогично, целые SCSI-диски получают младшие номера 0, 16, 32 и так далее, и имена /dev/sd[a-g]. Разделы на этих дисках получают младшие номера, следующие по порядку за младшим номером всего диска: первый раздел на диске /dev/sda получает младший номер 1 (и имя /dev/sda1), первый раздел на диске /dev/sdb получает младший номер 17 (и имя /dev/sdb1), и так далее.
9.5.2. Форматирование жесткого диска
Низкоуровневое форматирование жесткого диска под Linux невозможно. Впрочем, в этом нет особой необходимости, поскольку современные диски выпускаются отформатированными на низком уровне.
Форматирование на высоком уровне заключается в создании на диске разделов и файловой системы. Для создания разделов под Linux используются программы fdisk, cfdisk и sfdisk. Как сообщает man-страница к программе fdisk, программа cfdisk позволяет создать качественную таблицу разделов, но имеет некоторые ограничения. Программа fdisk, хотя и позволяет произвести разбиение диска в большинстве случаев, но содержит несколько ошибок. Ее главное преимущество в том, что она поддерживает разделы DOS, BSD и других систем. Программа sfdisk работает более корректно, чем fdisk, и она гораздо мощнее и fdisk, и cfdisk, но имеет неудобный пользовательский интерфейс. Так что man-страница рекомендует пытаться применять эти программы в следующем порядке: cfdisk, fdisk, sfdisk.
Однако, на мой взгляд, интерфейс любой из этих программ не предназначен для начинающих пользователей. Поэтому для создания разделов на диске я бы рекомендовал использовать программу Partition Magic фирмы Power Qwest. Несколько слов о ней было сказано в главе 2, как и о разбиении диска, поэтому на этом вопросе более не будем останавливаться.
После разбиения диска на разделы надо создать файловую систему в разделах, предназначенных для использования под Linux,. Для этого используется команда mkfs. С ее помощью можно создать не только файловую систему типа ext2fs, но и файловые системы других типов. Типичный пример запуска этой команды:
[root]# mkfs –t тип /dev/hda3
где тип — тип создаваемой файловой системы, например, ext2, а /dev/hda3 — указание форматируемого раздела диска (Примеч.19).
Чтобы использовать mkfs, не обязательно иметь права суперпользователя, достаточно иметь право записи в файл соответствующего устройства.
Внимание!
Команда mkfs очень опасна! Она перезаписывает область диска, в которой хранятся inodes. Так что если вы ошибетесь в указании раздела диска, вы можете уничтожить ценные для вас данные.
После создания файловой системы ее надо смонтировать в общее дерево каталогов. Делается это с помощью команды mount, которую мы уже рассматривали, так что повторяться не стоит. Единственное, что можно отметить, так это то, что смонтировав первый раз диск или раздел, в котором вы только что создали файловую систему, вы увидите, что она пуста, т. е. не содержит никаких файлов и каталогов, кроме единственного каталога с именем lost+found. Этот каталог должен существовать в каждой файловой системе, поскольку он выполняет служебную роль: при проверке файловой системы командой fsck в этом каталоге собираются "потерянные" файлы и подкаталоги. О команде fsck мы еще поговорим, но до этого рассмотрим кратко вопрос об оптимизации работы жесткого диска, которая выполняется с помощью команды hdparm.
9.5.3. Команда hdparm
Команда hdparm служит для того, чтобы получить или установить некоторые параметры IDE-интерфейса жесткого диска (ов). С помощью этой команды можно попытаться оптимизировать работу с жестким диском. Однако имейте в виду, что команда эта не безопасна. Если задать значение параметра, которое не поддерживается аппаратным обеспечением, можно потерять данные на диске.
Данные о том, в каких случаях стоит использовать эту команду, весьма противоречивы. Одни авторы [П11.8] уверяют, что с ее помощью добиться чуть ли не 10-кратного увеличения скорости обмена данными с жестким диском, другие [П1.5] утверждают, что можно потратить много времени на настройку интерфейса жесткого диска, а в результате получить лишь незначительное увеличение скорости работы. По-видимому, получаемый выигрыш определяется, в основном, моделью жесткого диска, так что сами решайте, имеет ли смысл этим заниматься. Но, как утверждает Rob Flickenger [П11.8], если у вас IDE или EIDE диск, выпущенный не более 2 лет назад, то заняться оптимизацией стоит!
Экспериментировать с этой командой рекомендуется получив права суперпользователя, причем лучше, если система запущена в однопользовательском режиме. Поскольку существует опасность потери данных, перед использованием команды hdparm необходимо сделать резервную копию ценной информации, и каждый раз перед ее запуском выполнять команду sync, чтобы сбросить на диск данные, находящиеся временно в буферах.
Формат запуска команды прост:
[user]$ hdparm опция устройство
Если после указания опции не указывать нового значения для соответствующего параметра, то будет просто выдано его действующее значение. А если запустить команду без указания опций вообще, то будут выведены значения основных параметров, действующих при работе с данным устройством (IDE-диском). Вывод выглядит примерно следующим образом:
[user]$ hdparm /dev/hda
/dev/hda:
multcount = 0 (off)
I/O support = 0 (default 16-bit)
unmaskirq = 0 (off)
using_dma = 0 (off)
keepsettings = 0 (off)
nowerr = 0 (off)
readonly = 0 (off)
readahead = 8 (on)
geometry = 1870/255/63, sectors = 30043440, start = 0
Обычно это значения, устанавливаемые по умолчанию. Как видите, большинство возможностей просто отключено. Это и естественно, поскольку разработчики дистрибутивов выбирают такие значения параметров, при которых будут работать любые типы дисков. А уж об оптимизации параметров для вашего диска придется позаботиться вам самим!
Для начала посмотрим, какую еще информацию о диске и параметрах интерфейса можно получить с помощью команды hdparm.
Опция -i позволяет получить информацию о модели жесткого диска, его серийном номере и некоторых других параметрах.
Опция -g выводит информацию о геометрии диска (число цилиндров/головок/секторов), его размере (числе секторов), и начальном смещении (номер сектора, с которого начинается используемое пространство, обычно 0).
Опция –T позволяет протестировать скорость обмена данными с кэшем (т. е. скорость работы подсистемы память-ЦПУ-буфер кэш).
Опция –е служит для тестирования скорости непосредственно записи на диск (а не в кэш-память).
Поскольку опции в команде можно комбинировать, давайте, выполним команду
[root]# hdparm -Tt /dev/hda
Результатом будут примерно такие строки (для вашего диска цифры, конечно, будут другими):
/dev/hda:
Timing buffer-cache reads: 128 MB in 1.34 seconds = 95.52 MB/sec
Timing buffered disk reads: 64 MB in 17.86 seconds = 3.58 MB/sec
Эти данные позволяют судить о производительности подсистемы ввода-вывода вашего жесткого диска. Если ваш диск не очень давнего выпуска, можно попытаться поднять производительность этой подсистемы, используя следующие опции команды hdparm:
С помощью опции –c вы имеете возможность воздействовать на формат обмена данными между процессором и жестким диском. По умолчанию используется значение 16 бит, но если после –c указать 1 или 3, то произойдет переключение на один из режимов 32-битной передачи. Режим, имеющий номер 3, считается более надежным, хотя и работает чуть медленнее.
Используя опцию –d 1 можно активизировать режим DMA (Direct Memory Access — прямой доступ к памяти). Однако, чтобы это имело смысл, ядро должно быть скомпилировано с поддержкой DMA.
Опция –m задает многосекторный режим ввода-вывода. Число после опции указывает максимальное количество секторов, которые можно передать вместе. Это ускоряет передачу больших файлов. Максимально допустимое значение этого параметра для вашей модели жесткого диска указано под ключевым словом MaxMultSect в перечне параметров, выдаваемых командой hdparm –i.
С помощью опции –p можно настраивать режим PIO (программируемый ввод-вывод). Чем выше число (можно использовать значения в интервале от 0 до 5), тем быстрее осуществляется передача данных. Повышение этого параметра ничего не дает при работе с медленным диском, но повышает опасность потери данных, так что подходите к его использованию осторожно.
Включение опции –u приводит к тому, что снимается запрет на обработку других прерываний, установленный на время обработки дискового прерывания. Это означает, что во время ожидания запрошенных с диска данных ядро сможет принять и обработать другие запросы (например, полученные от сетевых устройств или модема). Это должно положительно сказаться на общей производительности системы, но не все аппаратные конфигурации способны работать в таком режиме!
Давайте попробуем осторожно улучшить настройки подсистемы ввода-вывода данных для жесткого диска. Изменяйте значения параметров по одному, и после каждого изменения проверяйте результат с помощью команды
hdparm –tT /dev/hda.
В случае зависания компьютера или каких-то других неприятностей (вы к ним готовы, не так ли!), перезагружайте компьютер (снова в однопользовательском режиме) и пробуйте другое значение для параметра, изменявшегося последним. Поскольку задаваемые вами установки нигде не зафиксировались, вы будете каждый раз начинать с одной и той же точки. Приведу для иллюстрации тот результат, на котором я решил остановить эксперименты:
[root]# hdparm -X66 -d1 -u1 -m16 -c3 /dev/hda
/dev/hda:
setting 32-bit I/O support flag to 3
setting multcount to 16
setting unmaskirq to 1 (on)
setting using_dma to 1 (on)
setting xfermode to 66 (UltraDMA mode2)
multcount = 16 (on)
I/O support = 3 (32-bit w/sync)
unmaskirq = 1 (on)
using_dma = 1 (on)
[root]# hdparm -tT /dev/hda
/dev/hda:
Timing buffer-cache reads: 128 MB in 1.43 seconds =89.51 MB/sec
Timing buffered disk reads: 64 MB in 3.18 seconds =20.13 MB/sec
Как видите, скорость обмена данными возросла у меня примерно в 6 раз!
Как уже было сказано, после выполнения команды hdparm с любым набором опций вновь установленные значения действуют только в текущем сеансе работы системы, а после перезагрузки оптимизированные установки будут потеряны. Поэтому после завершения экспериментов надо еще записать вызов команды с подобранными значениями опций в один из системных скриптов загрузки, например, в /etc/rc.d/rc.sysinit (в ALT Linux Junior 1.0 для настройки IDE-дисков имеется специальный скрипт /etc/rc.d/scripts/idetune). Желательно перед этим убедиться, что система ведет себя стабильно и даже выполнить команду проверки состояния файловой системы на данном устройстве (см. разд. 9.5.4).
В заключение заметим, что кроме опций, влияющих на производительность подсистемы ввода-вывода (имейте в виду, что далеко не все они были рассмотрены выше), команда hdparm имеет еще ряд опций, позволяющих управлять энергопотреблением и другими характеристиками дисковой подсистемы. Полный список всех опций команды hdparm смотрите на соответствующей man-странице (man 8 hdparm).
9.5.4. Команда fsck
Описание команды fsck, наверное, правильное было бы отнести к разделу о файловых системах, но, поскольку ее предназначение состоит в том, чтобы по возможности восстановить работоспособность дисковой подсистемы, мы рассматриваем ее в разделе о настройке жесткого диска.
Основная функция программы fsck заключается в восстановлении логической непротиворечивости файловой системы, созданной в разделе жесткого диска. При выполнении этой команды производится поиск следующих ошибок:
- сектора, которые используются одновременно двумя файлами;
- сектора, которые включены в список свободных секторов, хотя они содержат часть какого-то файла;
- сектора, которые не содержат информации, но не включены в список свободных секторов;
- индексные дескрипторы файлов (inodes), не указанные ни в одном каталоге;
- неверная общая информация в суперблоке и т. д.
Формат запуска команды следующий:
[root]# fsck [опции] [–t fstype] [--fs-options] filesystem
где fstype — тип проверяемой файловой системы, а в качестве filesystem можно указать либо имя устройства (например, /dev/hda4), либо точку монтирования (/, /opt, /mnt/wint) (Примечание: в man-странице по fsck сказано, что можно еще использовать метку (label) файловой системы, либо UUID, но, что такое два последних варианта, я пояснить не берусь).
Вообще говоря, команда fsck не является самостоятельной утилитой, она просто предоставляет единый интерфейс вызова специализированных программ для проверки файловых систем разных типов. Эти программы называются fsck.fstype (например, fsck.ext2) и команда fsck при запуске производит поиск соответствующей специфической программы сначала в /sbin, затем в /etc/fs и /etc, и, наконец, в каталогах, перечисленных в переменной PATH. Опции, указанные после двойного дефиса, передаются команде fsck.fstype.
Из собственных опций команды fsck (они указываются сразу после имени) стоит отметить опции –A, –a, –r и –N. Если указать опцию –a, то при обнаружении ошибок в файловой системе будет производиться их автоматическое исправление. Указание опции –A приводит к тому, что команда просмотрит файл /etc/fstab и за один прогон проверит все перечисленные в нем файловые системы. Опция –r переключает команду в интерактивный режим работы, т. е. перед тем, как произвести какие-то изменения, будет выдаваться запрос на подтверждение действия. Задание опции –N приводит к тому, что никаких изменений в файловой системе производится не будет, будет только сказано, что должно быть сделано.
При загрузке ОС Linux в некоторых случаях происходит автоматический запуск команды fsck. Основных причин для выполнения fsck на этапе загрузки системы две: некорректный выход из системы в предыдущий раз (например, резкое отключение питания или неисправность аппаратуры) и достижение заданного порога для количества выполнений операции размонтирования файловой системы. При каждом выполнении операций монтирования-размонтирования файловой системы в ее суперблоке (см. главу 16) делаются специальные отметки. Если последнее размонтирование завершилось корректно, то файловая система помечается как "чистая" (clean) и число операций монтирования-размонтирования увеличивается на единицу. Если корректного размонтирования не было, то файловая система помечена как "грязная" (dirty). На этапе загрузки ОС проверяется, являются ли все файловые системы "чистыми", и если нет, то для "грязных" систем выполняется команда fsck. Кроме того, даже если все системы "чистые", но достигнут порог для числа операций монтирования/размонтирования, запускается та же команда с опцией –A. Как было сказано выше, при этом производится проверка всех файловых систем, перечисленных в файле /etc/fstab. Порядок, в котором проверяются файловые системы, определяется числами, указанными в последнем поле каждой строки файла /etc/fstab. Файловые системы проверяются в порядке возрастания этих номеров. Первым всегда следует проверять корневой раздел. Если две файловые системы расположены на разных дисках, им может быть присвоен один и тот же номер. Это приводит к тому, что они будут проверяться одновременно, а, значит, сократится общее время проверки. Но если файловые системы расположены на одном и том же физическом устройстве (например, в разных разделах), то совпадение номеров вызовет только замедление процедуры проверки, так как головки диска должны будут совершать лишние перемещения.
Иногда требуется запустить fsck и вручную. При этом лучше всего предварительно перевести систему в однопользовательский режим и размонтировать проверяемые файловые системы (или смонтировать их в режиме "только для чтения"). Например, запуск fsck в разделе /usr обычно требуется тогда, когда файловая система разрушена и тогда любые дальнейшие действия в разрушенной системе могут привести к полному краху, а, значит, fsck должна быть запущена как можно скорее. Обычно о необходимости перехода в однопользовательский режим говорит также то, что fsck не может автоматически восстановить файловую систему при загрузке. Такое случается относительно редко, обычно при выходе из строя жесткого диска или при попытках установить какую-либо экспериментальную версию ядра, но все же об этом надо знать, чтобы не растеряться в затруднительной ситуации.
К сожалению, в процессе восстановления файловой системы приходится полностью полагаться на возможности программы fsck. Начинающему пользователю не стоит самостоятельно пытаться произвести какие-то действия в поврежденной файловой системы, потому что вы рискуете перевести ядро в паническое состояние (kernel panic).
Если fsck обнаруживает "потерянные файлы", т. е. такие файлы, которые не указаны ни в одном из каталогов, она помещает их в каталог lost+found на верхнем уровне проверяемой файловой системы. Поскольку имена файлов регистрируются только в родительском каталоге, то в данном случае их "истинные" имена неизвестны, и команда присваивает им имена, совпадающие с номерами их индексных дескрипторов.