我目前在WSL中安装了debian sid,最近发现从sid中安装的emacs-pgtk 29.4会导致除了emacs以外的其他GUI程序无法正常显示(如gvim或是简单的python tk)。
我进行了如下测试:
- debian sid 安装emacs-pgtk 29.4,出错
- debian stable (bookworm) 从 stable-backports 安装 emacs-pgtk 29.4,正常
- debian stable 添加 sid 源,从 sid 源安装 emacs-pgtk 29.4,出错
由于现在好不容易修好了(换源回stable,卸载重新安装emacs),不太敢再继续折腾。如果有朋友愿意帮助排查错误的话,我可以把我的debian wsl先export保存备份,再从一个干净的debian wsl来尝试复现问题。
完蛋,似乎回退emacs版本并没有用。目前的情况是,通过wsl --shutdown
之后再启动wsl,可以在里面正常运行GUI程序,但是大约10~30s之后,再运行就失败了,报错如下:
python test/a.py
Traceback (most recent call last):
File "/home/wang1zhen/test/a.py", line 7, in <module>
root = tk.Tk()
^^^^^^^
File "/usr/lib/python3.11/tkinter/__init__.py", line 2326, in __init__
self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
_tkinter.TclError: couldn't connect to display ":0"
但emacs居然不受影响……
卸载了来自stable-backports的emacs-pgtk,安装stable源中的emacs 28.2,emacs -Q
和其他的GUI程序一样无法正常运行。报错似乎也类似:
emacs -Q
^CDisplay :0 unavailable, simulating -nw
所以应该是wayland程序能运行,x11不行?
根据一个superuser的回答,在禁用systemd后似乎就正常了。但是我还是比较依赖systemd,所以看了关于X11 server的问题,根据wsl官方给出的FAQ,发现=/tmp/.X11-unix=不存在。手动创建软链接后,也是空的:
❯ ls -la /tmp/.X11-unix
❯ ln -s /mnt/wslg/.X11-unix /tmp/.X11-unix
❯ python test/a.py
^C^Cobject address : 0x7efe6fad8280
object refcount : 2
object type : 0x28e2ef0
object type name: TclError
object repr : TclError('couldn\'t connect to display ":0"')
lost sys.stderr
❯ ls -la /tmp/.X11-unix
lrwxrwxrwx 19 wang1zhen 3 Aug 23:01 .X11-unix -> /mnt/wslg/.X11-unix
❯ echo $DISPLAY
:0
❯ ls -la /tmp/.X11-unix
lrwxrwxrwx 19 wang1zhen 3 Aug 23:01 .X11-unix -> /mnt/wslg/.X11-unix
❯ ls /tmp/.X11-unix
比较疑惑这个问题,我先向wsl上游提交一下试试看。
在我先前因为这个问题重装过一次wsl后,固定在stable使用没有出现任何问题,但是添加sid的emacs-pgtk以及一些其他软件包后,就出现了这样的问题。删除sid源、删除相应软件包、删除后再重装,都无法解决。
望指点一二。
目前看下来,临时的解决方法似乎是:
sudo rmdir /tmp/.X11-unix && ln -s /mnt/wslg/.X11-unix /tmp/.X11-unix
先前的检测结果似乎有误,抱歉。
不过至于是什么导致了/tmp/.X11-unix
没有被正确的软链接,可能需要更上游去排查了。