Arch Linux 上通过 AUR 安装的微信(wechat-universal-bwrap)近期遇到一个比较影响使用的问题:无法把文件复制/拖拽到聊天框发送,文件选择器里也只能看到微信自己创建的目录。这篇文章记录一下排查过程和最终解决方案。

问题现象

  • 从文件管理器复制文件,粘贴到微信聊天框没有反应。
  • 直接把文件拖进微信聊天窗口,文件发不出去。
  • 点击微信聊天窗口的“发送文件”按钮,弹出的文件选择器左侧只有 xwechat_files 等微信自己创建的目录,看不到 DownloadsDesktopPictures 等用户目录。

环境信息

  • 发行版:Arch Linux
  • 桌面环境:GNOME / Wayland(也适用于其他 X11/Wayland 桌面)
  • 微信包:wechat-universal-bwrap 4.1.1.7-2
  • 安装方式:AUR(yay -S wechat-universal-bwrap

排查过程

首先查看微信进程,发现它不是直接运行的,而是通过 bwrap(bubblewrap)沙盒启动的:

BASH
ps aux | grep wechat

输出里有一长串 bwrap --unshare-all --share-net --cap-drop ALL ... 的参数。关键挂载参数如下:

TEXT
--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,发现它支持自定义挂载:

BASH
WECHAT_CUSTOM_BINDS_CONFIG=~/.config/wechat-universal/binds.list

启动时会读取这个文件,每行一个路径,用 --bind 挂载进沙盒。这正是我们需要的扩展点。

解决方案

创建配置文件:

BASH
mkdir -p ~/.config/wechat-universal
cat > ~/.config/wechat-universal/binds.list <<'EOF'
Downloads
Desktop
Documents
Pictures
Music
Videos
EOF

路径可以是绝对路径,也可以是相对于 ~ 的路径。这里列出的是最常用的几个用户目录,按需增减即可。

重要注意事项

wechat-universal-bwrap 的启动脚本对这个配置文件的解析比较原始:

BASH
mapfile -t WECHAT_CUSTOM_BINDS_PERSISTENT < "${WECHAT_CUSTOM_BINDS_CONFIG}"

它不会跳过空行,也不会识别 # 注释。如果文件里有空行或注释行,会被 readlink -f 解析成错误路径,导致 bwrap 启动失败。所以 binds.list只能写纯路径,不要加空行和注释

完全退出并重启微信

配置文件只在启动时读取,所以改完后需要彻底退出微信(包括托盘图标),再重新启动:

BASH
# 如果微信还在运行,先杀掉相关进程
killall wechat
killall bwrap

然后从应用菜单或命令行重新启动微信:

BASH
wechat-universal

验证方法

重启后:

  1. 打开任意聊天窗口。
  2. 点击“发送文件”按钮,或直接把文件拖进聊天框。
  3. 文件选择器左侧应该能看到 DownloadsDesktopPictures 等目录。
  4. 选择外部文件后,可以正常发送。

其他挂载方式

除了 binds.list,启动脚本还支持两种临时方式:

1. 命令行参数

BASH
wechat-universal --bind ~/Downloads --bind ~/Desktop

2. 环境变量

BASH
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 把常用的用户目录挂载进沙盒,就能恢复正常的文件拖拽和发送功能。