-bash: ulimit: open files: cannot modify limit: Operation not permitted

以前碰到过,可好记性不如笨笔头,而且这次属于"严重事故",必须记录下来。

为什么会出现这个错误提示?

1. root用户执行或设置了ulimit -n unlimited

nofile它不识别unlimited,它是一个有限的值。如果你在/etc/security/limits.conf设置了nofile的unlimited,OK,你要跪了,不能登录操作系统啦。

2.root用户执行或设置了一个超出允许范围的值,如ulimit -n 1122334455

永久修改:  /etc/security/limits.conf 的 nofile参数(或/etc/security/limits.d/目录下添加nofile参数)

3.非root用户设置了比他分配到(/etc/security/limits.conf决定)的nofile还大(非root用户只能是越调越小,root不限制)

当你无法登录操作系统,连阿里云管理控制台都进不去,阿里云又不能单用户模式,只能发工单让阿里云的挂盘修改,是不是很可怕,更可怕是跟阿里云技术沟通!个人用户不受重视啊(派个小兵,走下流程,要是发生在线上就是事故了)。

我们知道,ulimit命令是用来shell启动进程所占用的资源限制的。

而nofile(max number of open file descriptors)是有一个上限的,由内核参数nr_open定义的。

nr_open是一个进程最多同时打开的文件句柄数量。

扫描二维码关注公众号,回复: 91293 查看本文章

在2.6.25内核之前有个宏定义,定义了这个值的最大值,为1024*1024,正好是100万,而在2.6.25内核及其之后,这个值是可以通过/proc/sys/fs/nr_open来设置。

sysctl  -a |grep nr_open

fs.nr_open = 1048576  

我们可以看下系统用了多少文件描述符,上限是多少

cat /proc/sys/fs/file-nr
3552    0       65535

第一个表示已经分配了的文件描述符数量, 第二个表示空闲的文件句柄数量, 第三个表示能够打开文件句柄的最大值(跟file-max一致)

那么,一旦这个max超过nr_open的值,就会出现我们标题的-bash: ulimit: open files: cannot modify limit: Operation not permitted 错误了.

那为什么是ssh服务异常,其他服务,如WEB是没有问题的呢?

带着问题我看了一下系统日志,原来,我的/etc/ssh/sshd_config配置里面开启了pam(关闭后即使Operation not permitted也能登录SSH)

SSH服务中有一个pam_limits认证模块

所属类型:session

功能描述:该模块限制用户会话过程中系统资源的使用率。缺省的,该模块的配置文件是/etc/security/limits.conf,可以使用conf参数指定自定义的配置文件。

所以咯,ssh并没有权限突破系统的限制,我们也就登录不了系统了。

总结:

hard nofile 要小于 nr_open

我们使用ulimit或limits.conf来设置时,如果要超过默认的1048576值时需要先增大nr_open值(sysctl -w fs.nr_open=2097152或者直接写入sysctl.conf文件)。

说官方点,就是先修改系统级别的参数,再去修改用户级别的参数,这个才是调整参数的正确姿势-。-

错误信息:

 error: PAM: pam_open_session(): Permission denied

 pam_limits(crond:session): Could not set limit for 'nofile': Operation not permitted

问题:

1.ssh配置文件中开启pam和不开启pam有什么区别?

利用 PAM 管理使用者认证有很多好处,可以记录与管理。

2.我们一定要加那么大的nofile?

我们一定要加那么大的文件描述符吗?不需要,除非你单台要跑上百万的并发,一般我们65535就足够了。

参考:

linux 最大文件打开数nofile及nr_open、file-max说明

PAM认证

猜你喜欢

转载自my.oschina.net/longquan/blog/1620346
今日推荐