Study: ComputerScience(CS)/CS: Linux

[Linux] X11 ν¬μ›Œλ”©ν•˜κΈ° (Ubuntu xserver, Window VcXsrv, MacOS XQuartz): μ„œλ²„/λ„μ»€μ—μ„œ QUI ν™•μΈν•˜κΈ°

DrawingProcess 2023. 4. 25. 20:30
λ°˜μ‘ν˜•
πŸ’‘ λ³Έ λ¬Έμ„œλŠ” '[Linux] X11 ν¬μ›Œλ”©ν•˜κΈ° (Ubuntu, MacOS XQuartz): μ„œλ²„/λ„μ»€μ—μ„œ QUI ν™•μΈν•˜κΈ°)'에 λŒ€ν•΄ 정리해놓은 κΈ€μž…λ‹ˆλ‹€.
Ubuntu μ„œλ²„λ‚˜ docker μ»¨ν…Œμ΄λ„ˆμ—μ„œ GUI ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰μ‹œν‚¬ 경우, X11 forwarding을 톡해 ν•΄λ‹Ή hostμ—μ„œ λ„μšΈ 수 μžˆλ„λ‘ μ„€μ •ν•΄μ£ΌλŠ” 과정이 ν•„μš”ν•œλ° ν•΄λ‹Ή λ‚΄μš©μ— λŒ€ν•΄ μ •λ¦¬ν•˜μ˜€μœΌλ‹ˆ μ°Έκ³ ν•˜μ‹œκΈ° λ°”λžλ‹ˆλ‹€.

1. X11 ν¬μ›Œλ”©

1.1. X11 ν¬μ›Œλ”©μ΄λž€?

λ³„λ„λ‘œ μžˆλŠ” λ¦¬λˆ…μŠ€ PC에 ssh μ ‘μ†μœΌλ‘œ μ½˜μ†” μž‘μ—…μ€ κ°€λŠ₯ν•œλ° GUI ν”„λ‘œκ·Έλž¨μ€ μ‹€ν–‰ ν•  μˆ˜κ°€ μ—†μŠ΅λ‹ˆλ‹€. μ΄λ•Œ GUI 화면을 ν¬μ›Œλ”©ν•΄μ„œ λ§₯μ—μ„œ κ·Έ ν™”λ©΄κ³Ό μ‘°μž‘μ„ κ°€λŠ₯ν•˜κ²Œ ν• λ €λ©΄ X11 ν¬μ›Œλ”©μ„ ν•˜λ©΄ λ©λ‹ˆλ‹€.

μ €λŠ” λ©”μΈμœΌλ‘œ macOSλ₯Ό μ‚¬μš©ν•΄μ„œ macOSμ—μ„œ μ‚¬μš© ν•  수 μžˆλŠ” 방법을 μ•Œμ•„ λ³΄κ² μŠ΅λ‹ˆλ‹€ . μ•„λž˜ 링크λ₯Ό μ°Έμ‘° ν•˜μ˜€μœΌλ©° μ•„λž˜ λ§ν¬μ—μ„œλŠ” macOS 뿐만이 μ•„λ‹ˆκ³  μœˆλ„μš°μ™€ λ¦¬λˆ…μŠ€μ—μ„œ μ‚¬μš©ν•˜λŠ” 방법도 μžˆμœΌλ‹ˆ μ°Έκ³  ν•˜μ‹œλ©΄ λ©λ‹ˆλ‹€.

1.2. X11 ν™˜κ²½ μ„€μ •

X11 ν™˜κ²½ μ„€μ • (in Window)

VcXsrv Windows X Server Download: https://sourceforge.net/projects/vcxsrv/files/latest/download

X11 ν™˜κ²½ μ„€μ • (in Ubuntu)

$ sudo apt-get update
$ sudo apt-get -y install xorg xrdp xserver-xorg mesa-utils xauth gdm3

$ xhost +local:root

X11 ν™˜κ²½ μ„€μ • (in MacOS)

macOSμ—μ„œλŠ” XQuartzλΌλŠ” ν”„λ‘œκ·Έλž¨μ„ μ„€μΉ˜ν•˜λ©΄ λ©λ‹ˆλ‹€. ν”„λ‘œκ·Έλž¨ ν™ˆνŽ˜μ΄μ§€μ—μ„œ μ„€μΉ˜ νŒŒμΌμ„ λ‹€μš΄λ‘œλ“œ ν•  μˆ˜λ„ μžˆμ§€λ§Œ brewλ₯Ό ν†΅ν•΄μ„œλ„ μ„€μΉ˜λ₯Ό ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

% brew install --cask xquartz

λ‹€μ‹œ λ‘œκ·ΈμΈν•˜κ±°λ‚˜ μž¬λΆ€νŒ…ν•˜λ©΄ Macμ—μ„œ κΈ°λ³Έ X11 server둜 XQuartxκ°€ ν™œμ„±ν™”λ˜μ–΄ X11 ν¬μ›Œλ”©μ΄ κ°€λŠ₯ν•©λ‹ˆλ‹€. 이후 XQuartz의 섀정을 μ—΄μ–΄ Security(λ³΄μ•ˆ) νƒ­μ—μ„œ "Allow connections from network clients(λ„€νŠΈμ›Œν¬ ν΄λΌμ΄μ–ΈνŠΈμ—μ„œμ˜ 연결을 ν—ˆμš©)"λ₯Ό ν΄λ¦­ν•˜μ—¬ ν΄λΌμ΄μ–ΈνŠΈ 접속이 κ°€λŠ₯ν•˜λ„λ‘ ν•©λ‹ˆλ‹€.

