Советы по Linux: Поиск rootfs во время загрузки

Четыре совета о том, как «вновь найти» потерянную корневую файловую систему после добавления новых устройств хранения или адаптеров

В качестве администратора Linux® вы можете столкнуться с ошибками rootfs cannot mount rootfs и kernel panic при попытке перезагрузить сервер после монтирования томов на внешних хранилищах или даже при установке новой операционной системы Linux. В этой статье описан процесс загрузки Linux на платформе x86, объясняется, почему возникают подобные проблемы, а также содержатся советы, как их исправить или предотвратить.

Лей Цзян, разработчик ПО, IBM

Лей Цзян (Lei Jiang) работает в IBM China Systems and Technology Lab в Шанхае в составе группы тестирования систем хранения Open Systems Interoperability Validation Lab. Он имеет трехлетний опыт поддержки и тестирования гетерогенных хранилищ SAN. В настоящий момент он работает над технологиями хранения, открытыми системами SAN и решениями высокой готовности.



16.04.2009

Обзор проблемы

Корневая файловая система (обозначенная в примере сообщения об ошибке как rootfs) является основным компонентом Linux. Корневая файловая система содержит все необходимое для работы полноценной ОС Linux. Она содержит все приложения, настройки, устройства, данные и т. д. Без корневой файловой системы запуск ОС Linux невозможен.

Вы можете столкнуться с ошибкой cannot mount rootfs (следующей за сообщением kernel panic) после перезагрузки компьютера. Как правило, это происходит после монтирования томов из внешних устройств хранения. Также это может случиться после завершения копирования файлов и перезагрузки для завершения установки ОС.

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

Другой причиной происходящего может послужить тот факт, что ядро Linux пытается монтировать корневую файловую систему, но необходимое устройство не найдено. Другими словами, корневая файловая система расположена не там, где она должна быть. Например, вы устанавливаете корневую файловую систему Linux на диск /dev/sda, но системе не удается смонтировать этот диск при перезагрузке:

  1. Диск /dev/sda не виден во время перезагрузки компьютера. Причиной этого может быть то, что Linux не смог загрузить какой-то важный драйвер для корневой файловой системы. Это маловероятно. Программа установки Linux собирает все необходимые драйверы в образ initrd, чтобы Linux смог без проблем загрузить драйверы устройств во время загрузки. Тем не менее эта ошибка может возникнуть, если вы устанавливаете драйверы вручную.
  2. Диск /dev/sda подключен, но он не содержит необходимой корневой файловой системы. После загрузки необходимая корневая файловая система расположена в /dev/sdb. Это наиболее вероятный случай.

Так как же /dev/sda могло измениться на /dev/sdb после перезагрузки? В ОС Linux запись /dev/sd* обозначает устройство SCSI. Linux именует эти устройства от sda до sdz (а затем от sdaa до sdzz и т. д.). Первое устройство SCSI обозначается /dev/sda, второе - /dev/sdb и т. д.

Если вы подключили какое-либо устройство к адаптеру, драйвер которого загружается раньше драйвера устройства с корневой файловой системой (первоначально расположенной на /dev/sda), то адрес устройства с корневой файловой системой перемещается на одну букву вперед (/dev/sdb), и оно перестает быть первым в списке устройств. Соответственно операционная система не может смонтировать rootfs, поскольку не находит ее в начале списка устройств.

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


Как работает загрузка Linux

Загрузчики

Linux Loader (LILO) - стандартный загрузчик для Linux, не зависящий от определенной файловой системы и умеющий загружать операционную систему с дискеты и жесткого диска. При загрузке вы можете указать до 16 вариантов различных образов, а также задать различные параметры (например, загрузочное устройство) отдельно для каждого ядра. LILO может размещаться в главной загрузочной записи (MBR) или в загрузочном секторе раздела. Если выбран второй вариант, в MBR может быть размещена другая программа для загрузки самого LILO.

Другой распространенный загрузчик – это GNU GRUB (GRUB). GRUB – это эталонная реализация спецификации Multiboot, которая позволяет использовать на компьютере несколько различных операционных систем одновременно и выбирать необходимую при загрузке. GRUB гибок в настройке, он загружает конфигурацию при запуске и позволяет прямо во время загрузки изменять параметры, такие как выбор различных ядер или дисков RAM. GRUB обладает высокой степенью переносимости, поддерживает различные исполняемые форматы и не зависит от геометрического расположения на диске. GRUB способен загружать образы операционных систем по сети и, соответственно, может использоваться в бездисковых системах. GRUB поддерживает автоматическую распаковку образов операционных систем перед загрузкой. И, в отличие от других загрузчиков, он может управляться пользователем непосредственно из командной строки GRUB.

