реклама на сайте
подробности

 
 
3 страниц V   1 2 3 >  
Reply to this topicStart new topic
> initfamfs - busybox - kernel, порочный круг при сборке
Hoodwin
сообщение Dec 5 2013, 10:42
Сообщение #1


Знающий
****

Группа: Участник
Сообщений: 881
Регистрация: 21-03-10
Из: _// \\_
Пользователь №: 56 107



Вот какая загвоздка. Имеем линукс для платформы c6x, который собираем с rootfs в варианте min-root, который по сути содержит 1) busybox, 2) mtd-utils, 3) libc. При сборке с нуля возникает такая проблема.
Чтобы собрать cpio образ rootfs, нужно в него положить все бинарники, то есть, в том числе, busybox, libc*.so и пр. Чтобы собрать busybox нужно иметь собранное ядро. А когда ядро собирается в конфигурации с initramfs, то конфгурационный скрипт дописывает в ($BLD)/.config строчку CONFIG_INITRAMFS_SOURCE=<путь к cpio>. Ну и вот при первой сборке никакого cpio то и нет еще. Получается порочный круг, и вообще гладко ничего собрать нельзя.

Пока что изворачивались тем, что подкладывали вначале какой-нибудь левый min-root-c6x.cpio, чтобы пройти цепочку и собрать настоящий rootfs, но это все в ручном режиме, противоречить идее make.

Может быть есть более прямой способ сборки? Например, меня бы устроил вариант, когда сначала ядро собирается само по себе, а потом отдельным таргетом к нему пришивается initramfs, и я могу управлять моментом этого пришивания - после сборки busybox, mtf-utils,... -> rootfs. Но уж как-то странно, что это надо прописывать через .config. Изменил .config, пересобирай снова все ядро...
Go to the top of the page
 
+Quote Post
Dron_Gus
сообщение Dec 5 2013, 14:27
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861



Зачем busybox'у собранное ядро?


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post
Hoodwin
сообщение Dec 5 2013, 15:37
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 881
Регистрация: 21-03-10
Из: _// \\_
Пользователь №: 56 107



Вот это еще одна загадка, на которую я пока не имею ответа. Пока что можно констатировать как факт, что при каждом вызове make product пересобирается busybox, даже если само ядро не пересобирается. Но главная грабля в том, что initramfs встраивается в объектный модуль ядра через установку опции в конфиге при сборке ядра, а не как отдельный таргет. А было бы удобнее так:
1) Собрать ядро
2) Собрать BB
3) собрать прочие файлы для наполнения initramfs
4) сделать образ rootfs
5) Прилинковать образ initramfs к ядру.
Go to the top of the page
 
+Quote Post
sasamy
сообщение Dec 5 2013, 18:55
Сообщение #4


Знающий
****

Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858



Цитата(Hoodwin @ Dec 5 2013, 14:42) *
Может быть есть более прямой способ сборки?


Любая сборочная система к которой не приложили руки китайцы из TI. То что вы описываете - это либо ошибка в их make-файле, либо непонимание для чего и что нужно, либо какой-то кривущий костыль специфичный для их процессора. Кстати ядро можно перелинковать с настоящим cpio архивом без извратов которые вы делаете с подстановкой "фейкового" архива, в ядре всегда автоматом создается "пустышка" для initramfs если не указан путь к cpio архиву (или путь к корню ФС - совсем не обязательно создавать cpio архив самому).

Сообщение отредактировал sasamy - Dec 5 2013, 18:58
Go to the top of the page
 
+Quote Post
Hoodwin
сообщение Dec 5 2013, 19:38
Сообщение #5


Знающий
****

Группа: Участник
Сообщений: 881
Регистрация: 21-03-10
Из: _// \\_
Пользователь №: 56 107



1) Вообще то там чаще индусы попадаются sm.gif
2) makefile писал француз, судя по имени.
3) Кривизна в Makefile восходит к самому ядру, как мне кажется. Вот если читать Documentation/filesystems/ramfs-rootfs-initramfs.txt, то там как раз и написано, что для сборки ядра вместе с initramfs нужно добавить в конфиг строчку CONFIG_INITRAMFS_SOURCE. Ну вот система сборки и подставляет туда путь к будущему cpio архиву. Но она не умеет собирать ядро дважды - до сборки cpio и после. Больше того, заказ на правку конфига отдается на откуп внешнему скрипту, который вкурочивает CONFIG_INITRAMFS_SOURCE в $(KOBJECTS)/.config. То есть, Makefile не знает, что делает это скрип, поэтому он не может понять, собирает он initramfs или нет, до или после cpio.

