ssh因Operation not permitted致使沒法登陸系統

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

參考:

linux 最大文件打開數nofile及nr_open、file-max說明

PAM認證

相關文章
相關標籤/搜索