• docker 내부에서 GUI 프로그램을 실행해야 할 경우, 다음과 같이 설정합니다.

    먼저 host 머신에서 docker가 x윈도우에 접근 가능하도록 권한을 설정합니다.

    $ xhost +local:docker

    다음으로 docker 컨테이너를 실행할 때, 다음과 같이 옵션을 추가합니다.

    $ docker run --rm -it --runtime nvidia -e DISPLAY -e NVIDIA_DRIVER_CAPABILITIES=all -e NVIDIA_VISIBLE_DEVICES=all -v /tmp/.X11-unix:/tmp/.X11-unix ubuntu  

    옵션을 설명하면

    • -e DISPLAY : GUI가 출력될 DISPLAY 환경변수 전달
    • -e NVIDIA_DRIVER_CAPABILITIES=all : NVIDIA 드라이버 관련 라이브러리, 바이너리를 Docker 내부에 마운트 하기
    • -e NVIDIA_VISIBLE _DEVICES=all : Docker 내부에서 사용할 GPU 설정
    • -v /tmp/.X11-unix:/tmp/.X11-unix : X윈도우를 사용하기 위한 소켓 연결

    위와 같이 옵션을 설정하고 실행 후, 내부에서 GUI 프로그램을 설치하고 실행하면 됨.

    $ docker run --rm -it -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY --runtime nvidia -e NVIDIA_DRIVER_CAPABILITIES=all -e NVIDIA_VISIBLE_DEVICES=all ubuntu
    root@92913cdca2a1:/# glxgears
    Running synchronized to the vertical refresh.  The framerate should be
    approximately the same as the monitor refresh rate.

    그외 gtk 관련 프로그램도 정상적으로 실행되는 것을 확인할 수 있습니다.


    삽질 기록

    1) 위 -e NVIDIA_DRIVER_CAPABILITIES=all -e NVIDIA_VISIBLE_DEVICES=all 옵션을 사용하지 않는 경우, 다음과 같은 에러가 발생하고 실행이 되지 않음.

    X Error of failed request:  BadShmSeg (invalid shared segment parameter)
      Major opcode of failed request:  130 (MIT-SHM)
      Minor opcode of failed request:  3 (X_ShmPutImage)
      Segment id in failed request:  0x2e00005
      Serial number of failed request:  54
      Current serial number in output stream:  55

    2) Host 머신에서 권한 설정을 해주지 않으면, 실행 불가

    Authorization required, but no authorization protocol specified
    cannot open display: :1


    참고링크: https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/user-guide.html

  • docker를 설치하고, 내부로 진입해서 이런저런 작업을 진행할 때, bash의 자동완성 기능이 없어 매번 타이핑을 해야하는 불편한 점이 있습니다. 예로 apt install 후 패키지명을 수동으로 전체 입력해야 하는 것과 같은 점이요.

    bash-completion이 설치되지 않아서인데, 다음과 같은 과정으로 진행하시면 쉽게 해결이 가능합니다.

    $ apt install bash-completion vim
    $ vi /etc/bash.bashrc
    
    주석 해제
    # enable bash completion in interactive shells
    if ! shopt -oq posix; then
      if [ -f /usr/share/bash-completion/bash_completion ]; then
        . /usr/share/bash-completion/bash_completion
      elif [ -f /etc/bash_completion ]; then
        . /etc/bash_completion
      fi
    fi
    
    $ source /etc/bash.bashrc
    $ rm /etc/apt/apt.conf.d/docker-clean
    $ apt update

    이제 apt 명령 이외에도 bash 쉘에서 자동 완성 기능을 사용할 수 있습니다.

  • 업데이트: 여전히 브릿지 모드에선 문제가 발생하는 듯 합니다. 서브 머신과 호스트 머신에서 동시에 인터넷 접속을 할 경우에 서로 충돌이 발생합니다.


    WSL2의 서브 머신에서 외부IP를 사용하기 위해, 네트워크 카드에 브릿지하여 사용하는 방법을 포스팅했습니다. 적용 시 문제로는 업로드 속도가 무차별로 저하되는 증상이 발생합니다.

    해결 방법으론 디바이스 설정에서, 새로 생성된 Virtual Ethernet Adapter의 옵션에서 Large Send Offload Version 2 (IPv4) ,Large Send Offload Version 2 (IPv6) 항목을 Enable에서 Disable로 바꿔주면 해결됩니다.

    두 개 항목 모두 Disabled로 설정하고, 다시 속도 체크를 해보면,

    아직 살짝 저하되는듯 하지만, 그래도 거의 정상으로 돌아왔습니다.

  • WSL2에서 usb-ipd를 이용해서 디바이스를 연결할 수 있었습니다만, 현재의 WSL2 기본 커널에선 웹캠을 지원하지 않습니다. 따라서 웹캠을 WSL2에서 사용하기 위해선 커널을 재빌드해줘야 합니다.

    Ubuntu를 실행하고, 먼저 빌드에 필요한 패키지를 설치해줍니다.

    $ sudo apt install build-essential flex bison dwarves libssl-dev libelf-dev bc libncurses-dev

    다음으로, 커널 소스를 가져옵니다. 현재 릴리즈된 최신 버전은 5.15.90.1입니다. 관련된 Repository는 https://github.com/microsoft/WSL2-Linux-Kernel 에서 확인할 수 있습니다.

    $ mkdir ~/tmp
    $ cd ~/tmp
    $ wget https://github.com/microsoft/WSL2-Linux-Kernel/archive/refs/tags/linux-msft-wsl-5.15.90.1.tar.gz
    $ tar zxf linux-msft-wsl-5.15.90.1.tar.gz
    $ cd WSL2-Linux-Kernel-linux-msft-wsl-5.15.90.1
    

    기존 커널 옵션을 가져와서 복사해놓습니다.

    $ cp /proc/config.gz
    $ gunzip config.gz
    $ mv config .config

    커널 빌드 옵션을 조정하기 위해서 다음의 명령어를 입력해줍니다.

    $ make menuconfig

    카메라에 관련한 몇가지 옵션을 조정해줍니다. 옵션은 Space Bar를 누르면 조정가능합니다. 하위 메뉴를 찾아서 다음과 같이 설정해줍니다.

    Device Driver --> <*>  Multimedia Support
    Multimedia Support --> [*] Filter media drivers
    Multimedia Support --> Media device types --> [*] Cameras and video grabbers
    Multimedia Support --> Video4Linux options -> [*] V4L2 sub-device userspace API
    Multimedia Support --> Media drivers --> [*] Media USB Adapters
    Media USB Adapters --> <*> USB Video Class (UVC)
    Media USB Adapters --> <*> GSPCA based webcams

    설정이 완료되면, 저장한 후 다시 터미널로 나와 다음과 같이 입력하여 빌드를 진행해줍니다.

    $ make -j8

    빌드가 완료되었습니다.

      GZIP    arch/x86/boot/compressed/vmlinux.bin.gz
      MKPIGGY arch/x86/boot/compressed/piggy.S
      AS      arch/x86/boot/compressed/piggy.o
      LD      arch/x86/boot/compressed/vmlinux
      ZOFFSET arch/x86/boot/zoffset.h
      OBJCOPY arch/x86/boot/vmlinux.bin
      AS      arch/x86/boot/header.o
      LD      arch/x86/boot/setup.elf
      OBJCOPY arch/x86/boot/setup.bin
      BUILD   arch/x86/boot/bzImage
    Kernel: arch/x86/boot/bzImage is ready  (#1)

    다음으로 모듈을 빌드하고 설치해줍니다.

    $ sudo make modules_install
    
    arch/x86/Makefile:142: CONFIG_X86_X32 enabled but no binutils support
      DEPMOD  /lib/modules/5.15.90.1-microsoft-standard-WSL2

    또, 빌드된 커널을 설치해줍니다.

    $ sudo make install
    
    arch/x86/Makefile:142: CONFIG_X86_X32 enabled but no binutils support
    sh ./arch/x86/boot/install.sh 5.15.90.1-microsoft-standard-WSL2 \
            arch/x86/boot/bzImage System.map "/boot"
    run-parts: executing /etc/kernel/postinst.d/unattended-upgrades 5.15.90.1-microsoft-standard-WSL2 /boot/vmlinuz-5.15.90.1-microsoft-standard-WSL2

    또, 빌드된 커널 이미지 vmlinux를 C:\의 임의의 디렉토리로 복사해줍니다.

    $ sudo cp -rf vmlinux /mnt/c/Kernels

    이제 Ubuntu에서의 작업은 모두 완료되었습니다.


    먼저 WSL2를 종료합니다.

    > wsl2 --shutdown

    윈도우에서 홈디렉토리의 .wslconfig 파일을 다음과 같이 수정해줍니다.

    [WSL2]
    networkingMode = bridged
    vmSwitch = wsl2-external
    kernel = C:\\Kernels\\vmlinux

    이제 다시 Ubuntu를 실행합니다.


    커널이 잘 로딩되었는지 빌드 번호 확인

    $ uname -a
    Linux DESKTOP-HFMFSCL 5.15.90.1-microsoft-standard-WSL2 #1 SMP Tue Feb 14 09:51:42 KST 2023 x86_64 x86_64 x86_64 GNU/Linux

    이제 웹캠이 잘 연결되는지 확인해봅니다.

    먼저 윈도우의 커맨드 창에서 usbipd를 이용해 웹캠을 attach 해줍니다.

    > usbipd wsl list 
    BUSID  VID:PID    DEVICE                                                        STATE   
    2-1    27c6:533c  Goodix fingerprint                                            Not attached  
    2-2    1a86:7523  USB-SERIAL CH340 (COM6)                                       Not attached
    2-5    0c45:6a0c  Integrated Webcam                                             Not attached 
    2-14   8087:0026  Intel(R) Wireless Bluetooth(R)                                Not attached 
    6-2    0bda:8153  Realtek USB GbE Family Controller                             Not attached 
    7-1    05ac:024f  USB Input Device                                              Not attached 
    7-3    046d:c539  USB Input Device                                              Not attached 
    7-4    0bda:49a7  Realtek USB2.0 Audio, USB Input Device                        Not attached
    
    > usbipd wsl attach -b 2-5

    Ubuntu를 실행하고 커널 메시지를 확인해봅니다.

    $ sudo dmesg
    ...
    [  120.428941] vhci_hcd vhci_hcd.0: pdev(0) rhport(0) sockfd(3)
    [  120.430636] vhci_hcd vhci_hcd.0: devid(131077) speed(3) speed_str(high-speed)
    [  120.431905] vhci_hcd vhci_hcd.0: Device attached
    [  120.781071] usb 1-1: new high-speed USB device number 2 using vhci_hcd
    [  120.931358] usb 1-1: SetAddress Request (2) to port 0
    [  120.985548] usb 1-1: New USB device found, idVendor=0c45, idProduct=6a0c, bcdDevice= 1.30
    [  120.986274] usb 1-1: New USB device strings: Mfr=2, Product=1, SerialNumber=0
    [  120.986647] usb 1-1: Product: Integrated_Webcam_HD
    [  120.986898] usb 1-1: Manufacturer: CKFJH67N3010300037T0
    [  121.004725] usb 1-1: Found UVC 1.00 device Integrated_Webcam_HD (0c45:6a0c)
    [  121.023621] input: Integrated_Webcam_HD: Integrate as /devices/platform/vhci_hcd.0/usb1/1-1/1-1:1.0/input/input0
    [  121.026970] usb 1-1: Found UVC 1.00 device Integrated_Webcam_HD (0c45:6a0c)
    [  121.038030] input: Integrated_Webcam_HD: Integrate as /devices/platform/vhci_hcd.0/usb1/1-1/1-1:1.2/input/input1

    /dev 디렉토리에 video0가 생성되었는지 확인합니다.

    $ ll /dev/video*
    crw------- 1 root root 81, 0 Feb 14 10:31 /dev/video0
    crw------- 1 root root 81, 1 Feb 14 10:31 /dev/video1
    crw------- 1 root root 81, 2 Feb 14 10:31 /dev/video2
    crw------- 1 root root 81, 3 Feb 14 10:31 /dev/video3

    v4l2-ctrl 명령어로 디바이스 확인

    $ sudo v4l2-ctl --list-devices
    Integrated_Webcam_HD: Integrate (usb-vhci_hcd.0-1):
            /dev/video0
            /dev/video1
            /dev/video2
            /dev/video3
            /dev/media0
            /dev/media1

    영상은… 제 경우엔 검은색 화면만 나오고 있는데, 이 부분은 다시 확인해봐야겠습니다. 또 sudo 권한으로만 접근이 가능한 점도 뭔가 설정이 더 필요한듯 합니다.

  • 참고링크: https://github.com/dorssel/usbipd-win, https://learn.microsoft.com/ko-kr/windows/wsl/connect-usb

    WSL2는 윈도우에서 실행되는 일종의 가상머신입니다. 실제 윈도우에 연결된 USB 디바이스 (아두이노보드, 웹캠 등)를 WSL2에서 사용하기 위해서는 USB/IP 오픈소스 프로젝트에서 제공하는 usb-ipd를 사용하면 됩니다.

    [v] 윈도우에서 usbipd 설치

    먼저 설치를 위해서, 커맨드 창을 관리자 권한으로 실행합니다.

    > winget install usbipd  
    Microsoft Windows [Version 10.0.22621.1194] 
    (c) Microsoft Corporation. All rights reserved.        
                                                                                                                                                                                             C:\Windows\System32> winget install usbipd  
    The `msstore` source requires that you view the following agreements before using.
    Terms of Transaction: https://aka.ms/microsoft-store-terms-of-transaction
    The source requires the current machine's 2-letter geographic region to be sent to the backend
    service to function properly (ex. "US").
    Do you agree to all the source agreements terms?
    [Y] Yes  [N] No: y
    
    Found usbipd-win [dorssel.usbipd-win] Version 2.4.1 
    This application is licensed to you by its owner. 
    Microsoft is not responsible for, nor does it grant any licenses to, third-party packages.
    Downloading https://github.com/dorssel/usbipd-win/releases/download/v2.4.1/usbipd-win_2.4.1.msi
    ██████████████████████████████  9.99 MB / 9.99 MB 
    Successfully verified installer hash 
    Starting package install...  
    Successfully installed  

    winget은 윈도우에서 사용할 수 있는 패키지 매니저입니다. 위와 같이 명령을 입력하고 나면 자동으로 설치가 진행됩니다.

    [v] Linux 머신에서 USBIP 도구 및 하드웨어 데이터베이스 설치

    WSL2를 실행하고, Ubuntu 머신에서 다음과 같이 입력하여 usbipd 클라이언트 패키지를 설치합니다.

    $ sudo apt install linux-tools-virtual hwdata
    $ sudo update-alternatives --install /usr/local/bin/usbip usbip `ls /usr/lib/linux-tools/*/usbip | tail -n1` 20

    이제 설치가 완료되었습니다. 본격적으로 사용해보도록 합니다.


    예시로, 노트북에 연결되어 있는 USB Serial 컨버터를 연결해봅니다.

    먼저 디바이스를 WSL2 머신에 attach 해줘야 합니다. 커맨드창을 관리자 권한을 실행한 다음, 다음과 같이 입력하여 usb 디바이스를 확인해봅니다.

    >usbipd wsl list 
    BUSID  VID:PID    DEVICE                                                        STATE  
    2-1    27c6:533c  Goodix fingerprint                                            Not attached  
    2-2    1a86:7523  USB-SERIAL CH340 (COM6)                                       Not attached  
    2-5    0c45:6a0c  Integrated Webcam                                             Not attached  
    2-14   8087:0026  Intel(R) Wireless Bluetooth(R)                                Not attached  
    6-2    0bda:8153  Realtek USB GbE Family Controller                             Not attached  
    7-1    05ac:024f  USB Input Device                                              Not attached  
    7-3    046d:c539  USB Input Device                                              Not attached  
    7-4    0bda:49a7  Realtek USB2.0 Audio, USB Input Device                        Not attached 

    제 노트북에서 USB Serial 컨버터가 버스 아이디 2-2에 연결되어 있습니다. 현재는 Not attached 상태로 되어 있습니다. 이제 이 디바이스를 WSL2에 연결해봅니다.

    > usbipd wsl attach -b 2-2
    > usbipd wsl list
    BUSID  VID:PID    DEVICE                                                        STATE 
    2-1    27c6:533c  Goodix fingerprint                                            Not attached 
    2-2    1a86:7523  USB-SERIAL CH340 (COM6)                                       Attached - Ubuntu 
    2-5    0c45:6a0c  Integrated Webcam                                             Not attached 
    2-14   8087:0026  Intel(R) Wireless Bluetooth(R)                                Not attached
    6-2    0bda:8153  Realtek USB GbE Family Controller                             Not attached 
    7-1    05ac:024f  USB Input Device                                              Not attached 
    7-3    046d:c539  USB Input Device                                              Not attached 
    7-4    0bda:49a7  Realtek USB2.0 Audio, USB Input Device                        Not attached 

    Attach한 이후 디바이스 리스트를 확인해보면 다음과 같이 Ubuntu에 Attached 된 상태로 확인이 됩니다.

    이제 Ubuntu 머신으로 이동해서, dmesg로 연결이 되었는지 확인해봅니다.

    $ sudo dmesg
    ...
    
    [  827.577688] vhci_hcd vhci_hcd.0: pdev(0) rhport(0) sockfd(3)
    [  827.578223] vhci_hcd vhci_hcd.0: devid(131074) speed(2) speed_str(full-speed)
    [  827.578767] vhci_hcd vhci_hcd.0: Device attached
    [  827.850429] vhci_hcd: vhci_device speed not set
    [  827.920445] usb 1-1: new high-speed USB device number 3 using vhci_hcd
    [  828.000576] vhci_hcd: vhci_device speed not set
    [  828.150453] vhci_hcd: vhci_device speed not set
    [  828.220264] usb 1-1: new full-speed USB device number 4 using vhci_hcd
    [  828.300294] vhci_hcd: vhci_device speed not set
    [  828.370303] usb 1-1: SetAddress Request (4) to port 0
    [  828.410565] usb 1-1: New USB device found, idVendor=1a86, idProduct=7523, bcdDevice= 2.63
    [  828.412926] usb 1-1: New USB device strings: Mfr=0, Product=2, SerialNumber=0
    [  828.413663] usb 1-1: Product: USB2.0-Serial
    [  828.415868] ch341 1-1:1.0: ch341-uart converter detected
    [  828.419568] usb 1-1: ch341-uart converter now attached to ttyUSB0

    실제로 디바이스가 Ubuntu에 연결된 것을 확인할 수 있습니다.

  • 이전 블로그에서 정리했던 내용인데, 윈도우를 포맷한 후 새로 테스트 해본 결과 정리. 별다른 차이 없이 잘됨.


    덧#1: 현재 원인은 잘 모르겠는데, 아래와 같이 브릿지로 설정을 해놓으면, 인터넷 업로드 속도 및 노션 등 클라우드 서비스의 속도가 미친듯이 느려지는 상황이 발생합니다. 구글링 해보니, 같은 증상을 호소하는 사람이 다수있네요. 버그인듯한데… 방법을 찾아봐야겠습니다.


    WLS2의 서브 머신들의 네트워크는 내부 프라이빗망을 사용한다. 외부 대역과는 분리되어 있다는 의미로, 예를 들어 Ubuntu를 설치하고 ifconfig를 실행해보면,

    $ ifconfig
    eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet 172.21.50.26  netmask 255.255.240.0  broadcast 172.21.63.255
            inet6 fe80::215:5dff:fec8:7eef  prefixlen 64  scopeid 0x20<link>
            ether 00:15:5d:c8:7e:ef  txqueuelen 1000  (Ethernet)
            RX packets 0  bytes 0 (0.0 B)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 7  bytes 586 (586.0 B)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
            inet 127.0.0.1  netmask 255.0.0.0
            inet6 ::1  prefixlen 128  scopeid 0x10<host>
            loop  txqueuelen 1000  (Local Loopback)
            RX packets 0  bytes 0 (0.0 B)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 0  bytes 0 (0.0 B)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

    와 같이 172.21.50.xx 대역의 아이피를 자동으로 할당받는다.

    사용 목적에 따라 현재 사용하는 윈도우 머신의 네트워크를 브릿지하여 외부에서도 접속이 가능할 수 있게끔 할 필요가 있는데, 이를 사용하려면 WSL2의 Bridge 기능을 사용하면 된다.

    먼저 윈도우 추가 기능 중 Hyper-V 기능을 활성화한다.

    설치를 완료하고, 재부팅.

    Hyper-V Manager를 실행한다.

    메뉴 > Action > Virtual Switch Manager를 실행한다.

    우측 Create virtual switch에서 External를 선택하고, Create Virtual Switch버튼을 누른다.

    이름을 적당히 입력하고 (여기선 wsl2-external), Connection type에서는 External network에서 외부망과 연결할 Network 카드를 선택한다. 현재 테스트 환경은 노트북이라 여기에선 노트북의 WiFi 카드를 선택함.

    네트워크 설정 과정에서 현재 연결 상태를 변경할 수 도 있다는 경고인데, 그냥 Yes를 눌러 진행한다.

    이제 Hyper-V Manager를 종료하고, 사용자 홈 디렉토리 (C:\User\<user-name>\)에 .wslconfig 파일을 생성하고 다음과 같이 입력한다.

    [WSL2]
    networkingMode = bridged
    vmSwitch = wsl2-external

    networkingMode를 bridged로 설정하고, vmSwitch에는 전 과정에서 생성한 Virtual Switch 이름을 입력한다.

    코맨드 창을 열고, wsl2를 완전히 종료한다.

    > C:\Windows\System32\wsl.exe --shutdown

    이제 wsl2의 서브 머신, 예를 들면 Ubuntu를 시작해서 ifconfig 명령어를 실행해보면,

    $ ifconfig
    eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet 192.168.1.237  netmask 255.255.255.0  broadcast 192.168.1.255
            ether 5c:bb:f6:9e:ee:fa  txqueuelen 1000  (Ethernet)
            RX packets 17  bytes 2506 (2.5 KB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 2  bytes 684 (684.0 B)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
            inet 127.0.0.1  netmask 255.0.0.0
            loop  txqueuelen 1000  (Local Loopback)
            RX packets 0  bytes 0 (0.0 B)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 0  bytes 0 (0.0 B)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

    와 같이 외부망의 IP를 할당받아 사용되는 것을 볼 수 있다.

    외부에서 접속도 가능하고, 외부로 나가는 트래픽도 문제가 없음.

  • 참고림크: https://docs.nvidia.com/cuda/wsl-user-guide/index.html

    WSL2로 설치한 Ubuntu에서 CUDA를 설치하면 GPU 가속에 관련한 개발을 진행 할 수 있다.

    물론 윈도우에서 NVIDIA 드라이버 설치가 완료되어 있어야 함. https://www.nvidia.com/Download/index.aspx. 설치방법은 위 링크를 참고. 권장된 방법대로 WSL-Ubuntu 패키지를 이용한 설치 방법을 사용한다. Ubuntu를 실행한 후 다음과 같이 입력한다.

    $ wget https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/cuda-keyring_1.0-1_all.deb
    $ sudo dpkg -i cuda-keyring_1.0-1_all.deb
    $ sudo apt-get -y install cuda

    설치가 완료되면, 확인.

    완료.

  • 참고링크: https://learn.microsoft.com/ko-kr/windows/wsl/install

    현재 개발환경: Windows 11 Pro 22H2

    설치를 진행하기 위해 커맨드 창을 관리자 권한으로 실행한다.

    > wsl --install

    자동으로 설치가 진행되고, 다음과 같이 Ubuntu 22.04까지 설치가 완료됨.

    > wsl --install                                                                                       Installing: Virtual Machine Platform                                                                                    Virtual Machine Platform has been installed.                                                                            Installing: Windows Subsystem for Linux                                                                                 Windows Subsystem for Linux has been installed.                                                                         Installing: Ubuntu                                                                                                      Ubuntu has been installed.                                                                                              The requested operation is successful. Changes will not be effective until the system is rebooted.                                                                                                                        

    재부팅 필요.

    시작메뉴에서 Ubuntu 확인 가능. 추가로 다른 버전의 Linux를 설치하고 싶다면, Microsoft Store를 통해서 설치 진행한다.

    처음 실행 시, 사용자 이름과 암호를 입력하고 나면 Ubuntu가 정상적으로 실행됨을 볼 수 있다.

    이제 기본 Ubuntu와 동일하게 사용 가능.

    기본적으로 wsl2로 설치가 진행된다고 함. (예전엔 wsl1으로 되었는데…) 확인은 다음과 같이 입력하면 됨.

    > wsl -l -v
      NAME      STATE           VERSION
    * Ubuntu    Running         2

    완료

  • ROS를 사용하여 개발을 하다보니, ROS의 버전 파편화 덕분(?)에 Ubuntu의 버전을 달리 사용해야 하는 경우가 발생합니다. 현재 ROS2의 최신 LTS 버전은 Humble로 Ubuntu 22.04에서 사용이 가능합니다. ROS1의 경우 최종 LTS 버전이 Noetic으로 Ubuntu 20.04에서 사용이 가능합니다. 따라서 이 두개의 버전을 사용하기 위해선 두 개의 Ubuntu 버전을 사용해야 합니다.

    도커를 사용하는 방법이 있으나, 개발 시에 불편한 점이 있기도 하고 사용자에게 교육 시 일반화 하기엔 무리가 좀 따릅니다. 또 외장 USB 혹은 SSD를 이용하는 방법도 있지만, 주렁주렁 매달고 다니기엔 좀 불편하죠.

    하나의 디스크에 루트 파티션만 분리하면, 여러가지 버전의 Ubuntu를 사용할 수 있습니다.

    먼저 가장 최신 버전의 Ubuntu 배포판을 설치합니다. 물론 윈도우와 멀티부팅하는 경우도 포함합니다.

    설치 과정에서 디스크 파티션을 설정하는 부분이 있는데, 이때 나중에 설치할 배포판의 루트 영역도 확보해둡니다. 예를 들자면 다음과 같이 구성합니다.

    /dev/sda1    /boot    EFI     2000MB
    /dev/sda2    /        ext4    200000MB
    /dev/sda3    None     ext4    200000MB
    /dev/sda4    swap     swap    32768MB

    장치번호는 사용자마 다를 수 있으니 감안하시고, 구성된 것을 보면, 루트 파티션(/)만 분리해 둔 것을 볼 수 있습니다. 이제 설치과정을 진행하여 정상적으로 완료하도록 합니다.

    다음으로,

    추가로 설치할 배포판 설치를 진행합니다. 이때는 기존의 설치방법이 아닌, Try Ubuntu 등 임시로 사용할 수 있는 모드로 부팅을 완료한 후, 터미널을 실행하여 다음과 같이 입력합니다.

    $ ubiquity -b

    위 명령은 설치 진행 시 부트로더 설치를 하지 않겠다는 의미입니다. 설치과정은 기존과 동일하고, 다만 파티션 설정 부분에서 기존에 확보해두었던 파티션을 루트 파티션으로 선택합니다. (위와 같은 구성의 경우 /dev/sda3)

    이제 전 과정에서 설치한 최신 배포판으로 부팅한 후,

    $ sudo update-grub2

    을 입력하면, 자동으로 grub에서 모든 파티션의 루트 파티션을 인식해서 부팅목록에 추가해 줍니다.

    Grub의 기본 설정이 별다른 입력이 없으면, 휙 그냥 지나가게 되어 있어, /etc/default/grub 파일을 열어 다음과 같이 수정해준다.

    # If you change this file, run 'update-grub' afterwards to update
    # /boot/grub/grub.cfg.
    # For full documentation of the options in this file, see:
    #   info -f grub -n 'Simple configuration'
    
    GRUB_DEFAULT=0
    GRUB_TIMEOUT_STYLE=menu
    GRUB_TIMEOUT=10
    GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
    GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
    GRUB_CMDLINE_LINUX=""

    다시,

    $ sudo update-grub2

    해주고, 재부팅하면 정상적으로 grub 창이 뜨고, 부팅할 곳을 선택할 수 있음.

  • 윈도우11로 판올림하여 사용하면서 불편한 부분이 바탕화면에서 오른쪽 버튼을 눌렀을 때, 기존 메뉴가 다 나타나는게 아니고 항상 “더 많은 옵션”을 눌러야만 보이는 점입니다.

    이를 비활성화 하기 위해선,

    CMD창을 관리자 권한으로 실행하고, 다음과 같이 입력합니다.

    > reg.exe add “HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32” /f /ve

    그런 다음, explorer.exe를 강제 종료합니다.

    > taskkill /f /im explorer.exe

    다시 explorer.exe를 실행해 줍니다.

    > explorer.exe

    이제 확인해보면, 더 많은 옵션 메뉴가 사라지고 모든 메뉴가 잘 보이는 것을 확인할 수 있습니다.


    다시 이전으로 복구하려면,

    > reg.exe delete “HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}” /f
    > taskkill /f /im explorer.exe
    > explorer

Join 900+ subscribers

Stay in the loop with everything you need to know.