如何永久设置WSL2 Ubuntu的栈大小限制
如何永久设置WSL2 Ubuntu的栈大小限制
我来帮你解决这个WSL2里栈大小永久设置的问题,你遇到的情况其实挺典型的——临时设置有效、/etc/security/limits.conf不生效、su到自己时反而正常,核心原因是WSL2的shell启动流程和常规Ubuntu服务器不太一样。
方案一:修复PAM配置让limits.conf生效
WSL2默认可能没有在shell启动时加载PAM的limits模块,这就是你修改/etc/security/limits.conf后没效果的关键原因;而su user时会触发完整的PAM认证流程,所以配置能正常生效。你可以按以下步骤操作:
- 编辑PAM的通用会话配置文件:
sudo nano /etc/pam.d/common-session - 确保文件中存在这一行(如果没有,就添加到文件合适的位置):
session required pam_limits.so - 保存退出后,重启WSL(在Windows命令提示符或PowerShell里执行
wsl --shutdown,然后重新打开Ubuntu终端),再执行ulimit -a查看栈大小,应该就显示为unlimited了。
方案二:全局shell配置覆盖(兼容所有shell类型)
如果上面的PAM方案没起作用,或者你想更直接地覆盖所有shell实例(包括非交互式shell),可以用全局shell配置的方式:
- 在
/etc/profile.d/目录下创建一个专门的配置脚本,这个目录里的脚本会被所有登录自动加载:sudo nano /etc/profile.d/set_stack_limit.sh - 在脚本里写入:
ulimit -s unlimited - 保存退出后,重启WSL或者重新登录,不管是交互式shell还是非交互式shell(比如执行脚本时的shell),栈大小都会被设置为unlimited。
补充说明
- 为什么
.bashrc只对交互式shell有效?因为bash默认只有在交互式模式下才会加载.bashrc文件,非交互式shell(比如运行脚本时的后台shell)不会读取这个文件,所以无法生效。 - 而
su user能生效的原因是,su命令会触发完整的PAM认证流程,强制加载了pam_limits.so模块,从而读取了/etc/security/limits.conf里的配置。
备注:内容来源于stack exchange,提问作者nograpes




