为何WSL2搭配Ubuntu 18.04镜像时未创建/run/user/${uid}目录,如何修复?
问题产生原因
/run/user/[UID]目录是由 pam_systemd 模块在用户交互式登录时自动创建的,用于存放当前用户的运行时数据,默认权限为700,仅对应当前用户可访问。- WSL2 环境默认关闭 systemd 支持,Ubuntu 18.04 镜像出厂默认也未配置相关自动创建规则,因此默认不会生成该目录。
- 若使用非登录式shell启动WSL(比如直接执行wsl命令调用单条指令),即使配置了部分会话规则,也不会触发PAM模块的目录创建逻辑。
可行修复方案
临时修复(重启WSL后失效)
直接执行以下命令手动创建目录,适合临时测试、单次使用的场景:sudo mkdir -p /run/user/1000 && sudo chown 1000:1000 /run/user/1000 && sudo chmod 700 /run/user/1000
永久修复方案1:启用systemd(推荐)
WSL 0.67.6及以上版本原生支持systemd启用,操作步骤如下:
- 编辑WSL配置文件
/etc/wsl.conf,添加如下内容:
[boot] systemd=true
- 保存文件后退出WSL,在Windows PowerShell中执行命令关闭WSL实例:
wsl --shutdown - 重新启动WSL后,系统会自动生成对应UID的
/run/user/1000目录,无需额外操作。
永久修复方案2:不启用systemd的替代方案
如果不需要使用systemd,可以通过shell启动脚本自动创建目录:
- 编辑当前用户的shell配置文件(bash用户编辑
~/.bashrc,zsh用户编辑~/.zshrc),添加如下内容:
if [ ! -d "/run/user/$UID" ]; then sudo mkdir -p "/run/user/$UID" sudo chown "$UID:$UID" "/run/user/$UID" sudo chmod 700 "/run/user/$UID" fi
- 配置sudo免密执行对应操作,避免每次启动shell都需要输入密码:执行
sudo visudo,在文件末尾添加如下规则:
%sudo ALL=(ALL) NOPASSWD: /bin/mkdir -p /run/user/*, /bin/chown *:* /run/user/*, /bin/chmod 700 /run/user/*
- 保存退出后重启WSL即可生效。
内容的提问来源于stack exchange,提问作者Vadim Prudnikov
相关产品推荐
相关产品推荐

