永久修改 Debian 12 的 ulimit 参数:解决重启后限制不生效问题
在 Linux 系统中,ulimit
是一个用于控制用户资源限制的重要工具。通过它,我们可以设置文件描述符数量、进程数、栈大小等资源限制。然而,在 Debian 12 中,许多用户发现即使修改了 /etc/security/limits.conf
,重启后 ulimit
的限制仍然恢复为默认值(如 1024
)。本文将详细介绍如何永久修改 ulimit
参数,并解决重启后限制不生效的问题。
问题背景
在 Debian 12 中,ulimit
的默认文件描述符限制通常为 1024
。对于需要高并发的应用(如 Web 服务器、数据库等),这个值显然不够。虽然可以通过修改 /etc/security/limits.conf
来调整限制,但在 systemd 系统中,这些设置可能会被覆盖,导致重启后限制失效。
此外,/etc/security/limits.conf
中的通配符 *
对 root
用户无效。这意味着即使你为所有用户设置了限制,root
用户的限制可能仍然保持不变。本文将解决这些问题,并确保 ulimit
参数永久生效。
解决方案
要永久修改 ulimit
参数并确保其生效,需要从以下几个方面入手:
1. 修改 /etc/security/limits.conf
这是传统的资源限制配置文件,适用于通过 PAM 登录的会话。使用 vi
编辑文件:
sudo vi /etc/security/limits.conf
添加以下内容(以文件描述符为例):
root soft core unlimited
root soft nofile 65535
* soft core unlimited
* soft nofile 65535
root
表示针对root
用户的设置。*
表示所有用户(不包括root
)。nofile
表示最大文件描述符数量,其他参数如nproc
(进程数)可根据需求调整。
保存并退出。
注意事项:
- 根据
man 5 limits.conf
,通配符*
对root
用户无效。必须显式指定root
用户名。 - 如果你主要使用
root
用户部署环境,请确保为root
单独设置限制。
2. 配置 systemd 的全局限制
在 systemd 系统中,用户级服务的资源限制由 systemd 控制,而非 limits.conf
。因此,需要修改 systemd 的全局配置文件。
使用 vi
编辑文件:
sudo vi /etc/systemd/system.conf
找到并取消注释以下行(修改值后保存):
DefaultLimitNOFILE=65536
DefaultLimitNOFILESoft=65536
重新加载 systemd 配置:
sudo systemctl daemon-reload
3. 检查 PAM 配置
确保 PAM(Pluggable Authentication Modules)启用了 pam_limits
模块,以便加载 /etc/security/limits.conf
中的设置。
使用 vi
编辑文件:
sudo vi /etc/pam.d/common-session
确认存在以下行(若无则添加):
session required pam_limits.so
保存并退出。
4. 重启并验证
完成上述配置后,重启系统以确保所有更改生效:
sudo reboot
验证方法:
# 用户会话(需通过登录 shell)
ulimit -n # 应显示 65536
# 检查内核全局限制
cat /proc/sys/fs/file-max # 应显示 2097152 或更大
# 检查 systemd 服务的默认限制
systemctl show --property DefaultLimitNOFILE
常见问题原因
- 未使用
su -
:su
不加载 PAM 会话,改用su -
或直接登录。 - 图形界面限制:某些桌面环境(如 GNOME)会覆盖限制,需在 systemd 用户实例中配置。
- 第三方工具干扰:如 Docker 或某些容器化工具可能单独设置限制。
版权声明:本文为原创文章,版权归 全栈开发技术博客 所有。
本文链接:https://www.lvtao.net/system/permanently-set-ulimit-debian-12.html
转载时须注明出处及本声明