Процесс загрузки Linux происходит следующим образом:

  1. Первое, что делает компьютер при запуске, - выполняет начальный тест POST (Power On Self Test). Проверяется несколько устройств, в том числе процессор, память, видеокарта и клавиатура. Также проверяются загрузочные устройства (жесткий диск, дисковод и CD-ROM). После завершения POST загрузчик, находящийся в ROM, загружает загрузочный сектор, который затем загружает операционную систему из активного раздела. Последовательность загрузочных устройств можно задать в настройках BIOS сервера.
  2. Загрузочный сектор всегда находится в одном и том же месте загрузочного устройства – дорожка 0, цилиндр 0, головка 0. В этом секторе находится программа под названием loader (загрузчик, для Linux это, как правило, LILO или GRUB), которая уже непосредственно загружает операционную систему. Загрузчик установлен либо в MBR, либо в первом секторе активного первичного раздела.
  3. Если на сервере установлено несколько операционных систем, в загрузочном меню нужно выбрать необходимую систему для загрузки. Если в ОС установлено несколько ядер, в этом меню вы можете указать одно из них.
  4. Затем загрузчик распаковывает и загружает ядро. Вначале ядро загружает собственные модули, затем определяет оборудование (дисковод, жесткий диск, сетевые карты и т. п.), проверяет параметры оборудования и затем просматривает и загружает драйверы устройств.
  5. На этом этапе ядро монтирует корневую файловую систему и системные файлы. Расположение системных файлов настраивается во время перекомпиляции или при помощи сторонних программ. Если монтирование не удается, выдается сообщение kernel panic и загрузка прекращается. Эта ошибка была описана выше.
  6. Затем ядро запускает процесс системной инициализации init, который становится процессом номер один. В дальнейшем именно он отключает систему. Процесс init является основным процессом в Linux, родительским процессом для всех остальных. В любой ОС семейства Linux/UNIX® этот процесс запускается первым, его PID всегда равен 1.
  7. Затем init проверяет файл /etc/inittab, чтобы определить, какие процессы необходимо запустить. Из этого файла init получает информацию об уровне запуска и о том, какие процессы должны быть запущены для каждого уровня запуска. После этого init ищет первую строку с оператором sysinit (системная инициализация) и выполняет команды из указанного файла, например, для ОС Red Hat Linux - /etc/rc.d/rc.sysinit. После выполнения скриптов из этого файла init запускает процессы в соответствии с указанным уровнем загрузки. После выполнения стартовых скриптов соответствующего уровня запуска появляется приглашение входа в систему Linux.

Все обсуждаемые решения относятся к пункту 5 данного списка.


Четыре совета

Поскольку ошибка cannot mount rootfs, как правило, связана с порядком подключения устройств, для решения проблемы достаточно изменить порядок устройств или последовательность загрузки драйверов.

Эти две задачи могут быть решены следующими четырьмя способами (каждый из методов нацелен на то, чтобы загрузочный диск Linux был доступен для ядра и системы первым и, соответственно, в качестве имени устройства всегда можно было использовать значение /dev/sda).

  1. Изменение порядка загрузки устройств PCI в настройках BIOS сервера.
  2. Подключение диска с корневой файловой системой в первый слот адаптера.
  3. Изменение образа initrd, чтобы загружать драйвер адаптера корневой файловой системы прежде драйверов адаптеров всех остальных файловых систем.
  4. Использование метки, UUID или понятного обозначения вместо имени устройства для монтирования корневой файловой системы.

1. Изменение порядка загрузки устройств PCI в настройках BIOS сервера

Если вы используете серверы IBM System x® или IBM BladeCenter® HS, необходимо выполнить следующие действия:

  1. После вывода на экран информации самотестирования и появления приглашения Press F1 to enter BIOS (Нажмите клавишу F1, чтобы войти в BIOS) нажмите клавишу F1.
  2. Выберите раздел Start Options, как показано на рисунке 1, и нажмите клавишу Enter.
