基于 Busybox 的嵌入式 Linux 发行版中没有 /proc

基于 Busybox 的嵌入式 Linux 发行版中没有 /proc

我正在制作一个嵌入式 Linux 发行版,我的主板是 Raspberry Pi。我的内核版本是3.2.27,没有initramfs,我的根文件系统如下:

/lib                          /* contains kernel modules */
/bin /sbin /usr/bin /usr/sbin /* contains busybox utils binaries */
/usr/lib                      /* contains cross-compiler tool chain libs */
linuxrc                       /* generated by busybox, kept in / */
/dev                          /* I have created console and ttyAM0 manually but added mode devices by udev */
/etc/init.d/rcS               /* required by busybox init */

内核启动后,我得到一个控制台(我不知道它是否是 busybox 控制台)。我有以下几个问题

  • 没有可用的进程信息(在 下没有创建文件/文件夹/proc)。
  • 当我使用时ps -e它没有显示任何内容。

为什么会发生这种意想不到的行为?

答案1

初始化并挂载根文件系统后,Linux 启动/sbin/init,进行用户空间初始化,包括挂载/proc

很可能您的配置rcS或任何配置init读取都不会执行此操作,您需要告诉它这样做。

如果您有 shell 提示,您可以/proc使用以下命令手动安装:

mount -t proc p /proc

请注意,该/proc目录必须存在,然后才能在其中挂载某些内容。您应该将其包含在您的根映像中。

答案2

2) 很可能是因为 1) -ps用于/proc获取有关正在运行的进程的信息。

1) 要么是因为初始化预计不会执行此操作,要么是因为初始化失败。检查分布是什么应该to do on boot - 系统如何启动。

您可以尝试的事情:

  • mount /proc,例如:mount -t proc proc /proc- 第二个参数是任意的(它显示为安装的源)。检查 PID=1 正在运行的内容

  • 检查/proc/cmdline内核在启动时接收到的参数。如果它包含,init=...您可能需要将其更改为例如/sbin/init或将其删除,以使内核尝试解析要自行运行的 init 。您必须在引导加载程序配置中执行此操作(对于 R-Pi,这是在 SD 卡 IIRC 上的某个文本文件中)。

  • 检查所需的 init 可执行文件是否存在 - Busybox 通常有大量指向其二进制文件的符号链接,以便可以使用command [args]而不是busybox command [args].你可能会错过那些。

答案3

首先将其安装在您的/etc/inittab

也就是说,您inittab应该从以下开始:

::sysinit:/bin/mount -t proc proc /proc

这是由 Buildroot 2017.02 完成的。

答案4

我在一个极其简陋的 Linux 容器上遇到了这个问题。我发现ps(和其他事情)在容器的初始启动时不起作用,但如果重新启动容器,一切都很好。

我的容器映像不包含空/proc目录,因此 busybox 没有地方可以挂载 proc 文件系统。然而,它确实是后来创建的(我认为 busybox 在某个时候创建​​了它),这意味着它在后续重新启动时存在,并且允许它成功挂载。

我重新创建了我的图像以包含在内/proc,之后一切正常。

因此,根文件系统似乎必须包含一个/proc供 busybox 挂载的目录。似乎不需要进一步的操作(手动安装、inittab 条目等)(至少在容器中)。

一个不一致之处是 busybox 似乎很乐意创建它需要挂载的类似目录,例如/sys.

相关内容