/ Статьи / Системное / Ядерные чудеса в Arch Linux /

Ядерные чудеса в Arch Linux

Дата публикации: July 7, 2011, 1:57 a.m.
Теги: arch linux, ядро,
Автор: Brainsburn

labirint

Сначала я не хотел публиковать на сайте этот материал по той причине, что конечное решение проблемы я так и не нашел. Такое лучше подходит для личных блогов, наверное. Но, подумав, решил, что данная статья может кому-то помочь, а уж хуже точно не сделает. Чтобы сразу было понятно, о чем речь: Arch Linux, загрузка, "mount: mounting /dev/sdX on /new_root failed: No such device".

Мое первое знакомство с Arch Linux началось с того, что он не хотел загружаться, выдавая следующее сообщение на стадии загрузки ядра:

Waiting 10 seconds for device /dev/sda2 ... 
mount: mounting /dev/sda2 on /new_root failed: No such device
ERROR: failed to mount the real root device
Bailing out, you are on your own. Good luck.

По строкам, которые шли выше этого сообщения, было видно, что в параметрах ядра вместо root=/dev/sda2 мне следовало указать root=/dev/sdb2, т.к. жесткий диск, на котором был корень Arch Linux, определялся как /dev/sdb. Однако, не все так просто. Во-первых, странно то, что диск, который на других дистрибутивах всегда определяется как /dev/sda, в Арче вдруг стал /dev/sdb. Тем более, что такое происходит только при использовании ядра, устанавливаемого через pacman; при использовании ядра, собранного вручную, подобных ошибок не было и диск именовался как и везде - /dev/sda (но использовать ядро, собранное вручную, я не мог по определенным причинам). Во-вторых, и это самое интересное, когда я в параметрах ядра заменял root=/dev/sda2 на root=/dev/sdb2, то диск, определявшийся до этого как /dev/sdb, вдруг снова становился /dev/sda! И так каждый раз - то /dev/sda, то /dev/sdb. Я, возможно, чего-то не понимаю в этом мире, но логичного объяснения этому я найти не смог. Тем более, что смена имени устройства HDD происходила не при каждом ребуте.

Вообще, пока я пытался понять суть проблемы, чуть не поехал крышей :) Дело в том, что после какого-то действия (на самом деле само действие тут не причем, это лишь совпадение) Арч загружался нормально и делал это несколько ребутов подряд, а потом вдруг самопроизвольно снова менял имя устройства HDD. Один раз я уже был уверен, что поборол проблему и настроил все правильно - Арч успешно ребутился раз 8-9, но потом снова сменил имя устройства, в результате чего я чуть не отформатировал диск со злости. Еще раз повторю, что на других дистрибутивах этот диск всегда именуется как /dev/sda и на этом же самом Арче, но с использованием самосборного ядра без initrd, диск именуется как /dev/sda. И только с использованием ядра, устанавливаемого через pacman, имя устройства меняется в рандомном порядке. Бред? Еще какой, по-крайней мере - для меня.

Расскажу, что я делал для решения проблемы: по всякому настраивал Grub, подстраивал /etc/fstab под новое именование дисков, переустанавливал ядро. После того, как я изменил рутовый раздел в fstab с /dev/sda2 на /dev/sdb2 и переустановил ядро, Арч нормально перезагружался несколько раз (6-7), чего не было ранее. Настройка Grub-а тут не причем, т.к. с одной и той-же конфигурацией загрузчика, Арч то включается, то нет.



Пользуясь случаем, расскажу немного о процессе загрузки ядра Linux.
Initrd, используемый почти во всех дистрибутивах, на деле нужен только для ранней активации фреймбуфера, чтобы экран монитора во время загрузки был более гламурным. Кроме этого, initrd будет нужен, если драйвера на жесткий диск и поддержка корневой файловой системы не вкомпилены в ядро, а собраны модулями. Т.е. можно сказать, что в большинстве случаев initrd не нужен. Если знаете другие причины, дающие initrd право на жизнь, - отпишитесь в комментариях.


Для загрузки ядра, обычно, указывают следующие команды:
root (hd0,0)
kernel /kernel-2.6.39 root=/dev/sda2
initrd /initrd-2.6.39
root (hd0,0) - указывает тот ЖД и раздел, на котором лежит ядро.
root=/dev/sda2 - указывает корневой раздел (/) в том случае, если корень и /boot являются двумя разными точками монтирования. В том случае, когда /boot не является отдельным разделом, никакой root=/dev/sdXX указывать не надо.
initrd /initrd-2.6.39 - ну тут все понятно. Указывает имя файла initrd, если оный используется.