Пока что удалось сделать еще другой хак. Надо просто вначале собрать какое-нибудь ядро без initramfs. При этом rootfs cpio все равно создается, и может быть использован для дальнейшей сборки другого ядра с initramfs.
Go to the top of the page
 
+Quote Post
sasamy
сообщение Dec 5 2013, 19:50
Сообщение #6


Знающий
****

Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858



Цитата(Hoodwin @ Dec 5 2013, 23:38) *
3) Кривизна в Makefile восходит к самому ядру, как мне кажется.


вам кажется, потому что Linux вы познаете по кривым SDK. Вы возьмите архив ядра, соберите его вручную и посмотрите что происходит, сейчас у вас - неправильная трактовка прочитанной документации в голове, кривой SDK на руках и придуманные проблемы sm.gif
Go to the top of the page
 
+Quote Post
Hoodwin
сообщение Dec 5 2013, 20:07
Сообщение #7


Знающий
****

Группа: Участник
Сообщений: 881
Регистрация: 21-03-10
Из: _// \\_
Пользователь №: 56 107



Ну, допустим. Тогда объясните на пальцах, как правильно делать то?

Зачем вообще было делать систему, чтобы initramfs нужно было именно влинковывать в объектный модуль ядра? Почему нельзя было его просто прицепить к концу ядра, приделав к нему сигнатуру, и потом просто пошарить за хвостом загрузочного образа? Идеологически это было бы даже более гибко - собрал образ ядра, и потом по мере необходимости настроил любой вариант rootfs.
Go to the top of the page
 
+Quote Post
sasamy
сообщение Dec 5 2013, 20:27
Сообщение #8


Знающий
****

Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858



Цитата(Hoodwin @ Dec 6 2013, 00:07) *
Ну, допустим. Тогда объясните на пальцах, как правильно делать то?


Я пока так и не понял - что у вас сейчас не выходит ? если правильно понял - вам достаточно создать пустой файл на месте будущего настоящего архива cpio (у вас ядро не собирается из-за того что оно не находит архив по указанному в конфиге пути потому что архив еще не готов ?)

touch /home/vasya/TISDK/out_bin/rootfs.cpio

Цитата
Почему нельзя было его просто прицепить к концу ядра, приделав к нему сигнатуру, и потом просто пошарить за хвостом загрузочного образа?


Я не уверн что так нельзя сделать - надо посмотреть, по крайней мере блоб device tree можно так приклеивать (сделано специально для старых загрузчиков не поддерживающих загрузку DTB).
Go to the top of the page
 
+Quote Post
Hoodwin
сообщение Dec 5 2013, 20:45
Сообщение #9


Знающий
****

Группа: Участник
Сообщений: 881
Регистрация: 21-03-10
Из: _// \\_
Пользователь №: 56 107



Ну не выходит то, что при сборке с нуля ядра со встроенным initramfs оно не собирается. Потому что нет Build/rootfs/min-root-c6x.cpio, который сам по себе является таргетом, и зависит от сборки busybox, mtd-utils, etc. А busybox сам зависит еще от сборки ядра. И в итоге начинает то оно сборку с rootfs, но закапывается в сборку ядра, однако, с выставленным конфигом для cpio. И облом. Вот и приходится разруливать в ручном режиме.

Вы мне предлагаете еще один способ в ручном режиме разруливать этот казус?

Судя по исходнику init/initramfs.c там именно берется массив из объектного модуля ядра:
Код
extern char __initramfs_start[], __initramfs_end[];

...

