之前碰到过,可好记性不如笨笔头,并且此次属于"严重事故",必须记录下来。linux
为何会出现这个错误提示?shell
1. root用户执行或设置了ulimit -n unlimitedbash
nofile它不识别unlimited,它是一个有限的值。若是你在/etc/security/limits.conf设置了nofile的unlimited,OK,你要跪了,不能登陆操做系统啦。session
2.root用户执行或设置了一个超出容许范围的值,如ulimit -n 1122334455并发
永久修改: /etc/security/limits.conf 的 nofile参数(或/etc/security/limits.d/目录下添加nofile参数)ssh
3.非root用户设置了比他分配到(/etc/security/limits.conf决定)的nofile还大(非root用户只能是越调越小,root不限制)阿里云
当你没法登陆操做系统,连阿里云管理控制台都进不去,阿里云又不能单用户模式,只能发工单让阿里云的挂盘修改,是否是很可怕,更可怕是跟阿里云技术沟通!我的用户不受重视啊(派个小兵,走下流程,要是发生在线上就是事故了)。操作系统
咱们知道,ulimit命令是用来shell启动进程所占用的资源限制的。.net
而nofile(max number of open file descriptors)是有一个上限的,由内核参数nr_open定义的。日志
nr_open是一个进程最多同时打开的文件句柄数量。
在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就足够了。
参考: