Перейти к содержанию
    

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

Всем доброго дня/ночи/вечера/утра!

Есть отладочная плата от StarterKit - армовский проц AT9260.

В комплекте были исходники пропатченного для платы ядра и файловой системы.

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

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

 

На основе материала http://www.opennet.ru/base/sys/initrd_intro.txt.html

собрал initrd. Подсунул его вместо прежней файловой системы. Ядро 2.6.28.

И ядро и initrd грузятся через tftpboot c виртуальной машины, на которой я собственно и собираю ядро и файловую систему.

В минимальном созданном вручную initrd в корне сделал 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"

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Неоднократно использовал Initramfs. Собирал его Busybox'ом. Работало все отлично со множеством архитектур.

Шаги такие:

1. Качаете Busybox на официальном сайте www.busybox.org

2. Выставляете необходимые опции через make menuconfig. Для начала экспириментов обязательно выставьте опции сборки static.

3. Собираете Busybox: make CROSS_COMPILE=префикс

3. Инсталлируете (по умолчанию в каталог _install): make install CROSS_COMPILE=префикс

4. В каталоге _install делаете ссылку init на bin/busybox

5. Добавляете необходимые файлы устройств в каталог dev, inittab и необходимые скрипты загрузки в etc

6. Запаковываете: find . | cpio -H newc -o > ../initramfs.cpio

7. Архивируете (например gzip): gzip -9 initramfs.cpio

8. Перемещаете в каталог с ядром, указываете в опциях ядра имя файла и алгоритм сжатия. Компилируете и наслаждаетесь :)

 

ЗЫ: При таком случае в параметрах загрузки о Initramfs необязательно что-то указывать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это где то между 3 и 4 шагом.

Ccылка linuxrc, указывающая на /bin/busybox и папки .bin, /lib и /sbin, была добавлена в папку /rootfs — можете в этом убедиться. Может оказаться, что ссылки там не окажется, если вы не отметили в BusyBox опцию ”initrd support” (поддержка initrd). Удалим ссылку linuxrc и создадим ссылку для init, указывающую на /bin/busybox

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ядро не находит ./init на root-разделе

вероятные причины: initrd не найден по указанному вами адресу, или не удалось распаковать initrd в /dev/ram0

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

посоветовали следующее :

CONFIG_CMDLINE="root=/dev/ram0 rw initrd=0x21000000,0x500000 console=ttyS0,115200 mem=32M init=/linuxrc"

 

Но ядро ругается: "Failed to execute /linuxrc. Attempting defaults...."

 

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

 

Скриптовый файл /linuxrc имеет, естественно, все атрибуты доступа и запуска для всех пользователей.

 

ядро не находит ./init на root-разделе

вероятные причины: initrd не найден по указанному вами адресу, или не удалось распаковать initrd в /dev/ram0

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Неоднократно использовал Initramfs. Собирал его Busybox'ом. Работало все отлично со множеством архитектур.

Шаги такие:

1. Качаете Busybox на официальном сайте www.busybox.org

2. Выставляете необходимые опции через make menuconfig. Для начала экспириментов обязательно выставьте опции сборки static.

3. Собираете Busybox: make CROSS_COMPILE=префикс

3. Инсталлируете (по умолчанию в каталог _install): make install CROSS_COMPILE=префикс

4. В каталоге _install делаете ссылку init на bin/busybox

5. Добавляете необходимые файлы устройств в каталог dev, inittab и необходимые скрипты загрузки в etc

6. Запаковываете: find . | cpio -H newc -o > ../initramfs.cpio

7. Архивируете (например gzip): gzip -9 initramfs.cpio

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

 

На 2 шаге осечка, при выставлении static не хочет компилить:

-----------------------------------------------------------

applets/applets.c:20:2: error: #warning Static linking against glibc produces buggy executables

applets/applets.c:21:2: error: #warning (glibc does not cope well with ld --gc-sections).

applets/applets.c:22:2: error: #warning See sources.redhat.com/bugzilla/show_bug.cgi?id=3400

applets/applets.c:23:2: error: #warning Note that glibc is unsuitable for static linking anyway.

applets/applets.c:24:2: error: #warning If you still want to do it, remove -Wl,--gc-sections

applets/applets.c:25:2: error: #warning from top-level Makefile and remove this warning.

make[1]: *** [applets/applets.o] Error 1

make: *** [applets] Error 2

--------------------------------------------------------------

 

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

Без static все компилится.

 

И еще...для чего делать инсталл - шаг 3?

И для чего шаг 8?

Я так понимаю, что после компиляции получается

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

И достаточно ручками создать ссылки как описано в http://www.opennet.ru/base/sys/initrd_intro.txt.html. Через эти ссылки будет вызываться на исполнение busybox и отрабатывать

те или иные запрашиваемые действия. Или я не прав?

 

Но все-таки сделал make install. В итоге в /_insatll получил тот самый исполнимый busybox и кучу разных ссылок. В том числе и @linuxrc в корне. Но все они не текстовые. Просмотреть их не удалось. Очень похожее получается, когда я собираю rootfs через buildroot - тоже busybox, куча ссылок и @linuxrc в корне. Но при загрузке такой rootfs система успешно загружается и запускается консоль с шеллом. Пробовал из /_insatll все взять, скопировать в полученную через buildroot файловую систему , запаковал и подсунул на загрузку.

Но ядро опять в панике.

 

Что то я совсем запутался. Как же после загрузки и старта заставить ядро выполнить элементарный скрипт.....linuxrc

Изменено пользователем Pasa

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

busybox рекомендуется собирать с uClibc

Изменено пользователем krux

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А кто вам сказал, что /linuxrc будет выполняться автоматически?

См. http://lxr.linux.no/linux+v2.6.28/init/main.c#L817

Передайте параметр ядру init=/linuxrc

 

EDIT: Ага, вы это уже сделали :) Проверьте сам linuxrc на предмет чем он будет исполняться (в начале должно быть нечто вида #!/bin/sh), а также сам шелл (куда он указывает, требуется ли для него внешние библиотеки или он слинкован статически, права доступа и пр.).

Изменено пользователем vshemm

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А кто вам сказал, что /linuxrc будет выполняться автоматически?

См. http://lxr.linux.no/linux+v2.6.28/init/main.c#L817

Передайте параметр ядру init=/linuxrc

 

EDIT: Ага, вы это уже сделали :) Проверьте сам linuxrc на предмет чем он будет исполняться (в начале должно быть нечто вида #!/bin/sh), а также сам шелл (куда он указывает, требуется ли для него внешние библиотеки или он слинкован статически, права доступа и пр.).

 

Похоже вы правы и копать надо здесь. Busybox собран кривовато, не статически.

Пошел погружаться в этот момент.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

busybox рекомендуется собирать с uClibc

Его рекомендуют собирать с uClibc, только исходя из меньшего размера получаемого бинарника, в 90 % случаев собирал glibc для множества архитектур - работало без нареканий.

static не хочет компилить

Исходя из Вашего куска лога, скорее всего выставлена опция CONFIG_WERROR. Уберите ее и все будет ок :)

Если не поможет, то соберите динамически а либы от которых, зависит подсуньте вручную в рутфс, например так:

префикс-кросскомпилятора-readelf -a имя_файла | grep "Shared library"

И еще...для чего делать инсталл - шаг 3?

После этого в папке _install создается структура Вашей рутовой файловой системы, которая в потом "готова к использованию"

И для чего шаг 8?

Для того, чтобы ядро знало как называется, чем распаковывать и где лежит Ваш образ Initramfs. В результате Вы получите одним файлом и ядро и Initramfs.

Initramfs как раз и "пришла" на замену Initrd.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

удалось запустить стартовый скрипт linuxrc. Но при условии, что я busybox подменил - взял готовый бинарник собранный в buildroot и руками сделал в корне /lib и напихал туда все библиотеки, котрые понаделал buildroot.

 

Но никак не удается собрать busybox статически.

Ругается:

-----------------------------------------------------------

applets/applets.c:20:2: error: #warning Static linking against glibc produces buggy executables

applets/applets.c:21:2: error: #warning (glibc does not cope well with ld --gc-sections).

applets/applets.c:22:2: error: #warning See sources.redhat.com/bugzilla/show_bug.cgi?id=3400

applets/applets.c:23:2: error: #warning Note that glibc is unsuitable for static linking anyway.

applets/applets.c:24:2: error: #warning If you still want to do it, remove -Wl,--gc-sections

applets/applets.c:25:2: error: #warning from top-level Makefile and remove this warning.

make[1]: *** [applets/applets.o] Error 1

make: *** [applets] Error 2

--------------------------------------------------------------

 

удаляю -Wl,--gc-sections из makefile....все равно получаю это сообщение

 

 

Неоднократно использовал Initramfs. Собирал его Busybox'ом. Работало все отлично со множеством архитектур.

Шаги такие:

1. Качаете Busybox на официальном сайте www.busybox.org

2. Выставляете необходимые опции через make menuconfig. Для начала экспириментов обязательно выставьте опции сборки static.

3. Собираете Busybox: make CROSS_COMPILE=префикс

3. Инсталлируете (по умолчанию в каталог _install): make install CROSS_COMPILE=префикс

4. В каталоге _install делаете ссылку init на bin/busybox

5. Добавляете необходимые файлы устройств в каталог dev, inittab и необходимые скрипты загрузки в etc

6. Запаковываете: find . | cpio -H newc -o > ../initramfs.cpio

7. Архивируете (например gzip): gzip -9 initramfs.cpio

8. Перемещаете в каталог с ядром, указываете в опциях ядра имя файла и алгоритм сжатия. Компилируете и наслаждаетесь :)

 

ЗЫ: При таком случае в параметрах загрузки о Initramfs необязательно что-то указывать.

 

- подскажите....для чего шаг 4.... Такую ссылку наблюдаю, когда собираю rootfs с помощью buildroot

 

- поясните пж-ста шаг 8. Где и в каких опциях ядра и что нужно указать?

Изменено пользователем Pasa

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

подскажите....для чего шаг 4.... Такую ссылку наблюдаю, когда собираю rootfs с помощью buildroot

По процессу Init в интернете можно много чего найти :) Вкратце: в процессе загрузки, после инициализации ядра, ядро запускает init как первый процесс пользовательского режима. Init отвечает за дальнейшую загрузку системы. (Выдержка с Педивикии :) )

А когда Вы собираете RootFS с помощью Busybox, то данный Init содержится в файле /bin/busybox, но ядро ищет как раз файл с именем init, вот как раз по этому и необходимо сделать ссылку с таким именем на /bin/busybox.

 

поясните пж-ста шаг 8. Где и в каких опциях ядра и что нужно указать?

Устанавливаете опцию CONFIG_BLK_DEV_INITRD, после появляется CONFIG_INITRAMFS_SOURCE в которой указываете имя образа initramfs, и если выполнили пункт 7 то дополнительно еще и устанавливаете CONFIG_INITRAMFS_COMPRESSION_GZIP.

Все перечисленные опции находятся во вкладке "General Setup"

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...