Intro
我司本小廠,每個(gè)員工都是身兼數(shù)職,所以開發(fā)人員直接登錄線上服務(wù)器改東西是常態(tài)顶伞。有些開發(fā)人員,自持水平較高(的確水平也是較高,但缺乏對(duì)系統(tǒng)的敬畏)枝哄,所以總是越俎代庖肄梨,改一些本身應(yīng)該是線上運(yùn)維人員改動(dòng)的配置。本文提到的 /etc/security/limits.conf 兩次改錯(cuò)導(dǎo)致的事故挠锥,皆是因?yàn)橛诖恕?/p>
In details
The first time
第一次是在 /etc/security/limits.conf 中加了兩句:
* soft nofile unlimited
* hard nofile unlimited
結(jié)果就是:
所有用戶無法登錄众羡。一登錄,馬上被踢出來蓖租。
最后解決方法:
單用戶進(jìn)系統(tǒng)把文件 /etc/security/limits.conf 改回來粱侣。
原因:
配置文件 /etc/security/limits.conf 中 nofile 的參數(shù),只支持?jǐn)?shù)字蓖宦,"unlimited" 顯然系統(tǒng)不認(rèn)齐婴。
The second time
第二次也是在 /etc/security/limits.conf 中加了兩句:
root soft nofile 2000000
root hard nofile 2000000
結(jié)果是:
- root 用戶一登錄,就被踢
- 普通用戶可登錄稠茂,但
sudo su -
一切成 root 馬上會(huì)被踢(但普通用戶只支持sudo su -
)
解決方法:
像前面文章 一次本地提權(quán)的實(shí)戰(zhàn)演練 有提到的:
- 普通用戶登錄
- 用 DirtyCow(臟牛)本地提權(quán)
- 然后把 /etc/security/limits.conf 改回去柠偶。
原因:
- 配置文件 /etc/security/limits.conf 中 nofile 的參數(shù),其最大值不能大于 kernel 參數(shù) NR_OPEN 的限制
- 而 kernel 2.6.32 里睬关,NR_OPEN 的值缺省為 1024*1024=1048576
- 這里的 2000000>1048576诱担,所以出錯(cuò)被踢
稍稍延展一下,如果我一定要將 nofile 參數(shù)設(shè)置為 2000000呢电爹?
其實(shí)這也有辦法蔫仙,提高 kernel 里 NR_OPEN 的值即可,具體方法是:
[[ ! -e /etc/sysctl.d ]] && mkdir /etc/sysctl.d;
echo "fs.nr_open = 2000000" > /etc/sysctl.d/nr_open.conf;
sysctl -w fs.nr_open=2000000;
總結(jié)
總而言之丐箩,言而總之:Linux 下配置文件 /etc/security/limits.conf 文件不要隨意改動(dòng)摇邦。我其實(shí)還是傾向于在啟動(dòng)服務(wù)的啟動(dòng)腳本里手工用 ulimit 命令來設(shè)置相關(guān)參數(shù)而不要直接在 /etc/security/limits.conf 文件里改。