Минимальный initrd для встраиваемых систем
Модератор: Olej
Минимальный initrd для встраиваемых систем
Всем доброго дня/ночи/вечера/утра!
Есть отладочная плата от 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"
Подскажите в каком направлении копать, может я что-то не так понял в руководстве?
Есть отладочная плата от 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 для встраиваемых систем
Ядро уж очень старое.Pasa писал(а): На основе материала http://www.opennet.ru/base/sys/initrd_intro.txt.html
собрал initrd. Подсунул его вместо прежней файловой системы. Ядро 2.6.28.
В каждом мануале пишут по-своему ... потому что каждый пишет под те условия и железку, которые у него есть.Pasa писал(а): Но в мануале написано:
"Предпоследний шаг - создание файла linuxrc. После того как ядро
монтирует ram диск, оно ищет init скрипт для выполнения. Если файл init
не найден, ядро выполняет файл linuxrc вместо init."
В других условиях детали могут отличаться.
Поэтому нужно хорошо понимать что и для чего вы делаете.
Правильно пишет: panic - значит panic ;).Pasa писал(а): Такое вот на консоль выводит.
Kernel panic - not syncing: No init found. Try passing init= option to kernel.
Посмотрите вот это для начала: Linux для embedded применений + Linux на платформах ARM.Pasa писал(а):Подскажите в каком направлении копать, может я что-то не так понял в руководстве?
Re: Минимальный initrd для встраиваемых систем
Сейчас кажется применяют initramfs вместо initrd
Re: Минимальный initrd для встраиваемых систем
За ссылки, конечно, спасибо. Буду изучать и вникать.Понимаю, что нахожусь только в самом начале пути по изучению линукс и мне еще читать-не-перечитать всего и всякого. Но хотелось бы начать с малого. Вот попробовал собрать самую минимальную встроенную систему - чтобы только стартануло ядро и запустилась консоль с шеллом. И сразу затык.
Я так и не понял, почему не работает пример, описанный в мануале.
Если грузится и стартует ядро(пусть и старое, оно меня устраивает), если грузится и ядром находится rootfs(пусть на основе initrd, а не initramfs....тоже устраивает ), если ядро действительно первым делом после монтирования rootfs должно запускать скрипт linuxrc(если не находит init).....то почему этого не происходит?
Мне конечно получилось собрать rootfs (на основе buildroot ) чтобы все заработало-загрузилось и получить в результате работающую консоль с шеллом . Но там в rootfs напичкано уйма всякой непонятной всячины. А хочется начать с самого начала, самой простейшей системы , хочется понять саму суть, как устроено ядро и как происходит загрузка линукса.
Вот написано....ядро стартует....ищет и монтирует rootfs. После монтирования ищет и исполняет linuxrc(если нет init).....
Так все-таки.... процесс загрузки описан правильно или нет.....почему не исполняется linuxrc?
Я так и не понял, почему не работает пример, описанный в мануале.
Если грузится и стартует ядро(пусть и старое, оно меня устраивает), если грузится и ядром находится rootfs(пусть на основе initrd, а не initramfs....тоже устраивает ), если ядро действительно первым делом после монтирования rootfs должно запускать скрипт linuxrc(если не находит init).....то почему этого не происходит?
Мне конечно получилось собрать rootfs (на основе buildroot ) чтобы все заработало-загрузилось и получить в результате работающую консоль с шеллом . Но там в rootfs напичкано уйма всякой непонятной всячины. А хочется начать с самого начала, самой простейшей системы , хочется понять саму суть, как устроено ядро и как происходит загрузка линукса.
Вот написано....ядро стартует....ищет и монтирует rootfs. После монтирования ищет и исполняет linuxrc(если нет init).....
Так все-таки.... процесс загрузки описан правильно или нет.....почему не исполняется linuxrc?
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: Минимальный initrd для встраиваемых систем
Потому что это не мануал, а так ... заметкаPasa писал(а): Я так и не понял, почему не работает пример, описанный в мануале.
А в заметках много что пишут...
Непонятной - это вовсе не значит, что лишней.Pasa писал(а): Мне конечно получилось собрать rootfs (на основе buildroot ) чтобы все заработало-загрузилось и получить в результате работающую консоль с шеллом . Но там в rootfs напичкано уйма всякой непонятной всячины.
buildroot - это серьёзный профессиональный проект, давно развивающийся, и там всё достаточно по уму...
"Так вам шашечки? ... или ехать?"Pasa писал(а): А хочется начать с самого начала, самой простейшей системы ,
Тогда (для "понять") нужно брать десктопный дистрибутив, а дальше ... man, man и ещё раз man - как завещал дедушка ЛенинPasa писал(а): хочется понять саму суть, как устроено ядро и как происходит загрузка линукса.
Ещё раз: на заборах много чего пишут...Pasa писал(а): Вот написано....ядро стартует....ищет и монтирует rootfs. После монтирования ищет и исполняет linuxrc(если нет init).....
И вот из-за этого, чтобы ответить вам на любопытство, кто-то должен сесть, читать и разбираться: что там они пишут? правильно или неправильно? и к какого года реализациям всё это относилось?Pasa писал(а): Так все-таки.... процесс загрузки описан правильно или нет.....почему не исполняется linuxrc?
Re: Минимальный initrd для встраиваемых систем
Мне нужно и "ехать" и понимать сам процесс езды, почему и как все происходит.
Судя по вашим комментариям , 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.
Ну и разбираться в "писанине на заборах" я конечно ни от кого не требую. Надеюсь, что где-то же должны быть спецы, которым не надо разбираться с этим вопросом, а которые могут просто взять и ответить что я делаю не так, почему не работает и что нужно поправить, как сделать правильно. Только и всего.
Судя по вашим комментариям , 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.
Ну и разбираться в "писанине на заборах" я конечно ни от кого не требую. Надеюсь, что где-то же должны быть спецы, которым не надо разбираться с этим вопросом, а которые могут просто взять и ответить что я делаю не так, почему не работает и что нужно поправить, как сделать правильно. Только и всего.
Re: Минимальный initrd для встраиваемых систем
Процесс запуска системы (от момента подачи питания) - это весьма тонкая системная задача. По сути, система должна перейти из одного предопределённого состояния (выключено) в другое предопреденённое состояние (включено).
Важно понять, что механизмы initrd и initramfs (по сути - это виртуальные диски) задействованы для подгрузки тех драйверов оборудования, которые, по какой-то причине, не включены в текущую сборку ядра. Еще одна тонкость заключается в том, что в разных версиях (или даже сборках) ядра могут применяться разные механизмы: только initrd; только initramfs; или initrd, или initramfs.
Публикации, которые описывают все эти процессы, как правило, описывают цели и принципы работы этих инструментов. Но при решении задачи запуска конкретной системы может быть выбран конкретный (именно для этого случая) механизм и способ его использования. Например, к нюансам может относиться и выбор типа файловой системы для initrd, при его сборке. Как следствие, поддержка такого типа файловой системы должна присутствовать в используемой сборке ядра. Кроме того, возможны варианты, когда ядро и initrd - это два разных файла, или когда ядро и initrd размещены в одном файле. Подобные нюансы указываются в параметрах запуска ядра, которые могут быть прекомпилированы, и могут быть переданы загрузчиком ядра.
По поводу пакетов автоматизации сборки всего этого хозяйства (buildroot и прочие). В таких пакетах все задачи сборки описаны в соответствующих скриптах. Поэтому, чтобы разобраться с тем КАК это реализовано в конкретном пакете (чтобы сделать то же самое, но пошагово, "ручками"), понадобиться разобраться со скриптами этого конкретного пакета.
Публикации на эту тему описывают все эти проблемы с разных сторон и с разной детализацией. Посему, чтобы разобраться со всем этим хозяйством, одной-двух статей (даже достаточно хороших) может оказаться маловато.
Важно понять, что механизмы initrd и initramfs (по сути - это виртуальные диски) задействованы для подгрузки тех драйверов оборудования, которые, по какой-то причине, не включены в текущую сборку ядра. Еще одна тонкость заключается в том, что в разных версиях (или даже сборках) ядра могут применяться разные механизмы: только initrd; только initramfs; или initrd, или initramfs.
Публикации, которые описывают все эти процессы, как правило, описывают цели и принципы работы этих инструментов. Но при решении задачи запуска конкретной системы может быть выбран конкретный (именно для этого случая) механизм и способ его использования. Например, к нюансам может относиться и выбор типа файловой системы для initrd, при его сборке. Как следствие, поддержка такого типа файловой системы должна присутствовать в используемой сборке ядра. Кроме того, возможны варианты, когда ядро и initrd - это два разных файла, или когда ядро и initrd размещены в одном файле. Подобные нюансы указываются в параметрах запуска ядра, которые могут быть прекомпилированы, и могут быть переданы загрузчиком ядра.
По поводу пакетов автоматизации сборки всего этого хозяйства (buildroot и прочие). В таких пакетах все задачи сборки описаны в соответствующих скриптах. Поэтому, чтобы разобраться с тем КАК это реализовано в конкретном пакете (чтобы сделать то же самое, но пошагово, "ручками"), понадобиться разобраться со скриптами этого конкретного пакета.
Публикации на эту тему описывают все эти проблемы с разных сторон и с разной детализацией. Посему, чтобы разобраться со всем этим хозяйством, одной-двух статей (даже достаточно хороших) может оказаться маловато.
Вариантов решения этого вопроса - великое множество. ВАШ случай специфичен только для ВАС. Поэтому, Вы и будете этим самым спецом ...если, конечно, разберётесь с вопросом.Pasa писал(а): Надеюсь, что где-то же должны быть спецы, которым не надо разбираться с этим вопросом, а которые могут просто взять и ответить что я делаю не так, почему не работает и что нужно поправить, как сделать правильно. Только и всего.
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: Минимальный initrd для встраиваемых систем
Я такого не говорил, чтобы определённо ... я высказал предположение, что это описание очень старое.Pasa писал(а):Мне нужно и "ехать" и понимать сам процесс езды, почему и как все происходит.
Судя по вашим комментариям , http://www.opennet.ru/base/sys/initrd_intro.txt.html - это просто "писанина на заборе".
... так же как и этот текст, который датирован "последней правкой" 2007г.Pasa писал(а): Об этом же пишут и здесь:
http://rus-linux.net/kos.php?name=/pape ... 04-02.html
Это будет одной из проблем, с которой вы столкнётесь в мире Linux (и UNIX вообще):
- большинство материалов либо очень старые, либо, как правило, вообще не датированные ... а значит очень-очень старые
- а все процессы, происходящие в Linux, приёмы работы ... и всё-всё-всё - очень быстро устаревает, и становится абсолютно неактуальным, не соответствует действительности...
- имеет смысл использовать информацию только ту, которой (от силы) не более 2-3 лет.
Обратите внимание на эту особенность (вы же, как пишете, недавно в мире Linux? ... это пригодится).
Вовсе не до такой степени, как вы это изображаете...Pasa писал(а): Обучение на десктопном дистрибутиве ....может и так. Но мне показалось, что десктопные дистрибутивы намного больше обвешаны различными загрузчиками/драйверами/стартовыми скриптами/утилитами/конфигами и прочими различными рюшечками от "дистрибутивостроителей",
А вот здесь то, как-раз, и начнутся всякие "рюшечки"(с)Pasa писал(а): чем если взять просто ядро и попробовать примонтировать минимальную rootfs в виде initrd. Без винчестеров, видеокарт, звука и прочее...
Только процессор и память, в которой и находится rootfs.
То, что вы делаете (а если совсем точно: то, что вы пытаетесь сделать ) - можно делать несколькими совершенно разными способами. И разобраться в одном из таких способов - это куда проще и плодотворнее (для вас, для понимания), чем ковыряться в том "что я делаю не так"(с)Pasa писал(а):а которые могут просто взять и ответить что я делаю не так, почему не работает и что нужно поправить, как сделать правильно. Только и всего.
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
Re: Минимальный initrd для встраиваемых систем
Кстати, Pasa, из того, что здесь подсказали:alex65su писал(а): Важно понять, что механизмы initrd и initramfs (по сути - это виртуальные диски) задействованы для подгрузки тех драйверов оборудования, которые, по какой-то причине, не включены в текущую сборку ядра. Еще одна тонкость заключается в том, что в разных версиях (или даже сборках) ядра могут применяться разные механизмы: только initrd; только initramfs; или initrd, или initramfs.
Публикации, которые описывают все эти процессы, как правило, описывают цели и принципы работы этих инструментов. Но при решении задачи запуска конкретной системы может быть выбран конкретный (именно для этого случая) механизм и способ его использования. Например, к нюансам может относиться и выбор типа файловой системы для initrd, при его сборке. Как следствие, поддержка такого типа файловой системы должна присутствовать в используемой сборке ядра. Кроме того, возможны варианты, когда ядро и initrd - это два разных файла, или когда ядро и initrd размещены в одном файле. Подобные нюансы указываются в параметрах запуска ядра, которые могут быть прекомпилированы, и могут быть переданы загрузчиком ядра.
- очень часто в публикациях предполагается (неявно), что файловая система, под которую собирается initrd - это FAT12 или FAT16, на любой другой FS это будет нескоько по-другому...
- все эти многочисленные (и меняющиеся из года в год) варианты initrd, initramfs и пр. - это рутинные приёмы разместить то, что не влезло или не хотелось включать в ядро...
- ... я уже не помню, подсказывали вам это или нет, - для минимальной встраиваемой системы вы можете, хотя бы для начала, собрать ядро, включив туда только то, что у вас есть в системе, и исключив оттуда совершенно всё, чего нет - так вы получите себе рабочее ядро без всяких "прибамбасок", связанных с динамической подгрузкой модулей ядра.
Re: Минимальный initrd для встраиваемых систем
Как-то пропустил...
Запуск бездисковых систем (иначе, "тонких" клиентов; загрузка по сети с сервера, и корень файловой системы после запуска станции тоже расположен на каком-то сервере) в работу осуществляется именно с помощью механизмов initrd и/или initramfs.
Так что разобраться со всеми этими приёмами на десктопном дистрибутиве будет не только возможно, но и в разы легче, а то и дешевле (по неопытности, заказную железку одной неосторожной записью во флеш можно легко превратить в "кирпич").
В свете применения initrd и/или initramfs в "толстых" десктопных дистрибутивах...Pasa писал(а): Обучение на десктопном дистрибутиве ....может и так. Но мне показалось, что десктопные дистрибутивы намного больше обвешаны различными загрузчиками/драйверами/стартовыми скриптами/утилитами/конфигами и прочими различными рюшечками от "дистрибутивостроителей",
чем если взять просто ядро и попробовать примонтировать минимальную rootfs в виде initrd. Без винчестеров, видеокарт, звука и прочее...
Только процессор и память, в которой и находится rootfs.
Запуск бездисковых систем (иначе, "тонких" клиентов; загрузка по сети с сервера, и корень файловой системы после запуска станции тоже расположен на каком-то сервере) в работу осуществляется именно с помощью механизмов initrd и/или initramfs.
Так что разобраться со всеми этими приёмами на десктопном дистрибутиве будет не только возможно, но и в разы легче, а то и дешевле (по неопытности, заказную железку одной неосторожной записью во флеш можно легко превратить в "кирпич").
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей