為什麼 /proc 不能成為 linux 上覆蓋文件系統(overlayfs)的一層?
在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
用/dev
or替換/sys
,它會毫無問題地安裝,所以 . 似乎有一些特別之處/proc
。PS 案例是創建一個更安全的環境,
chroot
我想在. 有 2 種已知的解決方法:/dev``/sys``/proc``chroot
- 只讀綁定掛載。限制是兩個命令而不是一個必需的。
- 只讀特殊掛載:
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 與dev
or相比增加了另一層間接性sys
,所以您超過了堆疊深度。我看不出它不能堆疊更深的任何明顯原因,所以嘗試增加FILESYSTEM_MAX_STACK_DEPTH
,重新編譯你的核心,看看它是否有效。這可能會導致核心使用更多堆棧,因此通常會使用更多記憶體,並且可能會使其變慢 - 我不知道有關實現的細節。編輯以回應評論
我的猜測是
proc
文件系統必須跟踪每個模組的文件,因此它可以在刪除模組時刪除它們。基本上它是所有模組的覆蓋文件系統。但是我必須詳細閱讀原始碼以驗證這一點(您也可以閱讀原始碼。:-)。堆疊深度在
stack_depth
超級塊結構的領域,所以為了展示它,你需要一些訪問核心資料結構的方法。我想一些核心調試工具可以做到這一點(或者你總是可以編寫一個核心擴展/模組來顯示它),但我不知道任何具體的方法。