ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • WSL Failed to Connect to a Wayland Server
    Programming/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은 클립보드를 다음 순서대로 찾습니다.

    1. g:clipboard 에 설정된 클립보드가 있으면 사용합니다.
    2. MacOS 에서는 pbcopy, pbpaste를 사용합니다.
    3. $WAYLAND_DISPLAY가 설정되어 있으면 wl-copy, wl-paste 혹은 waycopy, waypaste를 사용합니다.
    4. $DISPLAY가 설정되어 있으면 xsel, xclip을 사용합니다.
    5. SSH를 통해 접속한 경우 lemonade, doitclient를 사용합니다.
    6. Windows에서는 win32yank를 사용합니다.
    7. Termux를 사용하는 경우 termux-clipboard-set, termux-clipboard-get을 사용합니다.
    8. $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의 동작이 버그가 있는 버전에 의존하고 있어서 발생한 문제였습니다.

    댓글