LINUX.ORG.RU

Запуск программы в initramfs

 , , ,


0

0

Доброго времени суток, ЛОР.

Хотелка

Во время загрузки производить некоторые операции с разделами системы, запускать некоторые программы предпроверки и время initramfs очень подходящее.

Окружение

raspberry pi3b+, armhf raspbian.

initramfs

Просто закинул и пролинковал busybox, расставил порядок папок. Собрал в нужный(cpio -> gz) архив.

Работает

Загружаюсь в initramfs, выполняется мой init, прокидываю себя на консоль(busybox sh). Если нужно - могу продолжить загрузку.

Проблема 1

Не могу запустить программу написанную на С++. Программа, пока что, простая(Драсьте, мир), статическая линковка, кросскомпиляция на месте. В самой системе на малине работает, в initramfs(запуская из init скрипта) пишет, мол, не найдено(Хоть она точно есть и через ls видно):

/init: line 54: /bin/hello_try: not found

Как мне запустить собственную программу в initramfs?

Проблема 2

Сеть не подхватывает ип и шлюз. Тобишь, в /etc/network/interfaces задан eth0 интерфейс как dhcp, ifup -a отрабатывает(получает ип по арпу) и всё. Интерфейс остаётся без ип’а, шлюз не выставлен, роутинга нет. Как победить?

Приложения

init-скрипт

Решение

Проблема 1

Я не досмотрел и собирал статически только libc и libstd++(флаги линковки для gcc: -static-libgcc -static-libstdc++). Поставив один флаг линковки -static всё собралось статически, заработало. Да, есть варнинги, но это другая история.

Проблема 2

Пересобрал образ через buildroot с нужными пакетами внутри(в том числе dhcpcd) - вуаля - работает и определяется сама сеть.

Спасибо всем принявшим участие за «пинок - куда копать».

По проблеме 1 - загрузичь в rescue-shell(в некоторых дистрх достатояно например неправильно указать корень, как в твоем - гугли) и смотри что там. Может ты действительно не туда программу положил? Второй вариант - не хватает симлинков/либ в initrd. Смотри выхлоп lddtree на свою программу и сравнивай его с тем что у теья в initrd лежит.

По проблеме 2 - если настроить статикой, работает? Что в качестве dhcp-клиента используется?

anonymous ()
Ответ на: комментарий от wandrien

Да, вы, как и выше написавшие, правы. Я не всё статически линковал, а только libc и libstd++ - не досмотрел. Сейчас запускается из-под initramfs, но при компиляции даёт варнинги, мол, для некоторых функций libc нужны динамические либы во время исполнения - как это лечить непонятно.

warning: Using 'getpwuid_r' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
Kass_Martin ()
Ответ на: комментарий от anonymous

Проблема 1 - отписал выше. Проблема 2 - статически всё выставляется после отработки ifup. А должен отрабатывать какой-то клиент при настройке на dhcp? Выдаёт то ип роутер и ifup должен всё выставить. Или я ошибаюсь? Просто, ручками прописав через ip a add… b ip route add… оно заработало, но это та же статика, только ручками)

Kass_Martin ()
Ответ на: комментарий от Kass_Martin

glibc невозможно слинковать полностью статически, всегда остаётся вот этот кусок подгружаемых модулей, которыми выполнена расширяемая часть библиотеки. Скажем разработчикам GNU спасибо за это....

Как вариант, можно использовать musl вместо glibc.

wandrien ()
Ответ на: комментарий от Kass_Martin

Спасибо за совет, попробую.

нафиг нужна musl если есть uclibc - берешь buildroot и собираешь статически. Непонятно остаётся - зачем запускать что-то из промежуточной initramfs, тем более писать это на плюсах.

anonymous ()
Ответ на: комментарий от wandrien

glibc невозможно слинковать полностью статически, всегда остаётся вот этот кусок подгружаемых модулей

~/imx8/fpga/memtst/pci_test$ make
cc -static -Wall -Wextra pci_test.c -o pci_test
~/imx8/fpga/memtst/pci_test$ ldd pci_test 
	not a dynamic executable

про какие библиотеки речь ?

anonymous ()