Pasa 0 2 октября, 2013 Опубликовано 2 октября, 2013 · Жалоба Всем доброго дня/ночи/вечера/утра! Есть отладочная плата от 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? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xor.kruger 0 2 октября, 2013 Опубликовано 2 октября, 2013 · Жалоба Неоднократно использовал 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 необязательно что-то указывать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Lagman 1 2 октября, 2013 Опубликовано 2 октября, 2013 · Жалоба Это где то между 3 и 4 шагом. Ccылка linuxrc, указывающая на /bin/busybox и папки .bin, /lib и /sbin, была добавлена в папку /rootfs — можете в этом убедиться. Может оказаться, что ссылки там не окажется, если вы не отметили в BusyBox опцию ”initrd support” (поддержка initrd). Удалим ссылку linuxrc и создадим ссылку для init, указывающую на /bin/busybox Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
krux 8 2 октября, 2013 Опубликовано 2 октября, 2013 · Жалоба ядро не находит ./init на root-разделе вероятные причины: initrd не найден по указанному вами адресу, или не удалось распаковать initrd в /dev/ram0 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Pasa 0 2 октября, 2013 Опубликовано 2 октября, 2013 · Жалоба посоветовали следующее : 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 да вроде находит и распаковывает и монтирует судя по отсутствии ругани. А вот исполнять скрипт не хочет.... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Pasa 0 3 октября, 2013 Опубликовано 3 октября, 2013 (изменено) · Жалоба Неоднократно использовал 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 Изменено 3 октября, 2013 пользователем Pasa Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
krux 8 3 октября, 2013 Опубликовано 3 октября, 2013 (изменено) · Жалоба busybox рекомендуется собирать с uClibc Изменено 3 октября, 2013 пользователем krux Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vshemm 0 3 октября, 2013 Опубликовано 3 октября, 2013 (изменено) · Жалоба А кто вам сказал, что /linuxrc будет выполняться автоматически? См. http://lxr.linux.no/linux+v2.6.28/init/main.c#L817 Передайте параметр ядру init=/linuxrc EDIT: Ага, вы это уже сделали :) Проверьте сам linuxrc на предмет чем он будет исполняться (в начале должно быть нечто вида #!/bin/sh), а также сам шелл (куда он указывает, требуется ли для него внешние библиотеки или он слинкован статически, права доступа и пр.). Изменено 3 октября, 2013 пользователем vshemm Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Pasa 0 3 октября, 2013 Опубликовано 3 октября, 2013 · Жалоба А кто вам сказал, что /linuxrc будет выполняться автоматически? См. http://lxr.linux.no/linux+v2.6.28/init/main.c#L817 Передайте параметр ядру init=/linuxrc EDIT: Ага, вы это уже сделали :) Проверьте сам linuxrc на предмет чем он будет исполняться (в начале должно быть нечто вида #!/bin/sh), а также сам шелл (куда он указывает, требуется ли для него внешние библиотеки или он слинкован статически, права доступа и пр.). Похоже вы правы и копать надо здесь. Busybox собран кривовато, не статически. Пошел погружаться в этот момент. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xor.kruger 0 4 октября, 2013 Опубликовано 4 октября, 2013 · Жалоба busybox рекомендуется собирать с uClibc Его рекомендуют собирать с uClibc, только исходя из меньшего размера получаемого бинарника, в 90 % случаев собирал glibc для множества архитектур - работало без нареканий. static не хочет компилить Исходя из Вашего куска лога, скорее всего выставлена опция CONFIG_WERROR. Уберите ее и все будет ок :) Если не поможет, то соберите динамически а либы от которых, зависит подсуньте вручную в рутфс, например так: префикс-кросскомпилятора-readelf -a имя_файла | grep "Shared library" И еще...для чего делать инсталл - шаг 3? После этого в папке _install создается структура Вашей рутовой файловой системы, которая в потом "готова к использованию" И для чего шаг 8? Для того, чтобы ядро знало как называется, чем распаковывать и где лежит Ваш образ Initramfs. В результате Вы получите одним файлом и ядро и Initramfs. Initramfs как раз и "пришла" на замену Initrd. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Pasa 0 11 октября, 2013 Опубликовано 11 октября, 2013 (изменено) · Жалоба удалось запустить стартовый скрипт 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. Где и в каких опциях ядра и что нужно указать? Изменено 11 октября, 2013 пользователем Pasa Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
xor.kruger 0 14 октября, 2013 Опубликовано 14 октября, 2013 · Жалоба подскажите....для чего шаг 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" Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться