/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 秒。