-
WSL Failed to Connect to a Wayland ServerProgramming/Troubleshooting 2024. 10. 21. 16:49
WSL의 Ubuntu 24.04에서 발생하는 "wayland-0 socket not found" 에러의 원인과 해결 방법을 설명합니다.
wayland-0 소켓 파일 Symbolic Link를 생성하는 임시 해결책과 영구적인 systemd 서비스 설정 방법을 제시합니다.
문제가 발생한 이유에 대해 조사한 내용을 포함하고 있습니다./run/user/1000/wayland-0 socket not found
Ubuntu 업데이트 이후, 언제부턴가 Neovim에서 복사를 하면 아래와 같은 에러가 뜨기 시작했습니다.
clipboard: error invoking wl-copy: Failed to connect to a Wayland server: No such file or directory Note: WAYLAND_DISPLAY is set to wayland-0 Note: XDG_RUNTIME_DIR is set to /run/user/1000/ Please check whether /run/user/1000/wayland-0 socket exists and is accessible.
TL;DR
WSL에서 Ubuntu 24.04 버전을 사용할 경우 발생할 수 있는 문제입니다.
Temporary Solution:
이렇게 symlink를 걸면 WSL 재시작 전까지 문제가 발생하지 않습니다.ln -s /mnt/wslg/runtime-dir/wayland-0* /run/user/1000/
Permanent Solution:
아래와 같은 systemd service를 만들어서 사용하면 됩니다. 복사 붙여넣기 하면 됩니다.cat ~/.config/systemd/user/symlink-wayland-socket.service [Unit] Description=Symlink Wayland socket to XDG_RUNTIME_DIR [Service] Type=oneshot ExecStart=/usr/bin/ln -s /mnt/wslg/runtime-dir/wayland-0 $XDG_RUNTIME_DIR ExecStart=/usr/bin/ln -s /mnt/wslg/runtime-dir/wayland-0.lock $XDG_RUNTIME_DIR [Install] WantedBy=default.target
다른 솔루션은 아래 링크에서 찾아보실 수 있습니다.
My Environment
- WSL 버전: 2.3.24.0
- 커널 버전: 5.15.153.1-2
- WSLg 버전: 1.0.65
- MSRDC 버전: 1.2.5620
- Direct3D 버전: 1.611.1-81528511
- DXCore 버전: 10.0.26100.1-240331-1435.ge-release
- Windows 버전: 10.0.22631.4249
- Ubuntu 버전: 24.04.1 LTS
왜 이런 문제가 발생했는가
궁금해서 찾아 본 내용을 정리합니다. 생소한 개념이 많아 잘못된 내용이 있을 수 있습니다.
wlsg-links의 설명을 주로 참고했습니다.Neovim은 클립보드를 다음 순서대로 찾습니다.
g:clipboard
에 설정된 클립보드가 있으면 사용합니다.- MacOS 에서는
pbcopy
,pbpaste
를 사용합니다. $WAYLAND_DISPLAY
가 설정되어 있으면wl-copy
,wl-paste
혹은waycopy
,waypaste
를 사용합니다.$DISPLAY
가 설정되어 있으면xsel
,xclip
을 사용합니다.- SSH를 통해 접속한 경우
lemonade
,doitclient
를 사용합니다. - Windows에서는
win32yank
를 사용합니다. - Termux를 사용하는 경우
termux-clipboard-set
,termux-clipboard-get
을 사용합니다. $TMUX
가 설정되어 있으면tmux
를 사용합니다.
저는 따로
g:clipboard
를 설정하지 않았습니다. WSL 환경으로 Ubuntu를 사용하고 있습니다. MacOS가 아닙니다.$WAYLAND_DISPLAY
는 설정이 되어있습니다.echo $WAYLAND_DISPLAY
를 해보니wayland-0
이 나옵니다.따라서 클립보드로
wl-copy
를 사용하게 됩니다.wayland-0
는 Wayland 디스플레이 연결을 위한 소켓입니다. 다시 한 번 에러 메시지를 보겠습니다.clipboard: error invoking wl-copy: Failed to connect to a Wayland server: No such file or directory Note: WAYLAND_DISPLAY is set to wayland-0 Note: XDG_RUNTIME_DIR is set to /run/user/1000/ Please check whether /run/user/1000/wayland-0 socket exists and is accessible.
/run/user/1000/
에wayland-0
소켓이 있는지 확인하라고 합니다.WSL은
wayland-0
소켓을/mnt/wslg/runtime-dir/wayland-0
에 저장합니다.
이 소켓은 Symbolic link를 통해/mnt/wslg/run/user/1000/
폴더에 나타납니다./mnt/wslg/run/user/1000/
폴더는/run/user/1000/
폴더에 bind mount 되어 있습니다.
따라서/run/user/1000/wayland-0
에는 소켓이 존재합니다.문제는 이 다음입니다.
Ubuntu의
/usr/lib/systemd/systemd-user-runtime-dir
서비스는/run/user/1000/
을 tmpfs로 사용합니다.
tmpfs는 Temporary File System의 약자로, 메모리를 파일처럼 사용하는 가상 파일 시스템이라고 하는데요.
메모리에 저장되기 때문에 재부팅하면 tmpfs의 내용은 전부 사라집니다.애초에 임시 파일을 저장하는 용도로 사용되기에 재부팅 시 사라져도 괜찮은 파일들이 저장되겠죠.
그래서 기존/run/user/1000/
폴더에 남아있던 내용은 관심사에 없습니다.메모리 위에 새로운
/run/user/1000/
폴더가 빈 상태로 생성됩니다. 여기에는wayland-0
소켓이 없습니다.
소켓은 실제 디스크에 저장된/run/user/1000/
폴더에 있을 수 있지만, 메모리에 저장된/run/user/1000/
폴더에는 존재하지 않습니다.그래서 부팅이 끝난 이후, 아래와 같이 소켓 파일을
/run/user/1000/
폴더에 넣어주어야 하는 것입니다.ln -s /mnt/wslg/runtime-dir/wayland-0* /run/user/1000/
Ubuntu 업데이트 이전에는 이런 문제가 발생하지 않았습니다.
Ubuntu 22.04 버전에 있는 버그 때문입니다.Ubuntu 22.04 버전에는
/usr/lib/systemd/systemd-user-runtime-dir
에 버그가 있습니다.
그래서/run/user/1000
를 tmpfs로 사용하지 않습니다.
결국/run/user/1000/
은wayland-0
소켓이 저장되어있는 실제 디스크에 저장된 폴더가 됩니다.종합하면, WSL의 동작이 버그가 있는 버전에 의존하고 있어서 발생한 문제였습니다.