LINUX.ORG.RU

buildroot & установка загрузчика


0

0

Была здесь на форуме похожая тема, но не дожата до конца. Требуется собрать Линукс для встраиваемой системы на i586 и установить его на CompactFLASH. Итак собрал с помощью buildroot ядро Линукса и ФС. Примонтировал образ, примонтировал CompactFLASH. Скопировал всё с расскрытого образа на флешку. Теперь осталось установить загрузчик. В настойке buildroot было указано использовать GRUB. Но в итоговой ФС файлов GRUB не оказалось. Сам GRUB был создан в рабочей папке. Исследовав маке файл обнаружил причину. Оказывается GRUB создаётся, ставиться в таргет ФС а затем СТИРАЕТСЯ. Здесь http://dev.openaos.org/browser/trunk/gen7/buildroot/target/x86/grub/grub.mk?r... содержимое маке файла. Там есть пункты grub-clean и grub-dirclean. Это приводит в ступор. Зачем так?

Пытался запустить GRUB с рабочей папки. Вошёл в папку где он лежит и дал grub - в ответ Command not found. Дал ./grub - No such file. Короче не запускается. Делал даже chmod +x grub.

У меня Слакварь 13 в консольном режиме. Он GRUB не содержит. Есть Lilo. Пробовал его поставить, но тоже никак не смог. Давал lilo -r /mnt/flash -C /etc/lilo.conf.mnt. Где /mnt/flash - примонтированный CompactFLASH, /etc/lilo.conf.mnt - конфиг лежащий на CompactFLASH. В нём указано куда прописать MBR - boot=/dev/sdc. Выдаёт - Fatal: raid_setup: stat(«/dev/sdc»). Сам CompactFLASH система видит как sdc. На нём 1 раздел sdc1 с флагом bootable. При чём тут raid не понятно.

И как всё таки поставить загрузчик на подключенный CompactFLASH? Просьба рекомендации подкреплять конкретными коммандами, подробнее.


Поставьте grub в хост-операционку. Чтобы установить grub, нужно запустить бинарь. который пропишет нужное на носителе (загрузочные сектора поменяет, пропишет свои стадии). Вот как запустить бинарь, скомпилённый под целевую архитектуру? понимаю, что повезло с build-архитектурой (x86), а если это была бы mipsel/arm/etc? тут скомпилённый бинарь grub'а был бы бесполезен (на хост-операционке никак не запустить).

Slavaz ★★★★★
()

А чем тебе U-Boot не нравится в роли загрузчика?

Я правда ставил его только на ARM, но не думаю, что будут большие проблемы с i586. К тому U-Boot тоже можно собрать используя buildroot

Dennis7
()

В хосте стоит Lilo, и честно говоря перебивать на менее знакомое совсем не хочеться. Можно и положить систему если вдруг что не так. Да и как влияет установленный в MBR хоста grub на его установку в примонтированный девайс? И как я писал, grub не запускается.

Против U-Boot ничего не имею, как и за тоже. Почти ничего о нём не знаю. Но при беглом осмотре инета кажется что это для совсем эмбеддед. Для тех у кого всё зашито в ПЗУ и нет обычного БИОСа.

В идеале я бы поставил Lilo и всё. Кто нибуть собирал GRUB в buildroot?

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

> В хосте стоит Lilo, и честно говоря перебивать на менее знакомое совсем не хочеться. Можно и положить систему если вдруг что не так.

Поставьте в хост-операционке grub, но не запускайте grub-install

Да и как влияет установленный в MBR хоста grub на его установку в примонтированный девайс?

Не нужно ставить grub в MBR хост-операционки - нужен только нативный бинарник. Его-то и надо натравить на примонтированный диск (а также указать нативному грубу файлы стадий, скомпилённых под build-архитектуру)

