/proc/sys/fs/ 的文件¶
Copyright (c) 1998, 1999, Rik van Riel <riel@nl.linux.org>
Copyright (c) 2009, Shen Feng<shen@cn.fujitsu.com>
有關一般資訊和法律宣告,請參閱 intro.rst。
此檔案包含 /proc/sys/fs/ 中 sysctl 檔案和目錄的文件。
此目錄中的檔案可用於調整和監控 Linux 核心執行中的雜項和通用設定。由於其中一些檔案可能會破壞您的系統,因此在實際調整之前,建議您閱讀文件和原始碼。
1. /proc/sys/fs¶
目前,這些檔案可能會(取決於您的配置)出現在 /proc/sys/fs 中
aio-nr & aio-max-nr¶
aio-nr 顯示當前系統範圍內的非同步 I/O 請求數量。aio-max-nr 允許您更改 aio-nr 可以增長到的最大值。如果 aio-nr 達到 aio-nr-max,則 io_setup 將以 EAGAIN 失敗。請注意,提高 aio-max-nr 不會導致預分配或重新調整任何核心資料結構。
dentry-negative¶
負 dentry 的策略。設定為 1 表示在檔案被刪除時始終刪除 dentry,0 表示停用。預設情況下,此行為是停用的。
dentry-state¶
此檔案顯示 struct dentry_stat_t 中的值,其定義在 fs/dcache.c 中。
struct dentry_stat_t dentry_stat {
long nr_dentry;
long nr_unused;
long age_limit; /* age in seconds */
long want_pages; /* pages requested by system */
long nr_negative; /* # of unused negative dentries */
long dummy; /* Reserved for future use */
};
dentry 是動態分配和釋放的。
nr_dentry 顯示分配的 dentry 總數(活動 + 未使用)。nr_unused 顯示未積極使用但儲存在 LRU 列表中以供將來重用的 dentry 數量。
age_limit 是 dcache 條目在記憶體不足時可以回收的秒數,而當 shrink_dcache_pages() 已被呼叫且 dcache 尚未修剪時,want_pages 為非零。
nr_negative 顯示未使用的 dentry 中也是負 dentry 的數量,它們不對映到任何檔案。相反,它們有助於加快使用者提供的非現有檔案的拒絕速度。
file-max & file-nr¶
file-max 中的值表示 Linux 核心將分配的檔案控制代碼的最大數量。當您收到大量關於檔案控制代碼耗盡的錯誤訊息時,您可能需要增加此限制。
歷史上,核心能夠動態分配檔案控制代碼,但無法再次釋放它們。file-nr 中的三個值分別表示已分配的檔案控制代碼數量、已分配但未使用的檔案控制代碼數量以及檔案控制代碼的最大數量。Linux 2.6 及更高版本始終將 0 報告為可用檔案控制代碼的數量——這不是一個錯誤,它只表示已分配的檔案控制代碼數量與已使用的檔案控制代碼數量完全匹配。
嘗試分配超過 file-max 的檔案描述符會透過 printk 報告,請在核心日誌中查詢
VFS: file-max limit <number> reached
在核心日誌中。
inode-nr & inode-state¶
與檔案控制代碼一樣,核心動態分配 inode 結構,但尚無法釋放它們。
檔案 inode-nr 包含 inode-state 中的前兩項,所以我們跳到那個檔案……
inode-state 包含三個實際數字和四個佔位符。實際數字按出現順序為 nr_inodes、nr_free_inodes 和 preshrink。
nr_inodes 表示系統已分配的 inode 數量。
nr_free_inodes 表示空閒 inode 的數量(?),而 preshrink 在系統需要修剪 inode 列表而不是分配更多 inode 時為非零。
mount-max¶
這表示一個掛載名稱空間中可能存在的最大掛載數量。
nr_open¶
這表示一個程序可以分配的最大檔案控制代碼數量。預設值為 1024*1024 (1048576),這對於大多數機器來說應該足夠了。實際限制取決於 RLIMIT_NOFILE 資源限制。
overflowgid & overflowuid¶
一些檔案系統只支援 16 位 UID 和 GID,儘管在 Linux 中 UID 和 GID 是 32 位的。當這些檔案系統之一以寫入啟用方式掛載時,任何超出 65535 的 UID 或 GID 在寫入磁碟之前都會被轉換為一個固定值。
這些 sysctl 允許您更改固定 UID 和 GID 的值。預設值為 65534。
pipe-user-pages-hard¶
非特權使用者可以為管道分配的最大總頁數。一旦達到此限制,在用量低於限制之前,將無法分配新的管道。設定為 0 時,不應用任何限制,這是預設設定。
pipe-user-pages-soft¶
非特權使用者為管道分配的最大總頁數,超過此限制後管道大小將被限制為單頁。一旦達到此限制,新管道的大小將限制為該使用者的單頁,以限制總記憶體使用量,並且嘗試使用 fcntl() 增加管道大小將被拒絕,直到用量再次低於限制。預設值允許分配最多 1024 個預設大小的管道。設定為 0 時,不應用任何限制。
protected_fifos¶
此保護的目的是避免程式預期建立常規檔案時,意外寫入攻擊者控制的 FIFO。
設定為“0”時,寫入 FIFO 不受限制。
設定為“1”時,不允許在全域性可寫粘滯目錄中,對非我們擁有的 FIFO 進行 O_CREAT 開啟操作,除非它們由目錄所有者擁有。
設定為“2”時,也適用於組可寫粘滯目錄。
此保護基於 Openwall 中的限制。
protected_hardlinks¶
長期存在的一類安全問題是基於硬連結的“檢查時與使用時”競爭條件,最常見於像 /tmp 這樣的全域性可寫目錄中。這種缺陷的常見利用方法是在跟隨給定硬連結時跨越許可權邊界(即,一個 root 程序跟隨另一個使用者建立的硬連結)。此外,在沒有分離分割槽的系統上,這阻止了未經授權的使用者“固定”易受攻擊的 setuid/setgid 檔案,使其不被管理員升級,或連結到特殊檔案。
設定為“0”時,硬連結建立行為不受限制。
設定為“1”時,如果使用者不擁有原始檔,或對其沒有讀/寫許可權,則無法建立硬連結。
此保護基於 Openwall 和 grsecurity 中的限制。
protected_regular¶
此保護類似於 protected_fifos,但它避免了程式預期建立常規檔案時,寫入攻擊者控制的常規檔案。
設定為“0”時,寫入常規檔案不受限制。
設定為“1”時,不允許在全域性可寫粘滯目錄中,對非我們擁有的常規檔案進行 O_CREAT 開啟操作,除非它們由目錄所有者擁有。
設定為“2”時,也適用於組可寫粘滯目錄。
protected_symlinks¶
長期存在的一類安全問題是基於符號連結的“檢查時與使用時”競爭條件,最常見於像 /tmp 這樣的全域性可寫目錄中。這種缺陷的常見利用方法是在跟隨給定符號連結時跨越許可權邊界(即,一個 root 程序跟隨另一個使用者擁有的符號連結)。有關多年來數百個可能不完整的例子列表,請參閱:https://cve.mitre.org/cgi-bin/cvekey.cgi?keyword=/tmp
設定為“0”時,符號連結跟隨行為不受限制。
設定為“1”時,符號連結僅允許在粘滯的全域性可寫目錄外部跟隨,或者當符號連結和跟隨者的 UID 匹配時,或者當目錄所有者與符號連結的所有者匹配時。
此保護基於 Openwall 和 grsecurity 中的限制。
suid_dumpable¶
此值可用於查詢和設定 setuid 或其他受保護/汙染二進位制檔案的核心轉儲模式。模式如下:
0 |
(預設) |
傳統行為。任何已更改特權級別或僅可執行的程序將不會被轉儲。 |
1 |
(除錯) |
所有程序儘可能地轉儲核心。核心轉儲由當前使用者擁有,不應用任何安全措施。這僅適用於系統除錯情況。Ptrace 不受檢查。這是不安全的,因為它允許普通使用者檢查特權程序的記憶體內容。 |
2 |
(suidsafe) |
任何通常不會被轉儲的二進位制檔案都會被轉儲,但僅當 |
2. /proc/sys/fs/binfmt_misc¶
/proc/sys/fs/binfmt_misc 中檔案的文件位於 核心對雜項二進位制格式的支援 (binfmt_misc)。
3. /proc/sys/fs/mqueue - POSIX 訊息佇列檔案系統¶
“mqueue”檔案系統提供了必要的核心功能,以實現一個使用者空間庫,該庫實現了 POSIX 訊息佇列 API(如 POSIX 1003.1-2001 版本系統介面規範中的 MSG 標籤所指出)。
“mqueue”檔案系統包含用於確定/設定檔案系統所用資源量的值。
/proc/sys/fs/mqueue/queues_max 是一個讀/寫檔案,用於設定/獲取系統上允許的最大訊息佇列數。
/proc/sys/fs/mqueue/msg_max 是一個讀/寫檔案,用於設定/獲取佇列中訊息的最大數量。實際上,它是 mq_open 呼叫中設定的另一個(使用者)限制的限制值。佇列的此屬性必須小於或等於 msg_max。
/proc/sys/fs/mqueue/msgsize_max 是一個讀/寫檔案,用於設定/獲取最大訊息大小值(它是每個訊息佇列的屬性,在建立時設定)。
/proc/sys/fs/mqueue/msg_default 是一個讀/寫檔案,用於設定/獲取佇列中訊息的預設數量,如果 mq_open(2) 的 attr 引數為 NULL。如果它超過 msg_max,預設值將初始化為 msg_max。
/proc/sys/fs/mqueue/msgsize_default 是一個讀/寫檔案,用於設定/獲取預設訊息大小值,如果 mq_open(2) 的 attr 引數為 NULL。如果它超過 msgsize_max,預設值將初始化為 msgsize_max。
4. /proc/sys/fs/epoll - epoll 介面的配置選項¶
此目錄包含 epoll(7) 介面的配置選項。
max_user_watches¶
每個 epoll 檔案描述符可以儲存多個檔案以監視事件就緒性。每個受監視的檔案都構成一個“監視器”。此配置選項設定每個使用者允許的最大“監視器”數量。在 32 位核心上,每個“監視器”大約消耗 90 位元組,在 64 位核心上大約消耗 160 位元組。max_user_watches 的當前預設值是可用低記憶體的 4%,除以“監視器”的位元組成本。
5. /proc/sys/fs/fuse - FUSE 檔案系統的配置選項¶
此目錄包含 FUSE 檔案系統的以下配置選項
/proc/sys/fs/fuse/max_pages_limit 是一個讀/寫檔案,用於設定/獲取在 FUSE 中用於服務請求的最大頁數。
/proc/sys/fs/fuse/default_request_timeout 是一個讀/寫檔案,用於設定/獲取 FUSE 伺服器在掛載時未指定超時的情況下,回覆核心發出的請求的預設超時時間(秒)。如果伺服器設定了超時,則 default_request_timeout 將被忽略。default_request_timeout 的預設值設定為 0。0 表示沒有預設超時。可以設定的最大值為 65535。
/proc/sys/fs/fuse/max_request_timeout 是一個讀/寫檔案,用於設定/獲取 FUSE 伺服器回覆核心發出的請求的最大超時時間(秒)。大於 0 的值會自動使伺服器選擇一個超時,該超時將最多設定為 max_request_timeout,即使伺服器未指定超時且 default_request_timeout 設定為 0。如果 max_request_timeout 大於 0 且伺服器設定的超時大於 max_request_timeout 或 default_request_timeout 設定為大於 max_request_timeout 的值,系統將使用 max_request_timeout 作為超時。0 表示沒有最大請求超時。可以設定的最大值為 65535。
對於超時,如果伺服器未在設定的超時時間內響應請求,則與 FUSE 伺服器的連線將被中止。請注意,超時並非 100% 精確(例如,您可能設定 60 秒,但超時可能在 70 秒後啟動)。超時的上限誤差大約為 FUSE_TIMEOUT_TIMER_FREQ 秒。