Linux

在基於 Busybox 的嵌入式 Linux 發行版中沒有 /proc

  • February 29, 2020

我正在製作嵌入式 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它時,它什麼也沒顯示。

為什麼會發生這種意外行為?

初始化並掛載根文件系統後,Linux 啟動/sbin/init並進行使用者空間初始化,包括掛載/proc

很可能您的rcS或讀取的任何配置init都不會這樣做,您需要告訴它。

如果你有一個 shell 提示,你可以/proc手動掛載:

mount -t proc p /proc

請注意,該/proc目錄必須存在,然後才能在其中掛載某些內容。您應該將它包含在您的根映像中。

  1. 很可能是因為 1) -ps用於/proc獲取有關正在執行的程序的資訊。

  2. 要麼是因為初始化不應該這樣做,要麼是因為它沒有這樣做。檢查發行版在啟動時應該做什麼——如何啟動系統。

你可以嘗試的事情:

  • mount /proc,例如:mount -t proc proc /proc- 第二個參數是任意的(它顯示為掛載的來源)。檢查 PID=1 的執行情況
  • 檢查/proc/cmdline核心在啟動時收到的參數。如果它包含init=...您可能需要將其更改為 eg/sbin/init或刪除它以讓核心嘗試解析 init 以自行執行。您必須在引導載入程序配置中執行此操作(對於 R-Pi,這是在 SD 卡 IIRC 上的某個文本文件中)。
  • 檢查所需的 init 執行檔是否存在 - Busybox 通常有大量指向其二進製文件的符號連結,因此可以使用command [args]而不是busybox command [args]. 你可能會錯過那些。

引用自:https://unix.stackexchange.com/questions/59917