Попробую объяснить попонятнее: нужна утилита комстроки grub, которая будет работать под хост-операционкой. Чтобы её можно было бы запустить на хост-операционке. При этом устанавливать загрузчик в MBR основного диска не нужно. С MBR потом загружается не /sbin/grub, а /boot/grub/*stage*
Вот эти стадии должны быть скомпилены под билд-архитектуру. На эти файлы ваш /sbin/grub потом и нужно натравить.

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

>Попробую объяснить попонятнее: нужна утилита комстроки grub

Очень понятно, учитывая что у него есть только lilo в системе :)

#mount /dev/sdc1 /mnt
#mount --bind /dev /mnt/dev/
#cat > /mnt/etc/lilo.conf << «EOF»
lba32
boot=/dev/sdc
prompt
timeout=3
vga=normal

image=/boot/bzImage
label=linux
root=/dev/sda1 <----- подставить что будет на целевой системе или вообще убрать и передавать через root=/dev/foo в командной строке (можно в параметере boot при сборке ядра указать)
read-only
append=«quiet»

# End file
EOF
#lilo -r /mnt
#umount /mnt/dev
#umount /mnt

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

Забыл одну вещь - чтобы таймаут был 3 сек нужно
timeout=30
у лилы в десятых долях секунды это указывается.

bengan
()

если система встраиваемая, но такой развесистый загрузчик как grub не нужен, да и lilo наверное слишком жирно. Поставь extlinux.

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

>да и lilo наверное слишком жирно

Сегодня нужно приложить усилия чтобы найти в продаже CF объемом меньше 1 GB. Так что аргумент из вчерашнего дня :)

bengan
()

bengan +1! Сработало. Выходит не хватало #mount --bind /dev /mnt/dev получается что надо было подставить /dev от рабочей хост системы. В ФС /dev был создан но не соответствовал хосту. Ещё понадобилось добавить в твой листинг конфы:

disk = /dev/sdc # Указать, как hdc будет выглядеть в системе:

bios = 0x80 # BIOS увидит его, как первый диск

Иначе Lilo ругалось. Поставил root=/dev/hda1. Только с такими параметрами Lilo отрабатывает без выдачи ошибок. Но теперь при загрузке в таргете получаю ошибку:

VFS: Сannot open root device 301 or unknown-block(3,1).

Please append a correct «root=» boot option; here available partitions:

0800 497448 sda driver: sd

0801 497416 sda1

Kernel Panic: not syncing: VFS: Unable to mount root fs on unknown-block(3,1).

Похоже диск видит как sda. Но если поставить root=/dev/sda1 то ругаается lilo, мол нет такого диска. Да, на хосте такого нет. В таргете диск подключен как primary master. Подключил диск как primary slave, но всё равно видит как sda! Ядро таргета собрано с поддержкой IDE. Супорт SATA выкл. На таргете SATA нет впринципе.

Хотел бы именно lilo забороть. Для встроенных grub большеват.

vad74
() автор топика

Залил в /boot ядро vmlinuz от хост системы, слакварь. Теперь ту ошибку не даёт. пишет что видит hda. И даёт другую ошибку.

0300 497448 hda driver: ide-gd.

0301 497416 hda1

No filesystem could mount root, tried: romfs

Kernel Panic: not syncing: VFS: Unable to mount root fs on unknown-block(3,1).

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

>disk = /dev/sdc # Указать, как hdc будет выглядеть в системе:

bios = 0x80 # BIOS увидит его, как первый диск

Иначе Lilo ругалось.



Пусть ругается - тебе это мешает ? :)

Поставил root=/dev/hda1.


убери вообще параметр root а вместо

append=«quiet»

сделай
append=«root=/dev/hda1»

за одним и лог будет видно :) Можно было бы UUID прописать но помоему это не работает без initrd.

Залил в /boot ядро vmlinuz от хост системы, слакварь.


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

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

> Сегодня нужно приложить усилия чтобы найти в продаже CF объемом меньше 1 GB. Так что аргумент из вчерашнего дня :)

меньший размер загрузчика — можно съэкономить пару секунд при загрузке особенно если если он читается с flash, для встраевомой системы должно быть существенно. Да и чем проще — тем надёжнее.

pupok ★★
()

bengan +2. Помогло append=«root=/dev/sda1». Пробвал сначала hda1 но не пошло. Упорно хочет sda1. Тогда дал что он хочет и всё загрузилось. Я в консоли! Всем спасибо.

При входе логин не спрашивал, только ентер. Грузиться реально быстро. То что надо. При загрузке выводит сообщения с временем. В последнем значится 1,6 сек. Видимо это время загрузки ядра и ФС.

Отметил что нет папки /proc. Поэтому ругается на ps halt reboot. Наверно это из-за read-only. Надо будет убрать.

vad74
() автор топика
Ответ на: комментарий от pupok

>меньший размер загрузчика — можно съэкономить пару секунд при загрузке

# ls -l u-boot.bin
-rwxr-xr-x 1 root root 189708 2010-04-22 17:40 u-boot.bin
# ls -l /sbin/lilo
-rwxr-xr-x 1 root root 169728 2009-09-03 03:23 /sbin/lilo

u-boot для soc на arm. эти 150 кб по сравнению с ядром в 1 мб ничего не значат - по времени загрузчик вообще роли не играет, загрузка ядра с распаковкой и инициализацией подсистем на порядок времени больше требует.

Да и чем проще — тем надёжнее


Проще и надежней lilo только новый релиз lilo :)

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

> -rwxr-xr-x 1 root root 169728 2009-09-03 03:23 /sbin/lilo

extlinux занимает порядка 10кб

Проще и надежней lilo только новый релиз lilo :)

когда он в последний раз был? :) а extlinux развивается, скоро должны ext4 прикрутить.

pupok ★★
()

Разобрался почему диск упорно видела как sda. Ядро было скомпилированно с поддержкой SATA, а ATA не было включенно. Перекомпилировал, теперь видит как hda. И теперь append применять нет необходимости, hda в хосте есть.

vad74
() автор топика

Закрыл read-only в конфиге Lilo. Но всё равно диск монтирует как read-only. Пишет: «VFS: Mounted root (ext2 fs) readonly on device 3:1». Где ещё может сидеть жучёк?

Какие есть то непонятки с загрузкой, думаю из-за особенностей построения системы buildroot-ом. В самом конце загрузки пишет «cant run /etc/init.d/rc.S : Not a directory». Да, в /etc папки init.d нету. Его buildroot не сделал, значит ему не надо. При загрузке ядро должно запустить init. Есть такой файл в /sbin, точнее не файл а ссылка. В папке /sbin лежит всего 1 бинарник ldconfig, и куча ссылок. Ещё отмечу, что прямо в корне ФС лежит ссылка linuxrc. По описанию она монтирует «реальную» корневую файловую систему, после монтирования начального RAM диска (initrd). Файла initrd тоже нету. Да и должна быть загрузка без промежуточной начальной ФС, сразу должна грузиться боевая ФС. Также в /etc нет привычных файлов inittab, mtab, fstab. Такое чувство что тут всё не так. Хочу понять как должна грузиться система сделаная buildroot-ом. Напишите кто знает.

vad74
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.