对 /etc/security/limits.conf 和 /etc/security/limits.d/20-nproc.conf 的更改无效

Sam*_* MA 7 centos ulimit

在 CentOS Linux 7.1.1503 版(Linux 内核版本 3.10.x)VM 上,我将以下几行添加到 /etc/security/limits.conf 和 /etc/security/limits.d/20-nproc.conf:

someuser          soft    nofile     8000
someuser          hard    nofile     8000
Run Code Online (Sandbox Code Playgroud)

重启虚拟机后,ulimit -n依然报4096,ulimit -n 8000依然是“-bash:ulimit:open files:cannot modify limit:Operation not allowed”。

我很难过此时如何增加打开文件的限制。

小智 8

由于多种原因,可能会发生该错误。

首先,使用以下命令命令显示最大打开文件描述符数:

$ cat /proc/sys/fs/file-max
Run Code Online (Sandbox Code Playgroud)

让我们假设输出是 4096,这是什么意思?这意味着,普通用户可以在单次登录会话中打开 4096 个文件,您也可以使用以下命令检查其硬限制和软限制来显示它:

$ ulimit -Hn
$ ulimit -Sn
Run Code Online (Sandbox Code Playgroud)

整个系统中同时打开的文件描述符的数量可以通过编辑/etc/sysctl.conf. 您可以通过将系统范围的文件描述符限制设置为内核变量中的新值来增加打开文件的最大数量,/proc/sys/fs/file-max如下所示:

$ sysctl -w fs.file-max=200000     #it forces the limit to 200000 files
Run Code Online (Sandbox Code Playgroud)

然后您应该编辑/etc/sysctl.conf文件,以便在重新启动后设置将保持如您所愿。为此,请添加以下行:

$ fs.file-max = 200000
Run Code Online (Sandbox Code Playgroud)

无需注销并重新登录,只需键入:

$ sysctl -p
Run Code Online (Sandbox Code Playgroud)

然后您可以通过以下方式验证更改:

$ cat /proc/sys/fs/file-max

OR

$ sysctl fs.file-max
Run Code Online (Sandbox Code Playgroud)

那么对于更改用户的软限制和硬限制,最好以root身份登录,因为普通用户只能更改其软限制,硬限制由root管理。正如您所提到的,要以 root 身份执行此操作,您应该在/etc/security/limits.conf. 例如,如果它是针对 Oracle 用户的:

oracle           soft    nofile          4096
oracle           hard    nofile          63536
Run Code Online (Sandbox Code Playgroud)

要查看更改,您无需重新启动,只需重新登录sudo -i并检查它是否有效,这样您就可以确定问题所在。对于没有登录的用户,您应该以 root 身份执行以下操作:

$ sudo -i -u <user>
Run Code Online (Sandbox Code Playgroud)

顺便说一句,您可能需要编辑 /etc/pam.d/login 文件并添加以下行:

$ session required pam_limits.so
Run Code Online (Sandbox Code Playgroud)

pam_limit.so在 /etc/pam.d/login 中意味着在登录时但没有在 sudo 上,而/etc/pam.d/sudo在没有“-i”的情况下运行 sudo 时也会应用限制,您可能还需要在 /etc/pam.d/system- 中应用上述更改身份验证取决于您的需要。我建议您阅读有关 PAM 模块的信息。

顺便说一句,为了对当前正在运行的进程即时应用限制,除了更改之外,您还应该执行以下操作/etc/security/limits.conf

$ prlimit
Run Code Online (Sandbox Code Playgroud)

我建议您阅读RedHat 上的这篇文章,因为您可能会遇到:

在某些 Linux 系统上,当您以 oracle 用户身份通过​​ SSH 登录时,在以下示例中设置“硬”和“软”限制可能无法正常工作。如果您以 root 身份登录并以 su 身份登录 oracle,它可能会起作用。如果您遇到此问题,请尝试在 /etc/ssh/sshd_config 中将 UsePrivilegeSeparation 设置为“no”,并通过执行 service sshd restart 重新启动 SSH 守护进程。在某些 Linux 系统上,权限分离无法与 PAM 一起正常工作。在禁用 SSH 安全功能“权限分离”之前,请务必与负责安全的人员交谈。

我希望我能帮上忙。祝你好运。


小智 3

您可能需要检查某些用户的个人资料。当某个用户登录时。profile 可以更改其 ulimit。要检查的文件: /etc/profile /etc/bashrc ~someuser/.bash_profile ~someuser/.bashrc