Минимальный initrd для встраиваемых систем

Вопросы программного кода и архитектуры Linux

Модератор: Olej

Pasa
Активист
Сообщения: 10
Зарегистрирован: 30 сен 2013, 17:41
Контактная информация:

Минимальный initrd для встраиваемых систем

Непрочитанное сообщение Pasa » 30 сен 2013, 18:26

Всем доброго дня/ночи/вечера/утра!
Есть отладочная плата от StarterKit - армовский проц AT9260.
В комплекте были исходники пропатченного для платы ядра и файловой системы.
Слегка их модифицировал под свою плату, не вдаваясь глубоко в теорию, сделал проект и успешно забыл.

Сейчас возникла необходимость реанимровать проект. Решил подойти к изучению линукса основательно - понять как фукционирует/грузится ядро и собирается файловая система. Применение - встраиваемые системы.

На основе материала http://www.opennet.ru/base/sys/initrd_intro.txt.html
собрал initrd. Подсунул его вместо прежней файловой системы. Ядро 2.6.28.
И ядро и initrd грузятся через tftpboot c виртуальной машины, на которой я собственно и собираю ядро и файловую систему.
В минимальном созданном вручную initr сделал linuxrc как описано в мануале.
Но ядро упорно ищет init и не хочет выполнять linuxrc.

Но в мануале написано:
"Предпоследний шаг - создание файла linuxrc. После того как ядро
монтирует ram диск, оно ищет init скрипт для выполнения. Если файл init
не найден, ядро выполняет файл linuxrc вместо init."

Такое вот на консоль выводит.
Kernel panic - not syncing: No init found. Try passing init= option to kernel.

В конфиге ядра:
CONFIG_CMDLINE="root=/dev/ram0 rw initrd=0x21000000,0x500000 console=ttyS0,115200 mem=32M"

Подскажите в каком направлении копать, может я что-то не так понял в руководстве?

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Минимальный initrd для встраиваемых систем

Непрочитанное сообщение Olej » 01 окт 2013, 00:34

Pasa писал(а): На основе материала http://www.opennet.ru/base/sys/initrd_intro.txt.html
собрал initrd. Подсунул его вместо прежней файловой системы. Ядро 2.6.28.
Ядро уж очень старое.
Pasa писал(а): Но в мануале написано:
"Предпоследний шаг - создание файла linuxrc. После того как ядро
монтирует ram диск, оно ищет init скрипт для выполнения. Если файл init
не найден, ядро выполняет файл linuxrc вместо init."
В каждом мануале пишут по-своему ... потому что каждый пишет под те условия и железку, которые у него есть.
В других условиях детали могут отличаться.
Поэтому нужно хорошо понимать что и для чего вы делаете.
Pasa писал(а): Такое вот на консоль выводит.
Kernel panic - not syncing: No init found. Try passing init= option to kernel.
Правильно пишет: panic - значит panic ;).
Pasa писал(а):Подскажите в каком направлении копать, может я что-то не так понял в руководстве?
Посмотрите вот это для начала: Linux для embedded применений + Linux на платформах ARM.

cema
Писатель
Сообщения: 246
Зарегистрирован: 14 июн 2012, 06:01
Контактная информация:

Re: Минимальный initrd для встраиваемых систем

Непрочитанное сообщение cema » 01 окт 2013, 08:27

Сейчас кажется применяют initramfs вместо initrd

Pasa
Активист
Сообщения: 10
Зарегистрирован: 30 сен 2013, 17:41
Контактная информация:

Re: Минимальный initrd для встраиваемых систем

Непрочитанное сообщение Pasa » 02 окт 2013, 10:38

За ссылки, конечно, спасибо. Буду изучать и вникать.Понимаю, что нахожусь только в самом начале пути по изучению линукс и мне еще читать-не-перечитать всего и всякого. Но хотелось бы начать с малого. Вот попробовал собрать самую минимальную встроенную систему - чтобы только стартануло ядро и запустилась консоль с шеллом. И сразу затык.
Я так и не понял, почему не работает пример, описанный в мануале.

Если грузится и стартует ядро(пусть и старое, оно меня устраивает), если грузится и ядром находится rootfs(пусть на основе initrd, а не initramfs....тоже устраивает ), если ядро действительно первым делом после монтирования rootfs должно запускать скрипт linuxrc(если не находит init).....то почему этого не происходит?

Мне конечно получилось собрать rootfs (на основе buildroot ) чтобы все заработало-загрузилось и получить в результате работающую консоль с шеллом . Но там в rootfs напичкано уйма всякой непонятной всячины. А хочется начать с самого начала, самой простейшей системы , хочется понять саму суть, как устроено ядро и как происходит загрузка линукса.

Вот написано....ядро стартует....ищет и монтирует rootfs. После монтирования ищет и исполняет linuxrc(если нет init).....
Так все-таки.... процесс загрузки описан правильно или нет.....почему не исполняется linuxrc?

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Минимальный initrd для встраиваемых систем

Непрочитанное сообщение Olej » 02 окт 2013, 20:22