Рисунок 1. Параметры BIOS.
Рисунок 1. Параметры BIOS.
  1. Измените значение параметра PCI Device Boot Priority, указав адаптер с диском, на котором расположена корневая файловая система (как показано на рисунке 2 ниже), если ОС Linux установлена на локальном диске Planar SAS.
Рисунок 2. Параметры загрузки.
Рисунок 2. Параметры загрузки.

Либо вы можете выбрать соответствующий слот PCI, разрешив слоту Daughter Card Slot 1 отображаться в системе первым как устройству с наименьшим идентификатором (см. рисунок 3).

Рисунок 3. Другой вариант параметров загрузки.
Рисунок 3. Другой вариант параметров загрузки.

В показанном здесь случае локальному диску Planar SAS будет присвоено значение идентификатора устройства, большее 1. Если ОС Linux была установлена на диск Planar SAS с именем устройства /dev/sda, а затем к слоту Daughter Card Slot 1 был подключен новый диск, он станет использовать имя /dev/sda, а корневая файловая система переместится на /dev/sdb. Это приведет к ошибке cannot mount rootfs.

2. Подключение диска с корневой файловой системой в первый слот адаптера

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

3. Изменение образа initrd, чтобы изменить последовательность подключения дисковых адаптеров

Образ initrd – это фактически RAM-диск, содержащий небольшую файловую систему с основными файлами конфигурации, программами, библиотеками и драйверами. В этой небольшой файловой системе есть своя корневая файловая система, которая загружается в память во время загрузки, и стартовые скрипты для загрузки драйверов системных устройств. После завершения загрузки драйверов подключается диск с основной корневой файловой системой. Ошибка cannot mount rootfs всегда происходит при попытке переключения корневой файловой системы образа initrd на диск с основной корневой файловой системой с использованием имени устройства, указанного в параметрах initrd. Вам необходимо изменить последовательность загрузки драйверов в соответствующем скрипте образа initrd, чтобы подключить диск с корневой файловой системой с правильным именем устройства до того, как система попытается перемонтировать действующую корневую файловую систему. Для этого выполните следующие действия:

  1. Загрузите систему в аварийном режиме с диска восстановления Linux, если вы не смогли получить доступ к корневой файловой системе.
  2. Смонтируйте корневую файловую систему во временный каталог, например sysroot (некоторые диски восстановления Linux делают это автоматически). Например, при загрузке системы в аварийном режиме диск с корневой файловой системой был подключен как /dev/sdc, а корневая файловая система расположена в разделе 3.
    [root@linuxhost ~]#mount /dev/sdc3 sysroot
  3. Переключите корень аварийной системы в sysroot, чтобы получить доступ к корневой файловой системе сервера.
    [root@linuxhost ~]#chroot sysroot
  4. Распакуйте образ initrd.
    1. Для ОС Red Hat Enterprise Linux старше версии 3 и SUSE Linux Enterprise Server старше версии 9:
      [root@linuxhost ~]#cp /boot/initrd-x.x.x-x.ELsmp.img ./initrd.gz
      [root@linuxhost ~]#mkdir temp
      [root@linuxhost ~]#gunzip ./initrd.gz
      [root@linuxhost ~]#mount -o loop -t ext2 initrd temp

      Эта команда распаковывает образ initrd.img в файл initrd.gz. Затем файл монтируется как том с файловой системой ext2 в точку монтирования temp. После этого вы сможете просматривать все файлы, упакованные в образ initrd.
    2. Для ОС Red Hat Enterprise Linux версии 4 и выше или SUSE Linux Enterprise Server версии 10 и выше:
      [root@linuxhost ~]#cp /boot/initrd-*.img ./initrd.gz
      [root@linuxhost ~]#mkdir temp
      [root@linuxhost ~]#cd temp
      [root@linuxhost ~]#gzip -dc ../initrd.gz | cpio -id

      В новых дистрибутивах Linux образ initrd дополнительно упакован при помощи cpio. Приведенные выше команды распаковывают файловую систему полностью со структурой каталогов в каталог temp. После этого вы обнаружите все файлы из образа initrd в каталоге temp.
  5. Найдите файл init для Red Hat Enterprise Linux и SUSE Linux Enterprise Server версии 10 или файл linuxrc для SUSE Linux Enterprise Server версии 9 или предыдущей в каталоге temp.
  6. Измените файл init или linuxrc, чтобы подключать диск с корневой файловой системой раньше остальных дисковых адаптеров того же типа. В большинстве случаев диск с корневой файловой системой является устройством SCSI с префиксом sd. Вам необходимо в первую очередь загружать драйвер адаптера, к которому подключен диск с корневой файловой системой, а уже потом все остальные устройства FC или SAS HBA.
    1. Например, если диск с корневой файловой системой физически подключен к адаптеру SAS, файл init может содержать следующие строки:
      .......
      echo "Loading mptbase.ko module"
      insmod /lib/mptbase.ko 
      echo "Loading mptscsi.ko module"
      insmod /lib/mptscsi.ko 
      echo "Loading mptspi.ko module"
      insmod /lib/mptspi.ko 
      echo "Loading mptsas.ko module"
      insmod /lib/mptsas.ko 
      echo "Loading mptscsih.ko module"
      insmod /lib/mptscsih.ko 
      echo "Loading qla2xxx.ko module"
      insmod /lib/qla2xxx.ko
      .......

      В этом случае поместите все остальные драйверы адаптеров SCSI (такие как драйвер Qlogic HBA qla2xxx.ko) после драйвера адаптера SAS mptsas.ko.
    2. Если вы используете ОС SUSE Linux Enterprise Server версии 10, файл init будет выглядеть следующим образом:
      modprobe scsi_mod $params
      modprobe sd_mod $params
      params=
      for p in $(cat /proc/cmdline) ; do
        case $p in
          aacraid.*)
            params="$params ${p#aacraid.}"
            ;;
        esac
      done
      echo "Loading aacraid"
      modprobe aacraid $params
      modprobe scsi_transport_fc $params
      modprobe firmware_class $params
      params=
      for p in $(cat /proc/cmdline) ; do
        case $p in
          qla2xxx.*)
              params="$params ${p#qla2xxx.}"
              ;;
           esac
      done
      echo "Loading qla2xxx"
      modprobe qla2xxx $params
  7. Убедитесь в том, что ваши изменения являются корректными и вы не удалили загрузку какого-либо необходимого драйвера (например, для SAS требуется совместная загрузка mptbase.ko, mptscsi.ko, mptspi.ko, mptsas.ko и mptscsih.ko, и при этом вы не хотите, чтобы qla2xxx.ko загружался раньше mptscsih.ko). Не будет лишним проверить файл на наличие опечаток.
  8. Теперь вам необходимо снова упаковать файловую систему initrd в образ и заменить им оригинальный файл в каталоге /boot.
    1. Для ОС Red Hat Enterprise Linux старше версии 3 и SUSE Linux Enterprise Server старше версии 9:
      [root@linuxhost ~]#umount temp
      [root@linuxhost ~]#gzip initrd
      [root@linuxhost ~]#cp initrd.gz /boot/initrd-2.x.x-x.img
    2. Для ОС Red Hat Enterprise Linux версии 4 и выше или SUSE Linux Enterprise Server версии 10 и выше:
      [root@linuxhost ~]#find ./ | cpio -H newc -o > ../initrd
      [root@linuxhost ~]#gzip initrd
      [root@linuxhost ~]#cp initrd.gz /boot/initrd-2.6.x-x.img
  9. Поздравляю! Проблема решена. Теперь перезагрузитесь и проверьте результат.