static int __init populate_rootfs(void)
{
        char *err = unpack_to_rootfs(__initramfs_start,
                         __initramfs_end - __initramfs_start);
        ...
Go to the top of the page
 
+Quote Post
sasamy
сообщение Dec 5 2013, 20:53
Сообщение #10


Знающий
****

Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858



Цитата(Hoodwin @ Dec 6 2013, 00:45) *
Вы мне предлагаете еще один способ в ручном режиме разруливать этот казус?


Ручного там только добавить в make-файл эту строчку перед сборкой ядра и если нужно и дописать вызов сборки повторно уже после того как собран настоящий архив (если там этого не сделано), ядро слинкутся с этим архивом без полной пересборки - то что это изененный архив make обнаружит.

Цитата
Судя по исходнику init/initramfs.c там именно берется массив из объектного модуля ядра:


initramfs можно было отдельно от образа ядра загружать через параметр initrd - это 100%.

https://www.kernel.org/doc/Documentation/fi...s-initramfs.txt

Цитата
External initramfs images:
--------------------------

If the kernel has initrd support enabled, an external cpio.gz archive can also
be passed into a 2.6 kernel in place of an initrd. In this case, the kernel
will autodetect the type (initramfs, not initrd) and extract the external cpio
archive into rootfs before trying to run /init.


Сообщение отредактировал sasamy - Dec 5 2013, 20:57
Go to the top of the page
 
+Quote Post
Hoodwin
сообщение Dec 5 2013, 21:03
Сообщение #11


Знающий
****

Группа: Участник
Сообщений: 881
Регистрация: 21-03-10
Из: _// \\_
Пользователь №: 56 107



Так вот засада то в том, что для линковки ядра с нужным архивом нужно внести параметр CONFIG_INITRAMFS_SOURCE в .config и вызвать make. А когда make видит, что у ядра поменялся .config, то он начинает его заново собирать целиком.

Цитата
initramfs можно было отдельно от образа ядра загружать через параметр initrd - это 100%.

так вот главный вопрос, откуда загружать? Основная ценность initramfs для меня именно в том, что он встроен в ядро и поднимает минимально необходимый набор инструментов до того, как примонтированы все прочие источники данных. То есть это тестовое ядро, которое можно грузить с TFTP и пускать на нем все программы, подмонтировав NFS, если нужно.
Go to the top of the page
 
+Quote Post
sasamy
сообщение Dec 5 2013, 21:14
Сообщение #12


Знающий
****

Группа: Участник
Сообщений: 783
Регистрация: 22-11-08
Пользователь №: 41 858



Цитата(Hoodwin @ Dec 6 2013, 01:03) *
Так вот засада то в том, что для линковки ядра с нужным архивом нужно внести параметр CONFIG_INITRAMFS_SOURCE в .config и вызвать make.


Заканчивайте эти рекурствные головоломки, а это вы тогда про что написали ?

Цитата
Ну не выходит то, что при сборке с нуля ядра со встроенным initramfs оно не собирается. Потому что нет Build/rootfs/min-root-c6x.cpio,


если этот параметр пустой то и создавать ничего не надо - там без вопросов пустышка будет сформирована, об этом я вам в самом начале написал

Цитата
А когда make видит, что у ядра поменялся .config, то он начинает его заново собирать целиком.


А вы пробовали ? почему то когда я дописываю в конфиге CONFIG_INITRAMFS_SOURCE у меня только линкуется с этим архивом без пересборки sm.gif
Go to the top of the page
 
+Quote Post
Dron_Gus
сообщение Dec 6 2013, 07:44
Сообщение #13


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861



Что у Вас за загрузчик? Если что-то не очень кастрированнное, то ему можно отдельно подпихнуть два образа - ядра и initramfs. А еще можно склеить их вместе с помошью mkimage.


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post
Hoodwin
сообщение Dec 6 2013, 09:09
Сообщение #14


Знающий
****

Группа: Участник
Сообщений: 881
Регистрация: 21-03-10
Из: _// \\_
Пользователь №: 56 107



U-Boot 2012.04.01 (Feb 07 2013 - 18:10:09)
Go to the top of the page
 
+Quote Post
Dron_Gus
сообщение Dec 6 2013, 14:56
Сообщение #15


Профессионал
*****

Группа: Свой
Сообщений: 1 202
Регистрация: 9-01-05
Из: Санкт-Петербург
Пользователь №: 1 861



Цитата(Hoodwin @ Dec 6 2013, 13:09) *
U-Boot 2012.04.01 (Feb 07 2013 - 18:10:09)

Код
bootm <Linux uImage address> <mkimage wrapped ramdisk address> <device tree (dtb) address>

Соответственно ramdisk надо обернуть mkimage.


--------------------
Если сверху смотреть, то сбоку кажется, что снизу ничего не видно.
Go to the top of the page
 
+Quote Post

3 страниц V   1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd June 2025 - 22:43
Рейтинг@Mail.ru


Страница сгенерированна за 0.01479 секунд с 7
ELECTRONIX ©2004-2016