Восстановление загрузчика LILO

LILO — загрузчик Linux.

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

Путем поисков нашел информацию по этой ситуации (полностью отрывок привожу ниже, чтобы учесть на всякий случай вариации).

В общем по итогу. Лучше всего найти диск с которого ставили систему Linux и войти в режим восстановления.

Потом посмотрел какие разделы у меня есть и примонтировал раздел. Сменил окружение командой chroot. И выполнил команду lilo. В общем привожу экран ниже, чтобы было понятнее.

После этого все получилось.

lilo

—————-

Отрывок из книги

      Избранное из книг «Запускаем Linux» М. Уэлш, М. Калле Далхаймер, Л. Кауфман. («Символ-плюс» Санкт-Петербург, 2000). «Системное администрирование Linux» М. Карлинг, С. Деглер, Д. Деннис. («Вильямс», 2000).

___________________________________________________________________________________

Проблемы с загрузкой систем 

Поскольку в процессе первоначальной загрузки принимает участие несколько различных программных компонентов, существует несколько отдельных этапов, на каждом их которых могут возникать разнообразные проблемы. Каждый из таких этапов мы обсудим в отдельности.

Ядро не загружается — остановы в процессе выполнения программы LILO. 

Во избежание появления большинства связанных с программой LILO проблем (всегда заново выполняйте команду /sbin/lilo после генерации новых ядер или изменения конфигурации жестких дисков. Обязательно учитывайте все сообщения об ошибках или предупреждения, которые эта команда генерирует в процессе обновления главной загрузочной записи или карты расположения используемых при загрузке файлов. С помощью параметра -v можно организовать вывод подробной информации обо всех выполняемых действиях.

Создайте загрузочную дискету, которая будет использоваться в случаях разрушения загрузочных карт LILO (включая и те случаи, когда главная загрузочная запись и таблица разделов оказываются уничтоженными вирусом загрузочных записей DOS). Создание резервных копий главной загрузочной записи и таблицы разделов диска описывается ниже в разделе «Повреждение или искажение главной загрузочной записи (MBR)».

Сохраняйте копию файла /etc/lilo.conf, копии главных загрузочных записей (MBR) и других небольших, но очень важных системных файлов на специальной аварийной дискете. Постоянно поддерживайте эти копии в актуальном состоянии, отражающем все вносимые в систему изменения.

Программа LILO выводит нескончаемую последовательность 01010101010… 

Ядро и карты загрузки находятся на устройстве, которое не поддерживается средствами BIOS.

Программа LILO останавливается в точке L. 

Первичный загрузчик LILO не может найти текст вторичного загрузчика этой программы. Кроме того, могут возвращаться коды ошибок жесткого диска, описанные в документе /usr/doc/packeges/lilo. Обычно эта ситуация означает, что программы BIOS и LILO по-разному судят о геометрии жесткого диска. Если программы BIOS поддерживают режим LBA, активизируйте его и поместите директиву linear в файл /etc/lilo.conf (либо удалите ее, если она там уже была), после чего выполните команду /sbin/lilo до повторной перезагрузки системы.

Проверьте, не превосходят ли размеры дисковых разделов максимального размера раздела, поддерживаемого программами BIOS.

Программа LILO останавливается в точке LI. 

Вторичный загрузчик программы LILO был найден, но его не удалось корректно загрузить. Эта проблема также может быть связана с геометрией диска. Если реальный файл /boor /boot.b и его описание в карте загрузки не соответствуют друг другу, выполните команду /sbin/lilo и перезагрузите машину.

Программа LILO останавливается в точке LIL? 

Вторичный загрузчик программы LILO не смог получить доступ к требуемому ему адресу. Проблема устраняется так же, как и в предыдущем случае.

Программа LILO останавливается в точке LIL. 

Вторичный загрузчик программы LILO не смог прочитать системную карту. Еще раз выполните команду /sbin/lilo.

Программа LILO останавливается в точке LIL- 

Таблица дескрипторов системной карты некорректна. Это означает, что файл /boot/map был разрушен или перемещен.

Проблемы с выполнением программы /sbin/lilo. 

В процессе выполнения команды lilo могут встречаться самые различные проблемы. Более подробные сведения можно получить при указании параметра -v.

Неверная сигнатура LILO.

Приведенное ниже сообщение об ошибке обычно означает, что разрушен файл /boot/boot.b. Другой вариант — в файле /etc/lilo.conf директива loader= указывает на объект, который команда lilo не воспринимает как программу первоначальной загрузки.

First boot sector doesn’t have a valid LILO signature
(Первый загрузочный сектор не содержит требуемой сигнатуры LILO)

Приведенное ниже сообщение об ошибке означает, что разрушен файл /boot/chain.b. Другой вариант — в файле /etc/lilo.conf директива loader= ука- зывает на объект, который команда lilo не воспринимает как загрузчик цепочки.

Chain loader doesn’t have a valid LILO signature
(Загрузчик цепочки не содержит требуемой сигнатуры LILO)

Загрузка ядра Linux выполняется программой вторичного загрузчика boot.b, которая загружается в память программой первичного загрузчика, расположенного в главной загрузочной записи (MBR). Все имеющиеся в файле lilo.conf директивы image= обрабатываются исключительно вторичным загрузчиком.

Программа загрузки chain.b используется для загрузки MS DOS и других операционных систем подобного типа. Она вызывается при загрузке версий операционных систем, задаваемых в файле lilo.conf директивами other=. Кроме того, для специфических вариантов загрузки машины могут использоваться особые программы первоначальной загрузки, описываемые директивой программы LILO loader=. Дополнительные сведения о программе LILO можно найти в руководстве LILO Technical Guide и в документах «Multiboot Using LILO mini-HOWTO»2 и «LILO mini-HOWTO»3.

Программы BIOS не имеют доступа к указанному жесткому диску. 

Иногда система выдает следующее сообщение:

Warning: BIOS drive 0х82 may not be accessible
(Внимание: BIOS не имеет доступа к устройству 0х82)

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

Некоторые варианты программ BIOS для PC и практически все расширения для использования интерфейса SCSI позволяют получать доступ к другим дисковым устройствам, помимо первых двух устройств, подключенных к первичному контроллеру. Однако ничего нельзя сказать заранее — все зависит от конкретного типа используе мого оборудования.

Приведенное выше сообщение команды lilo является просто предупреждением. В случае его появления никакого вреда устанавливаемой системе нанесено не будет. Если под рукой есть загрузочная дискета, то в качестве эксперимента его можно просто проигнорировать.

Если данный вариант загрузки системы работать не будет, попробуйте перераспределить дисковые разделы таким образом, чтобы разместить все загружаемые разделы на первом или втором устройствах первичного контроллера. Если это окажется невозможным, воспользуйтесь другим средствам загрузки системы (например, программой LOADLIN.EXE или пакетом Gnu GRuB).

Повреждение или искажение главной загрузочной записи (MBR). 

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

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

Копия главной загрузочной записи и таблицы разделов может быть создана с помощью следующей команды:

dd if=/dev/hda of=$BACKUP_FILE bs=512 count=1

Здесь значение /dev/hda представляет собой ссылку на первый жесткий диск с интерфейсом IDE. (Для ссылки на первый жесткий диск с интерфейсом SCSI используйте значение /dev/sda.) Параметру $BACKUP_FILE следует присвоить значение, представляющее собой любое подходящее имя файла, например /root/hda-mbr.bin. Размер блока устанавливается равным 512 байтам. Параметру count (счетчик) присвоено значение 1, поскольку требуется скопировать только один сектор данных. Если не указать значение этого параметра, то по умолчанию команда dd скопирует весь диск.

Отметим, что программа первичного загрузчика содержится в главной загрузочной записи только первичного жесткого диска (/dev/hda или /dev/sda). На всех остальных дисковых устройствах в этой записи будет содержаться только таблица разделов, а оставшаяся ее часть будет пустой. Как бы там ни было, очень полезно сохранять сведения о таблицах разделов всех жестких дисков компьютера. (Каждая из копий займет не более половины килобайта.)

Для восстановления главной загрузочной записи в команде dd достаточно поменять местами значения параметров if и of:

dd of=/dev/hda if=$BACKUP_FILE bs=512 count=1

Кроме того, таблицу разделов всегда можно восстановить вручную, воспользовавшись информацией, предварительно сохраненной или распечатанной с помощью команды fdisk -1. Полезно сохранить копию этих данных в системном пакете непосредственно в процессе исходной установки системы. В результате вы всегда будете знать местонахождение этих данных, независимо от последующих перемещений системы. Естественно предположить, что когда потребуется воспользоваться предусмотрительно созданной копией загрузочной записи, саму систему загрузить не удастся. Поэтому копии всех этих .bin-файлов должны быть помещены на аварийные дискеты (boot/root) и в любые альтернативные корневые файловые системы каждого из компьютеров. Эти файлы являются двоичными. Они не предназначены для чтения человеком и не должны редактироваться в среде каких-либо текстовых редакторов. Поэтому целесообразно хранить также текстовый вариант списка всех разделов диска (с указанием их размеров и расположения), предназначенный для чтения человеком. Этот список легко может быть получен с помощью следующих команд:

fdisk -1
mount

Достаточно просто перенаправить выходные данные в любой подходящий файл. Например, можно поместить результаты выполнения этих команд среди файлов /etc/READMY. Команда mount предназначена для установления соответствия между разделами и их точками монтирования, с целью уточнения, что именно должно находиться в каждом из разделов диска.

В результате даже при отсутствии файлов аварийных копий MBR всегда можно будет восстановить таблицу разделов вручную. Восстановить вручную текст программы первоначальной загрузки можно с помощью программы LILO. Это совсем несложно — достаточно выполнить команду /sbin/lilo с указанием корректного файла параметров /etc/lilo.conf.

Несколько сложнее восстановить таблицу разделов (последних 66 байт записи MBR) жесткого диска в том случае, если сведений об имевшихся на нем разделах у вас нет.

Если вам удастся обнаружить начало любой файловой системы типа ext2, то с помощью команды fdisk создайте раздел, начинающийся с этой точки и распространяющийся до конца диска. Если раздел будет больше, чем размеры найденной файловой системы, то утилита e2fsprogs и драйверы файловых систем Linux не выведут никаких сообщений, а просто заблокируют доступ к той части раздела, которая находится за пределами данной файловой системы. Теперь с помощью команд fsck и mount можно установить точные размеры для этой файловой системы. Затем следует вновь вернуться к программе fdisk и установить новую границу раздела на начало цилиндра, расположенного сразу точкой реального окончания найденной файловой системы. Для проведения расчетов потребуется воспользоваться калькулятором. Затем попробуйте обнаружить следующую файловую систему (предположив, что начало очередного раздела находится сразу же за последним блоком того раздела, размеры которого предположительно уже удалось установить). Последовательно смещайте начало следующего раздела на один цилиндр до тех пор, пока не удастся обнаружить начало следующей файловой системы.

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

Повреждение суперблока.

Ввиду важности суперблока файловая система периодически сохраняет его резервные копии. Вторая файловая система разбивается на «группы блоков», в каждой из которых по умолчанию 8192 блоков. Резервные копии суперблока находятся по смещениям (в блоках) 8193, 16 385 (т. е. 8192 * 2 + 1), 24 577 и т. д. Чтобы проверить, что блоки файловой системы объединены в группы по 8192, выполните команду:

dumpe2fs device | more

(Разумеется, эта команда работает, если главный суперблок не поврежден.) Эта команда выводит много сведений о файловой системе, в числе которых вы увидите что-нибудь вроде:

Blocks per group: 8192

Если будет выведено другое значение, нужно использовать его для вычисления смещений к копиям суперблока, аналогичным показанным выше. Если вы не можете смонтировать файловую систему из-за проблем с суперблоком, то, вероятно, fsck (или e2fsck) тоже откажется работать. Для восстановления файловой системы можно предложить e2fsck использовать одну из копий суперблока, для чего используйте команду:

e2fsck -f -b offset device

где offset является смещением в блоках копии суперблока; обычно равно 8193. Ключ -f используется для принудительной проверки файловой системы. При использовании резервных копий суперблока файловая система может показаться «целой», и в этом случае проверка не требуется. Ключ -f переопределяет это поведение. Например, для исправления файловой системы на устройстве /dev/hda2 с поврежденным суперблоком можно выполнить команду:

e2fsck -f -b 8193 /dev/hda2

Вновь установленное ядро не загружается. 

Для обновления карты размещения используемых при загрузке файлов выполните команду /sbin/lilo. В упомянутой карте содержится информация о точном расположении на диске каждого из файлов, к которым программе LILO потребуется получить доступ в процессе загрузки системы. В число этих файлов входит и файл с копией ядра (или несколько файлов с ядрами, если в файле /etc/lilo.conf описана конфигурация с несколькими вариантами загружаемых ядер). Подобная проблема часто возникает в тех случаях, когда сценарий автоматической модернизации системы выполняет все необходимые действия, за исключением запуска программы /sbin/lilo.

Если до «зависания» компьютера система выводит сообщение Loading Kernel…, то, возможно, в ядре имеется некоторая ошибка. Например, включенный в состав ядра драйвер выполняет проверку порта ввода/вывода или зарезервированного блока памяти, которые несовместимы с данным типом компьютера. В этом случае для определения сути и последующего устранения данной проблемы попробуйте воспользоваться параметрами ядра reserve= и exclude= (их можно задавать в командной строке программы LILO или программы LOADLIN.EXE).

Новое ядро выдает сообщение о превышении допустимых размеров ядра.

Если при компиляции ядра в качестве типа результата указать для утилиты make значение zlilo, то файл ядра будет создан в сжатом виде. В более новых системах тип результата bzlilo предполагает использование метода сжатия bzip2. Если после повторной компиляции ядра с указанием типа результата bzlilo упомянутое сообщение все равно будет выдано, то необходимо установить более новую версию программы LILO.

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

Ядро выдает сообщение о невозможности монтирования корневого каталога.

В ядре Linux определен устанавливаемый по умолчанию адрес корневой файловой системы (устройство и раздел), который задается прямо в его тексте. Это значение можно изменять с помощью команды rdev. Существует еще несколько подобных значений по умолчанию, которые жестко записываются в ядро в процессе его компиляции. Их также можно изменять с помощью различных параметров команды rdev, что позволяет избежать перекомпиляции ядра.

Если существующее имя корневой файловой системы не соответствует значению, установленному в ядре, то при попытке ее монтирования будет выдано упомянутое выше сообщение. Вероятно, ядро было создано либо на другой машине или с ошибкой, либо в оборудование машины были внесены изменения, еще не отраженные в ядре (например, интерфейс IDE был заменен на интерфейс SCSI).

Самый простой способ изменить записанное в ядре и принимаемое по умолчанию значение заключается в указании требуемого имени в параметре root=. Этот параметр вводится в командную строку программы LILO или непосредственно в командную строку вызова программы LOADLIN.ЕХЕ.

После успешной загрузки системы выполните команду rdev и/или модифицируйте файл /etc/lilo.conf, чтобы добавить в него директиву append=’ ‘ root= . . . ‘ ‘.

Ядро выдает сообщение о невозможности открыть исходную консоль.

Эта ошибка возникает в том случае, если корневая файловая система не имеет требуемого набора файлов устройств. Вероятно, в точку монтирования корневой файловой системы была смонтирована файловая система, отличная от корневой. В другом варианте некто (или нечто) уничтожил каталог /dev и/или часть его узлов-файлов.

Загрузитесь с аварийной дискеты, а затем смонтируйте основную файловую систему и восстановите либо файл /etc/fstab (если выбранный для каталога / раздел расположен не на корневом устройстве), либо сам каталог /dev и его файлы-узлы. Для создания необходимых файлов можно воспользоваться сценарием MAKE DEV (в большинстве дистрибуций Linux он расположен в каталоге /dev). Для выборочного выполнения подобных операций может использоваться команда mknod.

Отметим, что новые версии ядер Linux поддерживают механизм динамического управления узлами tty с помощью специальной программы-диспетчера (она называется ptmx и работает с файловой системой /dev/pts). Поддержка необходимого для этой цели пространства пользователя предоставляется пакетом Gnu glibc 2.0 и более поздними. Программные компоненты, выбираемые из более старых библиотек, могут давать сбой, если не будут иметь доступа к статическим узлам tty, в то же время новые программы могут давать сбой в случае возникновения проблем с системой ptmx (например, когда ядро было откомпилировано без поддержки Unix98 PTY).

Экран мерцает и на нем отсутствует приглашение к регистрации в системе.

Если рабочая станция настроена на использование виртуальной консоли xdm или программы GNOME gdm (предназначенной для предоставления графического интерфейса регистрации в системе с Х WINDOW) и на экране монитора заметны повторяющиеся безрезультатные попытки системы начать процедуру регистрации пользователя, проверьте состояние мыши.

Вначале проверьте, подключена ли мышь к компьютеру. Затем вручную перезагрузите систему в режиме одного пользователя и убедитесь, что в каталоге /dev имеется соответствующий файл устройства. Затем попробуйте выполнить команду gpm — это позволит убедиться, что система знает о существовании мыши и может с ней работать. В противном случае вручную запустите команду startx и проанализируйте выводимые сообщения об ошибках. Проверьте состояние используемых системой Х Window файлов настройки (обычно это /etc/XF86Config и /etc/Xll/XF86Config) и убедитесь, что мышь, которую ищет система, является той самой, которая подключена к машине.

Другая проблема, не позволяющая системе Х Windiw нормально начать работу, может заключаться в отсутствии доступа к каталогу со шрифтами — локальному или расположенному на некотором сервере.

Если все упомянутые условия выполнены, то ошибка может заключаться в неверной настройке самой программы xdm.

Система выдает сообщение о невозможности загрузить интерпретатор.

Если это сообщение постоянно появляется сразу же после загрузки системы, то, вероятнее всего, разрушен файл /etc/Id.so.cache и для его восстановления необходимо выполнить команду Idconfig. Этой команде потребуется считать из файла /etc/Id.so.conf информацию о путях доступа к библиотекам. Пути доступа к библиотекам могут также задаваться в переменной окружения LD_LIBRARY_PATH.

Кроме того, может быть исчерпан доступный объем оперативной памяти (реальной и виртуальной) или переполнена таблица процессов (в которую помешается строка при запуске каждого нового процесса). Найдите способ остановить уже запущенные процессы — это необходимо для освобождения ресурса, а потом подумайте, что можно сделать для предотвращения повторного появления подобной ситуации. Если какой-то из процессов вышел из под контроля, установите его создателя и внесите изменения в соответствующую программу.

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

Можно создать дополнительные файлы (или разделы) страничного обмена, что позволит увеличить объем виртуальной памяти системы без установки дополнительных дисковых устройств. Подробнее об этом рассказывается на странице mkswap man. Отметим, что увеличение оперативной памяти компьютера всегда предпочтительнее, чем увеличение объема его виртуальной памяти.