4. Использование метки, UUID или понятного обозначения

UUID

UUID означает Universally Unique Identifier (Универсальный Уникальный Идентификатор). Это идентификатор, используемый при создании программного обеспечения, стандартизированный Open Software Foundation как часть Distributed Computing Environment (DCE). Идентификаторы UUID разработаны для того, чтобы позволить распределенным системам однозначно определять информацию без существенной центральной координации; информация, обозначенная при помощи UUID, может быть объединена в единой базе данных без необходимости разрешать конфликты именования. Важными примерами использования этого стандарта являются файловые системы Linux ext2/ext3, шифрованные разделы LUKS, GNOME, KDE, Mac OS X и идентификаторы Microsoft® GUID.

Некоторые типы файловых систем Linux (например: ext2, ext3, reiserfs, swap и XFS) поддерживают монтирование файловых систем с метками вместо имени устройства. Вы можете использовать UUID, если их поддерживает дистрибутив Linux. При наличии поддержки со стороны драйвера устройства можно использовать понятные обозначения.

Для этих методов требуется поддержка со стороны ОС Linux (например, Red Hat Enterprise Linux V4 и выше или SUSE Linux Enterprise Server V9 и выше). Поскольку метка, UUID и понятное обозначение будут навсегда связаны с конкретным устройством, идентификатор устройства теряет свое значение, система все равно в любом случае найдет диск с корневой файловой системой.