Pasa писал(а): Я так и не понял, почему не работает пример, описанный в мануале.
Потому что это не мануал, а так ... заметка ;-)
А в заметках много что пишут...
Pasa писал(а): Мне конечно получилось собрать rootfs (на основе buildroot ) чтобы все заработало-загрузилось и получить в результате работающую консоль с шеллом . Но там в rootfs напичкано уйма всякой непонятной всячины.
Непонятной - это вовсе не значит, что лишней.
buildroot - это серьёзный профессиональный проект, давно развивающийся, и там всё достаточно по уму...
Pasa писал(а): А хочется начать с самого начала, самой простейшей системы ,
"Так вам шашечки? ... или ехать?"
Pasa писал(а): хочется понять саму суть, как устроено ядро и как происходит загрузка линукса.
Тогда (для "понять") нужно брать десктопный дистрибутив, а дальше ... man, man и ещё раз man - как завещал дедушка Ленин ;-)
Pasa писал(а): Вот написано....ядро стартует....ищет и монтирует rootfs. После монтирования ищет и исполняет linuxrc(если нет init).....
Ещё раз: на заборах много чего пишут...
Pasa писал(а): Так все-таки.... процесс загрузки описан правильно или нет.....почему не исполняется linuxrc?
И вот из-за этого, чтобы ответить вам на любопытство, кто-то должен сесть, читать и разбираться: что там они пишут? правильно или неправильно? и к какого года реализациям всё это относилось?

Pasa
Активист
Сообщения: 10
Зарегистрирован: 30 сен 2013, 17:41
Контактная информация:

Re: Минимальный initrd для встраиваемых систем

Непрочитанное сообщение Pasa » 03 окт 2013, 03:24

Мне нужно и "ехать" и понимать сам процесс езды, почему и как все происходит.
Судя по вашим комментариям , http://www.opennet.ru/base/sys/initrd_intro.txt.html - это просто "писанина на заборе".
Может быть и так, хотя мне ресурс показался вроде как солидным. Возможно я ошибся.

Собственно там мне посоветовали использовать параметр init:
CONFIG_CMDLINE="root=/dev/ram0 rw initrd=0x21000000,0x500000 console=ttyS0,115200 mem=32M init=/linuxrc"

Об этом же пишут и здесь:
http://rus-linux.net/kos.php?name=/pape ... 04-02.html

Попробовал , но ядро ругается: "Failed to execute /linuxrc. Attempting defaults...."

Ну и дальше опять поиск init и паника.


Обучение на десктопном дистрибутиве ....может и так. Но мне показалось, что десктопные дистрибутивы намного больше обвешаны различными загрузчиками/драйверами/стартовыми скриптами/утилитами/конфигами и прочими различными рюшечками от "дистрибутивостроителей",
чем если взять просто ядро и попробовать примонтировать минимальную rootfs в виде initrd. Без винчестеров, видеокарт, звука и прочее...
Только процессор и память, в которой и находится rootfs.

Ну и разбираться в "писанине на заборах" я конечно ни от кого не требую. Надеюсь, что где-то же должны быть спецы, которым не надо разбираться с этим вопросом, а которые могут просто взять и ответить что я делаю не так, почему не работает и что нужно поправить, как сделать правильно. Только и всего.

alex65su
Писатель
Сообщения: 40
Зарегистрирован: 13 дек 2012, 10:27
Контактная информация:

Re: Минимальный initrd для встраиваемых систем

Непрочитанное сообщение alex65su » 03 окт 2013, 10:55

Процесс запуска системы (от момента подачи питания) - это весьма тонкая системная задача. По сути, система должна перейти из одного предопределённого состояния (выключено) в другое предопреденённое состояние (включено).

Важно понять, что механизмы initrd и initramfs (по сути - это виртуальные диски) задействованы для подгрузки тех драйверов оборудования, которые, по какой-то причине, не включены в текущую сборку ядра. Еще одна тонкость заключается в том, что в разных версиях (или даже сборках) ядра могут применяться разные механизмы: только initrd; только initramfs; или initrd, или initramfs.

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

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

Публикации на эту тему описывают все эти проблемы с разных сторон и с разной детализацией. Посему, чтобы разобраться со всем этим хозяйством, одной-двух статей (даже достаточно хороших) может оказаться маловато.
Pasa писал(а): Надеюсь, что где-то же должны быть спецы, которым не надо разбираться с этим вопросом, а которые могут просто взять и ответить что я делаю не так, почему не работает и что нужно поправить, как сделать правильно. Только и всего.
Вариантов решения этого вопроса - великое множество. ВАШ случай специфичен только для ВАС. Поэтому, Вы и будете этим самым спецом ;-) ...если, конечно, разберётесь с вопросом.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Минимальный initrd для встраиваемых систем

Непрочитанное сообщение Olej » 03 окт 2013, 12:46

Pasa писал(а):Мне нужно и "ехать" и понимать сам процесс езды, почему и как все происходит.
Судя по вашим комментариям , http://www.opennet.ru/base/sys/initrd_intro.txt.html - это просто "писанина на заборе".
Я такого не говорил, чтобы определённо ... я высказал предположение, что это описание очень старое.
Pasa писал(а): Об этом же пишут и здесь:
http://rus-linux.net/kos.php?name=/pape ... 04-02.html
... так же как и этот текст, который датирован "последней правкой" 2007г.

