Busybox init无法启动/etc/init.d/rcS

时间:2014-11-26 07:58:21

标签: linux busybox buildroot

我正在尝试使用buildroot构建嵌入式系统。一切似乎都有效。所有模块都启动,系统稳定。问题是/etc/init.d/rcS在系统初始化期间没有启动。如果我手动运行它一切正常。我在我的inittab文件中有它。

# /etc/inittab
#
# Copyright (C) 2001 Erik Andersen <andersen@codepoet.org>
#
# Note: BusyBox init doesn't support runlevels.  The runlevels field is
# completely ignored by BusyBox init. If you want runlevels, use
# sysvinit.
#
# Format for each entry: <id>:<runlevels>:<action>:<process>
#
# id        == tty to run on, or empty for /dev/console
# runlevels == ignored
# action    == one of sysinit, respawn, askfirst, wait, and once
# process   == program to run

# Startup the system
null::sysinit:/bin/mount -t proc proc /proc
null::sysinit:/bin/mount -o remount,rw /
null::sysinit:/bin/mkdir -p /dev/pts
null::sysinit:/bin/mkdir -p /dev/shm
null::sysinit:/bin/mount -a
null::sysinit:/bin/hostname -F /etc/hostname
# now run any rc scripts
::sysinit:/etc/init.d/rcS

# Put a getty on the serial port
ttyFIQ0::respawn:/sbin/getty -L -n ttyFIQ0 115200 vt100 # GENERIC_SERIAL

# Stuff to do for the 3-finger salute
::ctrlaltdel:/sbin/reboot

# Stuff to do before rebooting
null::shutdown:/etc/init.d/rcK
null::shutdown:/bin/umount -a -r
null::shutdown:/sbin/swapoff -a

知道可能出现什么问题吗?

4 个答案:

答案 0 :(得分:2)

  1. / bin / init 需要在您的文件系统上。
  2. / bin / sh 需要在您的文件系统上。
  3. /etc/init.d/rcS 需要可执行,并将#!/ bin / sh 作为第一行。

答案 1 :(得分:1)

初始化

您确定在哪里调用Busybox init吗?什么是内核命令行?如果没有为内核提供/init选项,内核将在/bin/busybox处查找可执行文件。

例如,如果您的busybox二进制文件位于ln -s /bin/busybox /init ,则需要创建以下符号链接:

/sbin

如果您希望您的init驻留在init=中,为了遵守inittab,还要在那里创建符号链接。请注意,如果您不挂载root并且busybox仅在initramfs中运行,则内核将不会尊重ln -s /bin/busybox /sbin/init 设置。

rcS

的Inittab

此外,您可以尝试不使用inittab。您尝试从inittab运行的内容可能非常适合# Note: BusyBox init works just fine without an inittab. If no inittab is # found, it has the following default behavior: # ::sysinit:/etc/init.d/rcS # ::askfirst:/bin/sh # ::ctrlaltdel:/sbin/reboot # ::shutdown:/sbin/swapoff -a # ::shutdown:/bin/umount -a -r # ::restart:/sbin/init # tty2::askfirst:/bin/sh # tty3::askfirst:/bin/sh # tty4::askfirst:/bin/sh 和任何后代脚本。从Change TextField's Underline in Flutter您找到了您的示例inittab:

/etc/init.d/rcS

rcS中

确保chmod +x chroot chroot /bin/busybox 可执行:

#!/bin/busybox sh
echo "Hello world!"

尝试:

quiet

请注意,这句话可能会隐藏在内核日志消息之间,因此您可能希望传递/etc/init.d/rcS内核命令行选项以查看它是否出现。

Busybox符号链接

符号链接是否已安装到文件系统中?如果不是,那不是灾难。确保#!/bin/busybox sh mkdir -pv /sbin /bin/busybox --install -s 以:

开头
TestNG testNG = new TestNG();
testNG.setTestClasses(YourTestClass.class);
testNG.run();

答案 2 :(得分:1)

除了脚本本身是可执行的并且具有正确的shebang行之外,还需要在启用CONFIG_BINFMT_SCRIPT选项的情况下编译内核。

CONFIG_BINFMT_SCRIPT:

Say Y here if you want to execute interpreted scripts starting with
#! followed by the path to an interpreter.

You can build this support as a module; however, until that module
gets loaded, you cannot run scripts.  Thus, if you want to load this
module from an initramfs, the portion of the initramfs before loading
this module must consist of compiled binaries only.

Most systems will not boot if you say M or N here.  If unsure, say Y.

如果没有此选项,您可能会收到错误消息can't run '/etc/init.d/rcS': Exec format error

答案 3 :(得分:0)

根据所提供的信息,一切看起来都是正确的。

有些事情要尝试:

检查rcS脚本的所有权。

评论rcS中的所有内容,并添加一些非常简单的内容:

回声&#34;这有效&#34; &GT;的/ tmp /测试

您的脚本中可能存在与启动竞争条件相关的导致其退出的内容。如果您的脚本正在启动syslogd,也很好奇。