Использование метки

  1. При создании файловой системы, такой как корень, swap или другой, назначьте ей метку.
    [root@linuxhost ~]#mkfs.ext3 -L ROOT /dev/sda1
    [root@linuxhost ~]#mkfs.reiserfs -l OSROOT /dev/sdb2
    [root@linuxhost ~]#mkfs.xfs -L XFSROOT /dev/sde3
    [root@linuxhost ~]#mkswap -L SWAP0 /dev/sdb5
  2. Добавьте метку файловой системы после ее создания.
    [root@linuxhost ~]#e2label /dev/sda1 PRIMARY_ROOT
    [root@linuxhost ~]#reiserfstune -l OSROOT /dev/sdb2
    [root@linuxhost ~]#xfs_admin -L DATA1 /dev/sdf4
  3. Используйте метки в системе.
    1. Измените файл /etc/fstab ОС Linux так, чтобы система использовала метки для монтирования файловых систем вместо имен устройств. Ниже приведен простой пример содержимого файла /etc/fstab:
      LABEL=ROOT          /         ext3    defaults        1 1
      LABEL=BOOT          /boot     ext3    defaults        1 2
      LABEL=SWAP          swap      swap    defaults        0 0
      LABEL=HOME          /home     ext3    nosuid,auto     1 2
    2. Измените файл grub.conf загрузчика Linux.
      title Linux
        root (hd0,0)
        kernel (hd0,0)/vmlinuz ro root=LABEL=ROOT rhgb quiet
      initrd (hd0,0)/initrd-2.x.x-xx.img

Использование UUID

  1. Получите UUID для корневого устройства. Предположим, что корневая файловая система расположена на диске /dev/sda, как в примере ниже:
    [root@linuxhost ~]#scsi_id -g -s -u /block/sda
  2. Используйте следующую команду для проверки идентификатора устройства вашей корневой файловой системы с идентификатором UUID, полученным на этапе 1.
    [root@linuxhost ~]#ls /dev/disk/by-id/<your device UUID>
  3. Используйте идентификаторы в системе, изменив файл /etc/fstab, как показано в этом примере:
    /dev/disk/by-id/scsi-<your uuid>-part2 / ext3  defaults  1 1

Использование понятного обозначения
Если вы используете утилиту device mapper multi-path (DMMP) для работы с мультипортовой системой хранения, вы также можете присвоить понятное обозначение корневой файловой системе, чтобы избежать перенумерации устройств утилитой DMMP после перезагрузки.

  1. Получите UUID для корневого устройства. Предположим, что корневая файловая система расположена на диске /dev/sda, как в примере ниже:
    [root@linuxhost ~]#scsi_id -g -s -u /block/sda
  2. Измените файл /etc/multipath.conf, чтобы добавить понятное обозначение для устройства с корневой файловой системой, как показано ниже:
    multipaths {
           multipath {
                   wwid   <your disk UUID get from above command>
                   alias    OSROOT
    		}
    }
  3. Затем, после перезагрузки компьютера или перезапуска DMMP, вы получите обозначение устройства с корневой файловой системой вида /dev/mapper/OSROOT (если корневая файловая система расположена на разделе 3 этого диска, вы можете получить имя устройства /dev/mapper/OSROOT-part3 или /dev/mapper/OSROOTp3).
  4. Измените файл /etc/fstab для использования понятного обозначения устройства с корневой файловой системой, как показано ниже:
    /dev/mapper/OSROOT-part3    /     ext3  defaults     1 1
  5. Измените файл /etc/grub.conf для использования этого имени при загрузке системы.
    title Linux
        root (hd0,0)
        kernel (hd0,0)/vmlinuz ro root=/dev/mapper/OSROOT-part3 rhgb quiet
        initrd (hd0,0)/initrd-2.x.x-xx.img
  6. На этом все. Вы можете перезагрузиться и проверить, как это работает.

Заключение

В этой статье показано, как настроить компьютер, чтобы предотвратить или исправить ошибки Linux cannot mount rootfs, и описан процесс загрузки ОС Linux.

Ресурсы

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Linux
ArticleID=382977
ArticleTitle=Советы по Linux: Поиск rootfs во время загрузки
publish-date=04162009