centos7账户名和密码都正确-却怎么都登录失败

参考:https://wn.zznnwn.cloudns.biz/2023/08/09/ubuntu18-04%E9%80%9A%E7%94%A8%E5%88%9D%E5%A7%8B%E5%8C%96/

问题概述及解决

问题描述

Centos 7 系统 优化系统内核后,账户无法登录(输入的账号和密码均正确,绝对没有错误!!,也没有禁止登录!!)。 报错为:Permission denied。

优化内核内容为:

1
2
3
4
5
cat /etc/security/limits.conf
* soft nofile 10000000 #错的,千万别用
* hard nofile 10000000 #错的,千万别用
* hard nproc 10000000 #错的,千万别用
* soft nproc 10000000 #错的,千万别用

报错截图:

出现上述问题,是因为在优化内核参数时数值过大

原因

limit设置的最大进程数和打开的最大文件数超过了内核参数sysctl..conf定义的值就是超过了内核允许的默认最大值

1
2
sysctl -p |grep fs.file-max
sysctl -p |grep fs.nr_open

问题解决方法一

修改内核参数为与limit一样的就行

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@localhost ~]# cat /etc/sysctl.conf 
# sysctl settings are defined through files in
# /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.
#
# Vendors settings live in /usr/lib/sysctl.d/.
# To override a whole file, create a new file with the same in
# /etc/sysctl.d/ and put new settings there. To override
# only specific settings, add a file with a lexically later
# name in /etc/sysctl.d/ and put new settings there.
#
# For more information, see sysctl.conf(5) and sysctl.d(5).
fs.file-max = 10000000
fs.nr_open = 10000000

问题解决方法二

进单用户模式将/etc/security/limits.conf 中的参数改为系统可承受的值,经过多次测验,最大可允许的数值为1000009。

问题发现及排查

问题发现

Centos系统部署完成,并进行系统内核调优,重启系统后,发现账户无法登录。确定输入的密码肯定正确,但是报错Permission denied。

解决

加载内核时按e键进入单用户模式

按方向键下键↓,找到设置语言的地方,如LANG=en\_US.UTF-8,在后面追加rw single init=/bin/bash,然后按ctrl+x重启系统

进入后就出现此报错

修改内核参数为系统可以承受的范围

1
2
3
4
5
6
cat /etc/security/limits.conf
* soft nofile 1000000
* hard nofile 1000000
* hard nproc 10000000
* soft nproc 1000000

或修改为

1
2
3
4
5
6
7
8
9
cat >> /etc/security/limits.conf <<EOF
* - nofile 65535
* - nproc 65535
root - nofile 65535
root - nproc 65535
EOF

ulimit -HSn 65535
ulimit -a

按Ctrl+D,执行reboot重启生效。

输入账户密码,成功登录。

至此,问题成功定位并解决。

输入exec /sbin/init命令重启系统

参数解释:

以下是你提供的 /etc/security/limits.conf 配置的详细说明表格:

用户/组 类型 项目 限制值 说明
* soft nofile 1000000 每个进程可打开的最大文件数(软限制)
* hard nofile 1000000 每个进程可打开的最大文件数(硬限制)
* hard nproc 10000000 每个用户可创建的最大进程数(硬限制)
* soft nproc 1000000 每个用户可创建的最大进程数(软限制)

/etc/security/limits.conf 设置内容解析

用户/组 类型 项目 限制值 说明
* - nofile 65535 所有用户最大可打开文件数(软硬限制都设置)
* - nproc 65535 所有用户最大可创建进程数(软硬限制都设置)
root - nofile 65535 root 用户最大可打开文件数(软硬限制都设置)
root - nproc 65535 root 用户最大可创建进程数(软硬限制都设置)

注:- 表示同时设置软限制(soft)和硬限制(hard)

1
* hard nofile 1000000
  • 含义:所有用户的 hard(硬限制)nofile1000000
  • 硬限制 是系统强制施加的上限,不能被非特权用户提升。
1
* hard nproc 10000000
  • 含义:所有用户的 硬限制nproc(每个用户能创建的最大进程数)为 10000000
1
2
* soft nproc 1000000

  • 含义:所有用户的 软限制nproc1000000

Shell 命令解析

命令 作用说明
ulimit -HSn 65535 设置当前 shell 会话的文件描述符软硬限制为 65535
ulimit -a 查看当前 shell 会话的所有资源限制

ulimit -a 输出参数解释表(含常见字段)

以下是 ulimit -a 可能输出的项目及含义(具体输出会因系统而异):

参数名称 说明
core file size 生成 core dump 文件的最大大小(单位 blocks)
data seg size 数据段的最大大小(进程可用的数据空间)
scheduling priority 进程调度优先级
file size 单个文件的最大可写入大小
open files (nofile) 每个进程最大可打开的文件描述符数
pipe size 管道缓冲区大小
POSIX message queues POSIX 消息队列可用的最大内存
real-time priority 实时调度策略的优先级
stack size 线程栈大小限制
cpu time 单个进程可使用的 CPU 时间限制(单位秒)
max user processes (nproc) 每个用户允许的最大进程数(包括线程)
virtual memory 可用的虚拟内存总量(地址空间)
locked-in-memory size 允许锁定到 RAM 的内存最大值

补充说明

  • * 表示对所有用户生效。
  • soft(软限制)可以由用户自己临时提高到 hard 限值以下。
  • hard(硬限制)是系统施加的最大限制,不能被非 root 用户提高。
  • nofile:最大文件描述符数量,影响网络连接、文件打开等。
  • nproc:最大进程数,影响用户能同时运行多少进程或线程。

你是在哪种场景下需要设这么高的 nofilenproc?是做高并发服务(如 Nginx、Redis、Kafka)还是 AI 模型计算类任务?

注意事项:

  1. 这些限制只会在使用 PAM 登录时生效(如 SSH、su、login 等)。

  2. 要让它生效,还要确保 /etc/pam.d/common-session/etc/pam.d/sshd 中有如下配置:

    1
    2
    session required pam_limits.so

  3. 设置过高的值(比如 nproc 设到千万级)如果没有必要,可能导致系统资源耗尽或被滥用,建议根据实际情况设置。

你是为哪类应用或服务配置这么大的资源限制?