Ядро не вызывает /init скрипт на initrd
Каждый. Я работаю над своим первым встроенным Linux, и я хотел бы получить хороший загрузчик. Я решил использовать initrd, чтобы запустить его как можно раньше, но похоже, что ядро не вызывает скрипт / init. Он монтирует мой RAM-диск и продолжает обычную последовательность загрузки.
<5>RAMDISK: squashfs filesystem found at block 0
<5>RAMDISK: Loading 16643KiB [1 disk] into ram disk...
<6>VFS: Mounted root (squashfs filesystem) readonly on device 1:0.
<6>kjournald starting. Commit interval 5 seconds
<6>EXT3-fs (mmcblk0p1): using internal journal
<6>EXT3-fs (mmcblk0p1): mounted filesystem with ordered data mode
<6>VFS: Mounted root (ext3 filesystem) on device 179:1.
<5>Trying to move old root to /initrd ... okay
<6>devtmpfs: mounted
<6>Freeing init memory: 180K
<30>udevd[79]: starting version 182
Я безуспешно пробовал все известные мне способы отладки, чтобы проверить, вызывается ли скрипт. Я не получаю ошибки вообще. После входа в систему я вижу диск RAM, смонтированный в / initrd, как и предполагалось.
Я использую Cubieboard 2 с драйверами и ядром (3.4), предоставленными сообществом. Я знаю, что это старая версия, но это лучшая поддержка для Sunxi SoC. Я также использую обе файловые системы (rootfs и initramfs), предоставляемые Linaro в качестве базы.
Кто-нибудь может мне помочь?
Спасибо.
2 ответа
Краткий ответ: я думаю, вам нужно использовать /linuxrc
или же /sbin/init
вместо /init
, Или лучше используйте initramfs вместо initrd.
Длинный ответ
/init
используется в случае initramfs, когда кажется, что вы используете initrd (из-за загрузки в него образа ramdisk и squashfs).
Существует три варианта получения раннего пространства пользователя и монтирования корневой файловой системы: 2 с initrd и 1 с initramfs.
- initrd - это образ файловой системы (ext[234], squashfs и т. д.), который копируется ядром в ramdisk (/ dev / ram *).
- (устарело) Ядро монтирует виртуальный диск, вызывает
/linuxrc
;/linuxrc
загружает необходимые модули, пишет в/proc/sys/kernel/real-root-dev
и выходит. Затем ядро монтирует настоящий корень и вызывает реальный/sbin/init
- Ядро монтирует рамдиск, вызывает
/sbin/init
;/sbin/init
монтирует настоящий рут, звонитpivot_root
, настоящий реал/sbin/init
- (устарело) Ядро монтирует виртуальный диск, вызывает
- initramfs - это архив cpio, который извлекается ядром в tmpfs. Ядро вызывает
/init
, который отвечает за монтирование реального корня и выполнение реального/sbin/init
(возможно черезswitch_root
утилита, которая очищает tmpfs).
Кроме того, вы можете зайти на страницу Inittoofs вики Gentoo для получения дополнительной информации.
Как насчет /etc/inittab? Вы инициализировали консоль в этом файле? Может быть, tty init просто пропустил. можешь показать?
Двоичный файл оболочки должен быть статическим. В противном случае /lib должен присутствовать в RAMFS.