
Я пытаюсь запустить самокомпилированное ядро вместе с 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, все заработало.