文章目錄
- 簡介
- 1. /proc/sys/fs/文檔
- aio-nr & aio-max-nr
- dentry-state
- dquot-max & dquot-nr
- file-max & file-nr
- nr_open
- inode-max, inode-nr & inode-state
- overflowgid & overflowuid
- pipe-user-pages-hard
- pipe-user-pages-soft
- protected_fifos
- protected_hardlinks
- protected_regular
- protected_symlinks
- suid_dumpable
- super-max & super-nr
- mount-max
- 2. /proc/sys/fs/mqueue - POSIX 消息隊列文件系統
- 3. /proc/sys/fs/epoll - epoll接口的配置選項
- 參考文檔
簡介
Sysctl是在運行時配置內核某些方面的一種方法(可參考sysctl man手冊中文譯文),並且/proc/sys/目錄就在那裏,這樣您甚至不需要特殊的工具來完成它!實際上,使用這些配置工具只需要四件事:
- 運行中的Linux系統
- root 權限
- 常識(這很難做到)
- 瞭解所有這些值的含義
正如快速的“ls /proc/sys”將顯示的那樣,該目錄由幾個子目錄組成。每個子目錄是內核的一部分,因此您可以逐個進行配置,也可以僅進行一些“主題化”。
本文檔是關於:
目錄 | 內容 |
---|---|
abi/ | 執行域和個性化 |
debug/ | <empty> |
dev/ | 設備特定信息 (例如 dev/cdrom/info) |
fs/ | 指定文件系統的文件句柄,inode,目錄項和配額調整 |
kernel/ | 全局內核信息/調整雜項內容 |
net/ | 網絡資料 |
proc/ | <empty> |
sunrpc/ | SUN 遠程過程調用 (NFS) |
vm/ | 內存管理調整緩衝區和緩存管理 |
user/ | 用戶和用戶名空間限制 |
這些是我係統上的子目錄。在另一個設置中可能存在更多或其他子目錄。(原文發佈於2003年,所以發展到現在,已經沒有proc目錄了,多了crypto目錄,一個加密框架,爲內核的不同部分處理密碼)
1. /proc/sys/fs/文檔
此目錄中的文件可用於優化和監視Linux內核操作中的雜項和常規內容。由於某些文件可以用來破壞系統,因此在實際進行調整之前,最好先閱讀文檔和源代碼。
aio-nr & aio-max-nr
aio_nr是io_setup系統調用上所有當前活動aio上下文的事件總數。如果aio_nr達到aio_max_nr,則io_setup將失敗,並顯示EAGAIN。請注意,提高aio_max_nr不會導致預分配或重新調整任何內核數據結構的大小。
關於異步I/O,有很多大神寫了很多出色文章,其中一篇:
https://www.ibm.com/developerworks/cn/linux/l-async/index.html
dentry-state
linux/include/linux/dcache.h中:
struct dentry_stat_t dentry_stat {
int nr_dentry;
int nr_unused;
int age_limit; /* age in seconds */
int want_pages; /* pages requested by system */
int nr_negative; /* # of unused negative dentries */
int dummy; /* Reserved for future use */
};
目錄項(dentry)是動態分配和釋放的。
nr_dentry顯示已分配的目錄項總數(活動+未使用)。nr_unused顯示未主動使用但保存在LRU列表中以備將來使用的目錄項數量。
Age_limit是年齡(以秒爲單位),當內存不足且調用了rinkle_dcache_pages()並且尚未修剪dcache時,可以收回dcache條目的年齡(秒)。
nr_negative顯示未使用的目錄項,它們也是未映射到任何文件的目錄項。它們有助於加速拒絕用戶提供的不存在的文件。
dquot-max & dquot-nr
dquot-max文件顯示了緩存磁盤配額條目的最大數量。
dquot-nr文件顯示分配的磁盤配額項數和可用磁盤配額項數。
如果可用緩存磁盤配額非常低,並且同時有大量系統用戶,則可能需要提高限制。
file-max & file-nr
file-max中的值表示Linux內核將分配的最大文件句柄數。當您收到許多有關文件句柄用盡的錯誤消息時,您可能需要增加此限制。
歷史上,內核能夠動態分配文件句柄,但不能再次釋放它們。file-nr中的三個值表示已分配的文件句柄數,已分配但未使用的文件句柄數以及最大文件句柄數。Linux 2.6的空閒文件句柄數始終報告爲0,這不是錯誤,這僅表示分配的文件句柄數與使用的文件句柄數完全匹配。
# cat /proc/sys/fs/file-nr
6272 0 94311
nr_open
這表示進程可以分配的文件句柄的最大數目。默認值是1024*1024(1048576),這對於大多數機器來說應該足夠了。實際限制取決於RLIMIT_NOFILE資源限制。
inode-max, inode-nr & inode-state
與文件句柄一樣,內核會動態分配inode結構,但還不能釋放它們。
inode-max中的值表示最大inode處理程序數。該值應比file-max中的值大3-4倍,因爲標準輸入,標準輸出和網絡套接字還需要一個inode結構來處理它們。當您經常用盡inode時,您需要增加此值。
文件inode-nr包含inode-state中的前兩項,因此我們可以忽略該文件。
Inode-state包含三個實際數字和四個虛擬變量。實際數字按出現順序爲nr_inodes,nr_free_inodes和preshrink。
nr_inodes代表系統已分配的inode數量,這可能比inode-max略多,因爲Linux一次將它們分配一個頁面。
nr_free_inodes表示空閒索引節點(?)的數量,並且當nr_inodes> inode-max且系統需要修剪索引節點列表而不分配更多資源時,預收縮不爲零。
overflowgid & overflowuid
某些文件系統僅支持16位UID和GID,在Linux中UID和GID是32位。在啓用了寫入功能的情況下掛載這些文件系統之一時,任何超過65535的UID或GID都會在寫入磁盤之前轉換爲固定值。
這些系統允許您更改固定UID和GID的值。默認值爲65534。
pipe-user-pages-hard
非特權用戶可以分配給管道的最大頁面總數。一旦達到此限制,就無法分配新管道,直到使用量再次低於該限制。設置爲0時,不應用限制,這是默認設置。
pipe-user-pages-soft
在管道大小限制爲單個頁面之前,非特權用戶可以爲管道分配的最大頁面總數。一旦達到此限制,該用戶的新管道將被限制爲單個頁面大小,以限制總內存使用量,並且嘗試使用fcntl()增加它們的操作將被拒絕,直到使用量再次低於該限制爲止。默認值允許以默認大小分配最多1024個管道(現在是16384了)。設置爲0時,不應用限制。
protected_fifos
這種保護的目的是避免意外地寫入攻擊者控制的FIFO,在該FIFO中程序應會創建常規文件。
當設置爲“ 0”時,寫入FIFO是不受限制的。
當設置爲“1”時,不允許O_create在管道上打開不屬於我們的可寫粘性目錄,它們屬於目錄所有者。
設置爲“ 2”時,它也適用於組可寫粘性目錄。
此保護基於Openwall中的限制。
protected_hardlinks
一類長期存在的安全問題是基於硬鏈接的“檢查時間使用時間”競賽,在/tmp等可寫目錄中最常見。利用此缺陷的常用方法是在遵循給定的硬鏈接時(即,根進程遵循由另一個用戶創建的硬鏈接)跨越特權邊界。此外,在沒有獨立分區的系統上,這將阻止未經授權的用戶“鎖定”易受攻擊的setuid/setgid文件,以防管理員升級或鏈接到特殊文件。
設置爲“ 0”時,硬鏈接創建行爲不受限制。
設置爲“ 1”時,如果用戶尚未擁有源文件或沒有對源文件的讀取/寫入權限,則無法創建硬鏈接。
此保護基於Openwall和grsecurity中的限制。
protected_regular
這種保護類似於protected_fifos,但它避免寫入攻擊者控制的常規文件,而程序將在該文件中創建一個文件。
設置爲“ 0”時,寫入常規文件不受限制。
設置爲“ 1”時,不允許O_CREAT在可寫粘性目錄中打開不屬於我們的常規文件,除非是目錄所有者。
設置爲“ 2”時,它也適用於組可寫粘性目錄。
protected_symlinks
一類長期存在的安全問題是基於符號鏈接的“檢查時間使用時間”競賽,在/tmp等可寫目錄中最常見。利用此缺陷的常用方法是在遵循給定的符號鏈接時(即,根進程遵循屬於另一個用戶的符號鏈接)跨越特權邊界。
當設置爲“ 0”時,符號鏈接跟隨行爲不受限制。
當設置爲“ 1”時,僅當在粘性可寫目錄之外,或者符號鏈接和跟隨者的uid匹配,或者目錄所有者與符號鏈接的所有者匹配時,才允許跟隨符號鏈接。
此保護基於Openwall和grsecurity中的限制。
suid_dumpable
此值可用於查詢和設置setuid或其他protected/tainted二進制文件的核心轉儲模式。
0 | (default) | 傳統行爲。任何更改了特權級別或僅執行的進程都不會被轉儲。 |
---|---|---|
1 | (debug) | 所有進程都在可能的情況下轉儲核心。核心轉儲由當前用戶擁有,不應用安全性。這僅用於系統調試情況。Ptrace不進行檢查。這是不安全的,因爲它允許普通用戶檢查特權進程的內存內容。 |
2 | (suidsafe) | 通常不會轉儲的任何二進制文件都會被轉儲,但前提是“core_pattern”內核sysctl設置爲管道處理程序或完全限定的路徑。當管理員試圖在正常環境中調試問題,並且有一個知道如何小心處理特權核心轉儲的核心轉儲管道處理程序,或者定義了用於捕獲核心轉儲的特定目錄時,此模式適用。如果在沒有管道處理程序或完全限定路徑的情況下發生核心轉儲,將向syslog發出一條消息,警告缺少正確的設置。 |
super-max & super-nr
這些數字控制超級塊的最大數量,從而控制內核可以具有的已掛載文件系統的最大數量。僅當您需要裝載比super-max中的當前值允許更多的文件系統時,才需要增加super-max。
mount-max
這表示在掛載域中可能存在的最大掛載數量。
2. /proc/sys/fs/mqueue - POSIX 消息隊列文件系統
消息隊列文件系統提供了必要的內核特性,可以創建用戶空間庫,實現POSIX消息隊列API。
消息隊列文件系統包含用於確定/設置文件系統使用資源量的值。
/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。
3. /proc/sys/fs/epoll - epoll接口的配置選項
max_user_watches
每個epoll文件描述符都可以存儲許多要監視的事件就緒性文件。這些受監視文件中的每個文件都構成一個“監視”。此配置選項設置每個用戶允許的“監視”的最大數量。每個“監視”在32位內核上的成本約爲90字節,在64位內核上的成本約爲160字節。max_user_watches的當前默認值是可用低內存的1/32,除以“監視”成本(以字節爲單位)。
在翻譯這篇的時候,我心情大概是醬紫滴:
參考文檔
https://www.kernel.org/doc/html/latest/admin-guide/sysctl/index.html
https://juejin.im/post/5d19820c6fb9a07ea42094e2
https://en.wikipedia.org/wiki/Asynchronous_I/O