Linux

為什麼 /proc 不能成為 linux 上覆蓋文件系統(overlayfs)的一層?

  • June 20, 2017

在linux上執行以下命令(4.4.59和4.9.8測試過)會失敗:

mkdir -p /tmp/proc
mount -t overlay overlay -o lowerdir=/proc:/tmp/proc /tmp/proc

並且有一條錯誤消息dmesg

overlayfs: maximum fs stacking depth exceeded

為什麼不能/proc成為覆蓋文件系統的一層?

如果我/proc/devor替換/sys,它會毫無問題地安裝,所以 . 似乎有一些特別之處/proc

PS 案例是創建一個更安全的環境,chroot我想在. 有 2 種已知的解決方法:/dev``/sys``/proc``chroot

  1. 只讀綁定掛載。限制是兩個命令而不是一個必需的。
  2. 只讀特殊掛載:mount -t proc -o ro none /tmp/proc. 限制是子掛載沒有自動映射。

無論如何,我仍然很好奇為什麼/dev並且/sys可以很好地使用覆蓋但/proc沒有。

問題是從 stackoverflow遷移而來的。

https://github.com/torvalds/linux/commit/e54ad7f1ee263ffa5a2de9c609d58dfa27b21cd9

   /*
    * procfs isn't actually a stacking filesystem; however, there is
    * too much magic going on inside it to permit stacking things on
    * top of it
    */
s->s_stack_depth = FILESYSTEM_MAX_STACK_DEPTH;

這可能不是一個非常有用的答案,但核心開發人員特別不支持它。

Grepping for “depth” in/usr/src/linux/fs/overlayfs發現它只是對目前堆疊深度的簡單檢查FILESYSTEM_MAX_STACK_DEPTH。在包含文件中搜尋,發現FILESYSTEM_MAX_STACK_DEPTH定義為 2 in /usr/src/linux/include/linux/fs.h. 評論說

fs 堆棧的最大層數。需要限制以防止核心堆棧溢出

顯然,因為proc-filesystem 與devor相比增加了另一層間接性sys,所以您超過了堆疊深度。我看不出它不能堆疊更深的任何明顯原因,所以嘗試增加FILESYSTEM_MAX_STACK_DEPTH,重新編譯你的核心,看看它是否有效。這可能會導致核心使用更多堆棧,因此通常會使用更多記憶體,並且可能會使其變慢 - 我不知道有關實現的細節。

編輯以回應評論

我的猜測是proc文件系統必須跟踪每個模組的文件,因此它可以在刪除模組時刪除它們。基本上它是所有模組的覆蓋文件系統。但是我必須詳細閱讀原始碼以驗證這一點(您也可以閱讀原始碼。:-)。

堆疊深度在stack_depth超級塊結構的領域,所以為了展示它,你需要一些訪問核心資料結構的方法。我想一些核心調試工具可以做到這一點(或者你總是可以編寫一個核心擴展/模組來顯示它),但我不知道任何具體的方法。

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