CentOS 8/RHEL 8中limits.conf参数设置过大导致ssh登录异常
1.检查limits.conf
/etc/security/limits.conf`
1 | root soft nofile 1024000 |
1.1 nofile数值超过了内核上限 nr_open
在 Linux 中任何用户的 nofile(文件描述符数)**绝对不能超过内核参数 fs.nr_open**。
- CentOS 8 的默认内核限制:
fs.file-max通常很大,但fs.nr_open默认是 1048576(约 100 万)。 - 你的配置写了
10240000(1024 万),超过了系统默认的1048576。当配置值超过nr_open时,PAM 会直接忽略该规则并回退为默认值 1024。
坑
排查与解决:
# 1. 检查内核上限:
cat /proc/sys/fs/nr_open
# 2. 如果确实需要设置到千万或数百万,必须先调大内核限制:
echo "fs.nr_open = 20000000" >> /etc/sysctl.conf
echo "fs.file-max = 20000000" >> /etc/sysctl.conf
sysctl -p
# 3.验证
cat /proc/sys/fs/nr_open #确认数值已被拉大
1.2子目录覆盖
CentOS 8 会默认加载 /etc/security/limits.d/ 下的文件,并且**子目录内的配置优先级高于 /etc/security/limits.conf**。
# 1. 检查该目录下是否有其他配置文件:
ls -l /etc/security/limits.d/
# 2.建议直接在 `/etc/security/limits.d/` 下新建一个优先级最高的文件
/etc/security/limits.d/99-nofile.conf
* soft nofile 1024000
* hard nofile 1024000
root soft nofile 1024000
root hard nofile 1024000
如果存在20-nproc.conf或类似文件,里面的规则会覆盖你在imits.conf里的设置。
2.重建会话核验
2.1没有重新建立会话(或 PAM 未加载)
limits.conf 是由 PAM 模块(pam_limits.so)在用户登录建立会话时读取的:
- 当前已经打开的 SSH 终端不会自动更新。
- 如果你是在同一个终端里修改后直接测
ulimit -n,它依然是旧值。
# 1.重新连接
exit
# 2.登录后验证
ulimit -n
3.如果发现ssh/console登录eof问题如何解决
- 重启linux16进入系统把limits.conf配置注释进入系统
- 配置修正,重启服务器