为何ulimit无法阻止以超级用户运行的fork炸弹?
limits.conf的资源限制约束 嘿,我刚好碰到过类似的问题!你之所以修改/etc/security/limits.conf后,用root测试fork炸弹还是中招,核心原因是Linux系统默认不让limits.conf的配置约束root用户——毕竟root是超级用户,系统默认给它开了“特权通道”,允许它突破普通用户的资源限制。
具体原因拆解
Linux的ulimit机制本质是用来管控普通用户的,防止单个普通用户耗尽系统资源(比如开几万进程搞崩系统)。但root作为系统管理员,需要在极端场景下还能操作系统(比如资源快耗尽时启动修复进程),所以默认不受这些配额限制。哪怕你在limits.conf里用*匹配所有用户,这个*也不包含root哦。
让root也受限制的解决办法
如果确实要给root加进程数限制,得这么做:
明确给root用户配置限制
打开/etc/security/limits.conf,添加针对root的硬/软限制,比如:root soft nproc 1500 # 超过这个数会给警告 root hard nproc 2000 # 绝对不能突破的上限别用
*,*只对普通用户生效。确保PAM模块加载生效
检查/etc/pam.d/login和/etc/pam.d/sshd(如果用SSH登录root)里有没有这行:session required pam_limits.so没有的话加上,这是让PAM在用户登录时加载资源限制配置的关键。
验证配置是否生效
重新登录root,执行ulimit -u,如果输出的数值和你配置的一致,说明限制已经生效了。这时候再跑fork炸弹,系统会因为无法创建更多进程而阻止它。
额外小建议
你提到的cgroup确实是更靠谱的方案,它能对进程组、用户甚至容器做更精细的资源管控,而且天然能约束root用户。如果要做长期防护,cgroup比ulimit灵活得多。
内容的提问来源于stack exchange,提问作者Alvin