При наличии одного ЖД с одним разделом и ядра без использования initrd, будет достаточно одной строки:
kernel /kernel-2.6.39
Ну или даже так:
kernel /usr/src/linux-2.6.39/arch/x86/boot/bzImage

Если в ядре нету необходимых драйверов на жесткий диск, то возникает кернел паник, тип которого очень легко определить - в сообщениях ядра после строчки "Here are list of available partitions:" будет или один /dev/sr0 (привод оптических дисков) или вообще пусто. Если после этой строчки идет список разделов, среди которых есть корневой, значит вы не правильно указали параметр root=/dev/sdXX.

Само ядро при загрузке не читает никаких /etc/fstab. После загрузки ядро передает управление init-скрипту, который уже начинает загружать все остальное. В моем же случае, ошибка точно не была никак связана с /etc/fstab или любым другим конфигурационным файлом системы, т.к. процесс загрузки не доходил до init. Тем более, абсолютно не понятно, почему смена имени устройства происходит только при использовании арчевского ядра. Очень хотелось бы, чтобы пришел кто-нибудь очень умный и дал логичное объяснение этому, начиная со слов "Ну ты и чайник, тут же все просто!"...

Саму проблему я решил лишь частично - теперь смена имени устройства HDD происходит через каждые 8-10 ребутов и в таком случае я просто жму ресет еще раз, после чего все загружается нормально. Сделал я для этого следующее: подключил жесткий диск к другому sata-разъему на материнской плате. Вот так вот. Желаю всем поменьше подобной "магии"!






Возможно, эти материалы Вас заинтересуют:


Рекомендовать эту страницу:

Комментарии:(5)

# awesome July 7, 2011, 10:27 a.m.
Чудеса... К сожалению у меня не было ArchLinux. Что-то написать про это не могу. Но когда устанавливал openSUSE с флешки, то поменялся порядок дисков, тоесть в grub и fstab, было /dev/sdb4 вместо /dev/sda4.Букву исправил всё работало.
Удачи!

# Артём July 9, 2011, 11:40 a.m.
А если задавать раздел через UUID?
У меня в grub.cfg ни каких /dev/s.. и проблем таких не знаю.

А вообще - дело скорее всего в mkinitcpio - глючная вещь

# Brainsburn July 9, 2011, 9 p.m.
Артем, через UUID все ок, я об этом не успел написать. На mkinitcpio тоже грешу :)

# Anonymous Sept. 25, 2011, 8:08 p.m.
https://wiki.archlinux.org/index.php/Persistent_block_device_naming [wiki.archlinux.org]: If your machine has more than one SATA, SCSI or IDE disk controller, the order in which their corresponding device nodes are added is random. This may result in device names like /dev/sda and /dev/sdb switching around randomly on each boot, culminating in an unbootable system, kernel panic, or a block device disappearing. Persistent naming solves these issues.

# Brainsburn Sept. 26, 2011, 2:38 a.m.
Спасибо за ссылку

Комментировать:

Гость, Вы можете оставить свой комментарий.

Стиль кода:
Имя
Сайт * не обязательное поле
Поставьте галку, если вы - бот
Поставьте галку, если вы - человек

Друзья! Убедительная просьба воздержаться от нецензурной лексики!



Справка:
Если вы хотите использовать в тексте комментария специальные символы, например, [ и ], используйте их внутри тега [code] [/code]
Вы можете использовать теги BBcode. Для оформления кода и подсветки синтаксиса используйте тег [code] или [code=название_языка], например, [code=python]
Ссылки вставляйте так: [url]zenux.ru[/url] или так: http://zenux.ru, но не так: zenux.ru
Текст сообщения должен быть в пределах 3000 символов.




Последние комментарии:

fanyit: Спасибо за обзор. очень полезно и доступно.... >>>
cheech: Спасибо, статья полезная )... >>>
Васёк: Коммент, расскажи про часы на стене капитану в оке... >>>
METAJIJI: Ах да, почему я начал вообще трогать urxvt, потому... >>>
METAJIJI: Вкладки как раз не феншуйные (штатный tabbed), они... >>>