CentOS 8/RHEL 8中limits.conf参数设置过大导致ssh登录异常

1.检查limits.conf

/etc/security/limits.conf`

1
2
3
4
root   soft   nofile   1024000
root hard nofile 1024000
root soft nproc 102400
root hard nproc 102400

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配置注释进入系统
  • 配置修正,重启服务器