μΆ”κ°€λ‘œ xhost 섀정을 ν•΄μ£Όλ©΄ 기본적인 섀정이 λλ‚©λ‹ˆλ‹€.

% nano ~/.bashrc
...
xhost + <Server IP>

% source ~/.bashrc

2. X11 ν¬μ›Œλ”©

2.1. ubuntu μ„œλ²„ 접속

2.1.1. Shell 슀크립트 ν™œμš©

ssh둜 μ ‘μ†μ‹œ -X μ˜΅μ…˜μ„ μ£Όλ©΄ X11 ν¬μ›Œλ”©μ΄ κ°€λŠ₯ν•©λ‹ˆλ‹€.

% ssh -X sjchoi@192.168.0.1

이후 x11-apps에 λ‚΄μž₯λ˜μ–΄ μžˆλŠ” GUI ν”„λ‘œκ·Έλž¨(xeyes)을 μ‹€ν–‰ν•΄ 보면 μ •μƒμ μœΌλ‘œ ν‘œμ‹œκ°€ λ©λ‹ˆλ‹€.

sjchoi@sjchoi-desktop$ xeyes

​2.1.2. VSCode ν™œμš©

vscode extensionμ—μ„œ 'Remote-SSH'λ₯Ό μ„€μΉ˜ν•˜μ—¬ vscodeμ—μ„œ μ›κ²©μœΌλ‘œ μž‘μ—…ν•  수 μžˆλ„λ‘ λ§Œλ“­λ‹ˆλ‹€.

ssh μ„€μ • κ΄€λ¦¬ν•˜λŠ” 파일인 ~/.ssh/config λ₯Ό λ‹€μŒκ³Ό 같이 ForwardX11, ForwardX11Trustedλ₯Ό yes둜 μΆ”κ°€ν•©λ‹ˆλ‹€.

Host 192.168.0.1
  HostName 192.168.0.1
  User sjchoi
  ForwardX11 yes
  ForwardX11Trusted yes

2.2. docker μ»¨ν…Œμ΄λ„ˆ 접속

2.2.1. docker-compose.yml ν™œμš©

μ°Έκ³ : https://github.com/DrawingProcess/ros2-gazebo-docker-arm64

version: "3.8"

services:
  ros2:
    build:
      context: docker/ros2
      args:
        - user_id=1000
        - ros_ws=/home/dockeruser/dev_ws

    # Enabling GPU access with Compose
    # https://docs.docker.com/compose/gpu-support/
    # deploy:
    #   resources:
    #     reservations:
    #       devices:
    #          - capabilities: [gpu]
    #            count: all

    environment:
      # Set a fancy prompt (See ~/.bashrc in the container)
      - TERM=xterm-256color

      # Mac X11
      - DISPLAY=192.168.35.143:0

    volumes:
      - ./:/home/dockeruser/project
      - ./dev_ws:/home/dockeruser/dev_ws
      - ./docker/ros2/.ros:/home/dockeruser/.ros
      - ./docker/ros2/.gazebo/:/home/dockeruser/.gazebo

      # Mac X11
      - /tmp/.X11-unix:/tmp/.X11-unix
      - ~/.Xauthority:/root/.Xauthority:rw
    privileged: true

μ—¬κΈ°μ„œ μ€‘μš”ν•œ 것은 DISPLAY ν™˜κ²½λ³€μˆ˜ 섀정에 μžˆμ–΄μ„œ 화면을 λ„μš°κ³ μž ν•˜λŠ” '<Host OS IP>:0'을 λ„£μ–΄μ£Όμ–΄μ•Ό ν•œλ‹€λŠ” 점이며, host의 경우 μ•žμ—μ„œ μ–ΈκΈ‰ν•œ xhost + <Server IP>둜 νŠΉμ • μ„œλ²„μ— λŒ€ν•œ 접근을 ν—ˆμš©ν•΄μ•Ό ν•©λ‹ˆλ‹€. μΆ”κ°€λ‘œ ':0'의 μ˜λ―ΈλŠ” λ””μŠ€ν”Œλ ˆμ΄ 포트λ₯Ό μ˜λ―Έν•©λ‹ˆλ‹€.

이후 ν•΄λ‹Ή docker-compose.yml λ₯Ό λ°”νƒ•μœΌλ‘œ 이미지λ₯Ό λ§Œλ“€μ–΄ ν•΄λ‹Ή μ»¨ν…Œμ΄λ„ˆλ₯Ό λ„μ›Œμ€λ‹ˆλ‹€.

% docker-compose build
% docker-compose up -d
% docker-compose exec --user root ros2 bash

이후 ν•΄λ‹Ή μ»¨ν…Œμ΄λ„ˆ λ‚΄λΆ€μ—μ„œ x11-apps νŒ¨ν‚€μ§€ 내뢀에 μžˆλŠ” xclock을 μ‹€ν–‰μ‹œν‚€λ©΄ μ‹œκ³„κ°€ λœ¨λŠ” 것을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

$ xclock

μ°Έκ³ 

λ°˜μ‘ν˜•