Журнал LinuxFormat - перейти на главную

LXF100-101:Загрузить незагружаемое

Материал из Linuxformat
Версия от 14:56, 19 марта 2009; Crazy Rebel (обсуждение | вклад)

(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск
Загрузка Как добраться до важных файлов, если Linux не грузится?

Когда Linux не загружается

Мысль об этом вгоняет в дрожь пользователей всех ОС - не дай Бог, компьютер откажется загружаться. Д-р Крис Браун прольет бальзам на ваши раны.

Для нас, старых волков, загрузка, или «начальная загрузка» – это та глубоко таинственная последовательность операций, выполняемых компьютером между его включением и выводом приглашения войти в систему. За это время куча непонятных сообщений проплывает по экрану, но обычно пользователи их игнорируют, и большинство дистрибутивов Linux скрывает их за красивым экраном с обнадеживающим прогресс-индикатором. И это замечательно – пока работает. На данном уроке мы рассмотрим процесс загрузки более подробно: в частности, выясним, что может пойти неправильно и как диагностировать и устранить проблему.

Проникаемся проблемой

Когда я преподавал Linux на одном из моих курсов, многие слушатели говорили мне, что интересуются устранением неисправностей в той или иной форме. Некоторые ищут рецептов типа кулинарных – «Увидев сообщение об ошибке X, запустите команду Y», но таким способом устранить неисправность удается редко. Мой первый совет всем тем, кто столкнулся с проблемой, всегда один и тот же: «При устранении неисправности первым делом надо понять, как система должна работать. Вторая важная вещь – точно представить, что система пыталась сделать, когда неисправность возникла».

LXF100 74 1.jpg Рис. 1: Нормальный порядок событий загрузки Linux.

Помня об этом, взглянем на загрузку Linux. Знание нормальной последовательности событий и установление, как далеко она зашла перед возникновением проблемы, являются ключевыми для диагностики и исправления проблем загрузки. Рисунок 1 справа показывает нормальную последовательность событий (зеленые стрелки) и указывает на некоторые возможные пути неудачи (красные стрелки).

Знакомимся с загрузкой поближе

Загрузка – операция многоступенчатая. При включении компьютера контроль вначале переходит к программе, называемой BIOS, которая хранится в постоянной памяти на материнской плате. BIOS выполняет тестирование оборудования и разведку окрестностей на предмет устройств для загрузки, и выводит экран конфигурации, позволяющий установить порядок поиска загрузочных устройств; в современных BIOS их диапазон весьма широк, в том числе PXE-загрузка с сетевого сервера. На нашем уроке мы рассмотрим только загрузку с жесткого диска.

Затем BIOS считывает главную загрузочную запись (Master Boot Record, MBR) с выбранного устройства и запускает ее. (Не найдя MBR, BIOS выведет сообщение вида «Нет операционной системы» и впадет в полный ступор.) MBR занимает первый сектор диска. Он содержит таблицу разделов (64 байта) и очень короткую (446 байт) программу первичной загрузки, или ‘stage 1’. Этот загрузчик всего-навсего выводит на экран слово Grub и передает эстафету загрузчику второй стадии, используя «карту блоков», внедренную в MBR (карта содержит номера блоков, где находится загрузчик ‘stage 2’). Здесь я подразумеваю, что вы используете загрузчик Grub. Существует также более старый загрузчик Lilo, но Grub «умнее» и используется в большинстве современных дистрибутивов Linux. Второй этап работы загрузчика Grub по сути дела «полуторный», и если вы посмотрите в директории /boot/grub, то увидите там файлы, содержащие различные его варианты, с именами вида e2fs_stage_1_5 и reiserfs_stage_1_5. Каждая из этих программ способна получить доступ к файлам по их имени, используя определенный формат файловой системы. e2fs_stage_1_5 может читать файловые системы ext2 и ext3, reiserfs_stage_1_5 – файловую систему reiser, и т.д. Grub способен обратиться к файлам по их имени во время начальной загрузки (перед запуском Linux), и этим он отличается от Lilo. Программа «полуторного» этапа загружает Grub stage 2, который значительно больше. На этом этапе считывается файл конфигурации Grub (обычно /boot/grub/menu.lst или /boot/grub/grub.conf) и, на основе содержащихся там записей, выводится меню выбора операционных систем для загрузки. Если Grub не может найти свой файл конфигурации, он переходит в интерактивную командную строку, позволяющую ввести команды Grub вручную. Типичное содержание записи menu.lst такое:

title openSUSE 10.2
      root (hd0,0)
      kernel /boot/vmlinuz-2.6.18.2-34-default root=/dev/hda1 vga=0x317 showopts
      initrd /boot/initrd-2.6.18.2-34-default

Первая строчка просто содержит текст, который появится в меню загрузки. Следующие за ней строки содержат команды, которые Grub должен выполнить, если вы выберите этот пункт меню. Строка root подсказывает Grub, где искать корневую файловую систему. У Grub своя система именования разделов диска, отличная от системы, принятой в Linux, что сбивает с толку. На языке Grub hd0 означает первый диск – а на обычном ПК с IDE-дисками это будет ссылка на Linux-устройство /dev/hda, или, на более свежих дистрибутивах, /dev/sda [на самом деле что для grub означает hd0 итд определяется в файле /boot/grub/device.map]. На языке Grub (hd0,0) ссылается на первый раздел этого диска – в Linux это будет /dev/hda1 или /dev/sda1. Строка kernel определяет файл, который Grub должен загрузить как ядро Linux; в конце этой строки вы увидите несколько дополнительных параметров загрузки, передаваемых ядру. Подробнее об этом чуть позже. Строка initrd определяет файл ‘initial RAM Disk’ – образ файловой системы, которая будет использоваться ядром как загрузочная. Grub также отвечает за загрузку его в память. Если Grub не может найти ядро или образ ram-диска, он выводит Error 15: File not found (Ошибка 15: Файл не найден) и останавливается.

Как только ядро стартует, оно монтирует корневую файловую систему с жесткого диска. Имя раздела, содержащего эту файловую систему, передается ядру как параметр, который вы видели в файле menu.lst выше. Монтирование корневой файловой системы – ключевая точка процесса загрузки, и если вы пытаетесь точно определить проблему, жизненно важно выяснить, удалось ли ядру это сделать. Сбой в монтировании файловой системы, как правило, приводит к «панике ядра» [kernel panic], хотя некоторые системы просто зависают. Если же ядро благополучно смонтировало корневую файловую систему, оно создает одиночный процесс (с ID 1), выполняющий программу /sbin/init. Если ядро не может найти init, оно также «паникует» и останавливается или (в зависимости от дистрибутива) выкидывается в командную строку суперпользователя. Да, кстати, придется добавить вам путаницы: Ubuntu больше не использует init, он заменен на upstart.

Init отвечает за запуск скриптов, которые запустят все остальные сервисы в системе. Существует очень важный и достаточно низкоуровневый скрипт, запускаемый init в начале процесса. В Red-Hat-подобных системах это /etc/rc.d/rc.sysinit, в SUSE – /etc/init.d/boot. Среди прочего, этот первичный скрипт последовательно проверяет и монтирует остальные разделы диска, прописанные в /etc/fstab. Хотя, конечно, на этом этапе тоже хватает потенциальных неприятностей, но рассказ о них придется оставить до следующего месяца.

Персональные инструменты
купить
подписаться
Яндекс.Метрика