Arch Linux 上通过 AUR 安装的微信(wechat-universal-bwrap)近期遇到一个比较影响使用的问题:无法把文件复制/拖拽到聊天框发送,文件选择器里也只能看到微信自己创建的目录。这篇文章记录一下排查过程和最终解决方案。
问题现象
- 从文件管理器复制文件,粘贴到微信聊天框没有反应。
- 直接把文件拖进微信聊天窗口,文件发不出去。
- 点击微信聊天窗口的“发送文件”按钮,弹出的文件选择器左侧只有
xwechat_files等微信自己创建的目录,看不到Downloads、Desktop、Pictures等用户目录。
环境信息
- 发行版:Arch Linux
- 桌面环境:GNOME / Wayland(也适用于其他 X11/Wayland 桌面)
- 微信包:
wechat-universal-bwrap 4.1.1.7-2 - 安装方式:AUR(
yay -S wechat-universal-bwrap)
排查过程
首先查看微信进程,发现它不是直接运行的,而是通过 bwrap(bubblewrap)沙盒启动的:
ps aux | grep wechat输出里有一长串 bwrap --unshare-all --share-net --cap-drop ALL ... 的参数。关键挂载参数如下:
--bind /home/<user>/Documents/WeChat_Data/home /home/<user>
--bind /home/<user>/Documents/WeChat_Data/xwechat_files /home/<user>/Documents/WeChat_Data/xwechat_files这意味着:
- 沙盒内部的
~实际上被映射到了~/Documents/WeChat_Data/home。 - 只有
~/Documents/WeChat_Data/xwechat_files这个目录被额外挂载进了沙盒。 - 其他目录(如
~/Downloads、~/Desktop、~/Pictures)完全没有被挂载,微信在沙盒里根本看不到它们。
所以微信不是“没权限”,而是“根本看不到”这些目录。
接着查看启动脚本 /usr/lib/wechat-universal/common.sh,发现它支持自定义挂载:
WECHAT_CUSTOM_BINDS_CONFIG=~/.config/wechat-universal/binds.list启动时会读取这个文件,每行一个路径,用 --bind 挂载进沙盒。这正是我们需要的扩展点。
解决方案
创建配置文件:
mkdir -p ~/.config/wechat-universal
cat > ~/.config/wechat-universal/binds.list <<'EOF'
Downloads
Desktop
Documents
Pictures
Music
Videos
EOF路径可以是绝对路径,也可以是相对于 ~ 的路径。这里列出的是最常用的几个用户目录,按需增减即可。
重要注意事项
wechat-universal-bwrap 的启动脚本对这个配置文件的解析比较原始:
mapfile -t WECHAT_CUSTOM_BINDS_PERSISTENT < "${WECHAT_CUSTOM_BINDS_CONFIG}"它不会跳过空行,也不会识别 # 注释。如果文件里有空行或注释行,会被 readlink -f 解析成错误路径,导致 bwrap 启动失败。所以 binds.list 里只能写纯路径,不要加空行和注释。
完全退出并重启微信
配置文件只在启动时读取,所以改完后需要彻底退出微信(包括托盘图标),再重新启动:
# 如果微信还在运行,先杀掉相关进程
killall wechat
killall bwrap然后从应用菜单或命令行重新启动微信:
wechat-universal验证方法
重启后:
- 打开任意聊天窗口。
- 点击“发送文件”按钮,或直接把文件拖进聊天框。
- 文件选择器左侧应该能看到
Downloads、Desktop、Pictures等目录。 - 选择外部文件后,可以正常发送。
其他挂载方式
除了 binds.list,启动脚本还支持两种临时方式:
1. 命令行参数
wechat-universal --bind ~/Downloads --bind ~/Desktop2. 环境变量
WECHAT_CUSTOM_BINDS="$HOME/Downloads:$HOME/Desktop:$HOME/Pictures" wechat-universal这两种方式适合临时测试,长期使用还是 ~/.config/wechat-universal/binds.list 最方便。
总结
wechat-universal-bwrap 为了安全默认把微信关在很小的沙盒里,只暴露 ~/Documents/WeChat_Data 目录。这虽然隔离性好,但严重影响了日常发文件的需求。通过 ~/.config/wechat-universal/binds.list 把常用的用户目录挂载进沙盒,就能恢复正常的文件拖拽和发送功能。