Это будет одной из проблем, с которой вы столкнётесь в мире Linux (и UNIX вообще):
- большинство материалов либо очень старые, либо, как правило, вообще не датированные ... а значит очень-очень старые ;-)
- а все процессы, происходящие в Linux, приёмы работы ... и всё-всё-всё - очень быстро устаревает, и становится абсолютно неактуальным, не соответствует действительности...
- имеет смысл использовать информацию только ту, которой (от силы) не более 2-3 лет.
Обратите внимание на эту особенность (вы же, как пишете, недавно в мире Linux? ... это пригодится).
Pasa писал(а): Обучение на десктопном дистрибутиве ....может и так. Но мне показалось, что десктопные дистрибутивы намного больше обвешаны различными загрузчиками/драйверами/стартовыми скриптами/утилитами/конфигами и прочими различными рюшечками от "дистрибутивостроителей",
Вовсе не до такой степени, как вы это изображаете...
Pasa писал(а): чем если взять просто ядро и попробовать примонтировать минимальную rootfs в виде initrd. Без винчестеров, видеокарт, звука и прочее...
Только процессор и память, в которой и находится rootfs.
А вот здесь то, как-раз, и начнутся всякие "рюшечки"(с) :lol:
Pasa писал(а):а которые могут просто взять и ответить что я делаю не так, почему не работает и что нужно поправить, как сделать правильно. Только и всего.
То, что вы делаете (а если совсем точно: то, что вы пытаетесь сделать ;-) ) - можно делать несколькими совершенно разными способами. И разобраться в одном из таких способов - это куда проще и плодотворнее (для вас, для понимания), чем ковыряться в том "что я делаю не так"(с) ;-)

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Минимальный initrd для встраиваемых систем

Непрочитанное сообщение Olej » 03 окт 2013, 13:15

alex65su писал(а): Важно понять, что механизмы initrd и initramfs (по сути - это виртуальные диски) задействованы для подгрузки тех драйверов оборудования, которые, по какой-то причине, не включены в текущую сборку ядра. Еще одна тонкость заключается в том, что в разных версиях (или даже сборках) ядра могут применяться разные механизмы: только initrd; только initramfs; или initrd, или initramfs.

Публикации, которые описывают все эти процессы, как правило, описывают цели и принципы работы этих инструментов. Но при решении задачи запуска конкретной системы может быть выбран конкретный (именно для этого случая) механизм и способ его использования. Например, к нюансам может относиться и выбор типа файловой системы для initrd, при его сборке. Как следствие, поддержка такого типа файловой системы должна присутствовать в используемой сборке ядра. Кроме того, возможны варианты, когда ядро и initrd - это два разных файла, или когда ядро и initrd размещены в одном файле. Подобные нюансы указываются в параметрах запуска ядра, которые могут быть прекомпилированы, и могут быть переданы загрузчиком ядра.
Кстати, Pasa, из того, что здесь подсказали:
- очень часто в публикациях предполагается (неявно), что файловая система, под которую собирается initrd - это FAT12 или FAT16, на любой другой FS это будет нескоько по-другому...
- все эти многочисленные (и меняющиеся из года в год) варианты initrd, initramfs и пр. - это рутинные приёмы разместить то, что не влезло или не хотелось включать в ядро...
- ... я уже не помню, подсказывали вам это или нет, - для минимальной встраиваемой системы вы можете, хотя бы для начала, собрать ядро, включив туда только то, что у вас есть в системе, и исключив оттуда совершенно всё, чего нет - так вы получите себе рабочее ядро без всяких "прибамбасок", связанных с динамической подгрузкой модулей ядра.

alex65su
Писатель
Сообщения: 40
Зарегистрирован: 13 дек 2012, 10:27
Контактная информация:

Re: Минимальный initrd для встраиваемых систем

Непрочитанное сообщение alex65su » 03 окт 2013, 17:46

Как-то пропустил...
Pasa писал(а): Обучение на десктопном дистрибутиве ....может и так. Но мне показалось, что десктопные дистрибутивы намного больше обвешаны различными загрузчиками/драйверами/стартовыми скриптами/утилитами/конфигами и прочими различными рюшечками от "дистрибутивостроителей",
чем если взять просто ядро и попробовать примонтировать минимальную rootfs в виде initrd. Без винчестеров, видеокарт, звука и прочее...
Только процессор и память, в которой и находится rootfs.
В свете применения initrd и/или initramfs в "толстых" десктопных дистрибутивах...

Запуск бездисковых систем (иначе, "тонких" клиентов; загрузка по сети с сервера, и корень файловой системы после запуска станции тоже расположен на каком-то сервере) в работу осуществляется именно с помощью механизмов initrd и/или initramfs.

Так что разобраться со всеми этими приёмами на десктопном дистрибутиве будет не только возможно, но и в разы легче, а то и дешевле (по неопытности, заказную железку одной неосторожной записью во флеш можно легко превратить в "кирпич").

Ответить

Вернуться в «Linux изнутри»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 7 гостей