Ядро не вызывает /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.

  1. 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
  2. initramfs - это архив cpio, который извлекается ядром в tmpfs. Ядро вызывает /init, который отвечает за монтирование реального корня и выполнение реального /sbin/init (возможно через switch_root утилита, которая очищает tmpfs).

Кроме того, вы можете зайти на страницу Inittoofs вики Gentoo для получения дополнительной информации.

Как насчет /etc/inittab? Вы инициализировали консоль в этом файле? Может быть, tty init просто пропустил. можешь показать?

Двоичный файл оболочки должен быть статическим. В противном случае /lib должен присутствовать в RAMFS.

Другие вопросы по тегам