/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_inodesnr_free_inodespreshrink

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_regular

此保护类似于 protected_fifos,但它避免了程序预期创建常规文件时,写入攻击者控制的常规文件。

设置为“0”时,写入常规文件不受限制。

设置为“1”时,不允许在全局可写粘滞目录中,对非我们拥有的常规文件进行 O_CREAT 打开操作,除非它们由目录所有者拥有。

设置为“2”时,也适用于组可写粘滞目录。

suid_dumpable

此值可用于查询和设置 setuid 或其他受保护/污染二进制文件的核心转储模式。模式如下:

0

(默认)

传统行为。任何已更改特权级别或仅可执行的进程将不会被转储。

1

(调试)

所有进程尽可能地转储核心。核心转储由当前用户拥有,不应用任何安全措施。这仅适用于系统调试情况。Ptrace 不受检查。这是不安全的,因为它允许普通用户检查特权进程的内存内容。

2

(suidsafe)

任何通常不会被转储的二进制文件都会被转储,但仅当 core_pattern 内核 sysctl(参见 Documentation/admin-guide/sysctl/kernel.rst)设置为管道处理程序或完全限定路径时。(有关此限制的更多详细信息,请参阅 CVE-2006-2451。)此模式适用于管理员尝试在正常环境中调试问题,并且具有能够谨慎处理特权核心转储的核心转储管道处理程序,或已定义用于捕获核心转储的特定目录。如果发生核心转储而没有管道处理程序或完全限定路径,则会向 syslog 发出一条消息,警告缺少正确的设置。

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_timeoutdefault_request_timeout 设置为大于 max_request_timeout 的值,系统将使用 max_request_timeout 作为超时。0 表示没有最大请求超时。可以设置的最大值为 65535。

对于超时,如果服务器未在设定的超时时间内响应请求,则与 FUSE 服务器的连接将被中止。请注意,超时并非 100% 精确(例如,您可能设置 60 秒,但超时可能在 70 秒后启动)。超时的上限误差大约为 FUSE_TIMEOUT_TIMER_FREQ 秒。