Raspberry Pi 2 Custom Kernel с initramfs

Raspberry Pi 2 Custom Kernel с initramfs

Я пытаюсь запустить самокомпилированное ядро ​​вместе с initramfs. На старом raspberry это работало, но почему-то я не могу его запустить.

Что именно я пытаюсь сделать: загрузить ядро, «запустить» initramfs, который затем выполнит некоторые проверки (обновление системы и т. д.), наконец, монтировать образ squashfs и вызывать switch_root в указанной системе.

Но ядро ​​почему-то отказывается запускать initramfs. Я пробовал разные настройки в cmdline.txt/ config.txt, но ни одна из них не работает, ядро ​​всегда ждет, пока не станет доступен какой-нибудь root (или терпит неудачу с VFS: unable to mount root fs on unknown block). Я предполагаю, что мне не хватает какой-то настройки cmdline (вероятно, правильный root=.... root=/dev/ram0не сработал) или флага ядра. Моя текущая cmdline: dwc_otg.lpm_enable=0 console=tty1 elevator=deadline rootwait, config.txt:initramfs initramfs.gz followkernel

Когда я добавляю, root=/dev/mmcblk0p6 roottype=ext4вся система загружается (в какой-то тестовый Linux, который я добавил, чтобы проверить работу самого ядра).

Я проверил, что ядро ​​скомпилировано с поддержкой initramfs ( BLK_DEV_INITRD=y), компиляция initramfs в образ ядра, к сожалению, невозможна. Ядро (4.1 stable) скомпилировано с помощью buildroot. Формат двоичного ядра — zImage (кажется, не работает с vmlinux, экран остается черным).

решение1

Я начал с нуля и после нескольких часов проб и ошибок добрался до источника(ов) своей проблемы, которые по сути представляли собой просто несколько глупых ошибок: мой скрипт сборки сгенерировал initramfs с абсолютными путями (т. е. не, например, lib/libc.soа ~/Work/project/target/lib/libc.so), что, очевидно, привело к тому, что ядро ​​не нашло начальный файл init.

Интересный урок, который я усвоил: Встроенный initramfs, по-видимому, ведет себя немного иначе, чем внешний, а именно, команды echo и тому подобное в скрипте init не печатаются, когда присутствует встроенный initramfs. Во время экспериментов с внешним initramfs я забыл удалить встроенный, в результате чего внешний init был выполнен (и только он), но ничего не печатал. После того, как я удалил встроенный initramfs, все заработало.

Связанный контент