文章目录
简介
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