之前碰到過,可好記性不如笨筆頭,並且此次屬於"嚴重事故",必須記錄下來。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就足夠了。
參考: