Ubuntu에서 DDM 기능 대체하기

Dell 모니터 중 KVM 기능을 지원하는 제품의 경우, Windows나 macOS에서는 DDM (Dell Display Manager)라는 프로그램을 통해서 모니터를 키보드를 통해 제어할 수 있다.

이를 이용하면 유용한 점이, 모니터를 직접 조작하지 않고도, 입력 소스를 선택할 수 있어 두 대의 PC를 오가며 쉽게 작업할 수 있다는 점이다.

다만 아쉽게도 아직까지 Ubuntu에서 동작하는 DDM은 없는 상황이다. 하지만 구글링을 해보면 쉽게 이를 대체할 수 있는 방법이 나온다.

기본적으로 DDM의 역할은 모니터에 연결된 특정칩에 명령을 전달하는 것인데, 이 명령이 DDC/CI 기능을 이용한다. 아마 게임기나 셋탑박스를 연결할 때, 케이블을 꼽기만 해도 해당 입력소스로 자동으로 전환되는 것을 경험해보셨다면, 그 모니터가 DDC/CI 기능을 지원한다는 의미이다.

Ubuntu에도 이러한 기능을 수행하는 커맨드가 존재하는데, ddccontrol 이 그것이다.

설치는 다음과 같이

$ sudo apt install ddccontrol

설치하면 되고..

이제 실행을 해보면, 먼저 모니터를 인식하는지를 확인해보면…

$ ddccontrol -p
ddccontrol version 0.6.0
Copyright 2004-2005 Oleg I. Vdovikin (oleg@cs.msu.su)
Copyright 2004-2006 Nicolas Boichat (nicolas@boichat.ch)
This program comes with ABSOLUTELY NO WARRANTY.
You may redistribute copies of this program under the terms of the GNU General Public License.

Detected monitors :
 - Device: dev:/dev/i2c-6
   DDC/CI supported: Yes
   Monitor Name: VESA standard monitor
   Input type: Digital
  (Automatically selected)
Reading EDID and initializing DDC/CI at bus dev:/dev/i2c-6...
I/O warning : failed to load external entity "/usr/share/ddccontrol-db/monitor/DEL426A.xml"
Document not parsed successfully.
I/O warning : failed to load external entity "/usr/share/ddccontrol-db/monitor/DELlcd.xml"
Document not parsed successfully.

EDID readings:
	Plug and Play ID: DEL426A [VESA standard monitor]
	Input type: Analog

...
= VESA standard monitor
...
> Input settings
	> Input sources
		> id=inputsource, name=Input Source Select (Main), address=0x60, delay=-1ms, type=2
		  Possible values:
			> id=analog - name=Analog, value=1
			> id=digital - name=Digital, value=3
		  supported, value=3855, maximum=14
...

와 같이 연결된 모니터 정보가 인식된다.

이중, 중요한 것이, 연결되어 있는 디바이스 정보인데, 여기에선 /dev/i2c-6으로 되어 있다. 또, Input sources를 설정하는 레지스터 주소가 0x60으로 되어 있는 것을 알 수 있다.

이제 0x60에 특정한 값을 넣으면, 해당되는 입력 소스로 전환할 수 있다는 것인데… 이 특정한 값이 무엇인지를 파악해야 하는데, 역시 검색해보면 답이 바로 나온다.

  • Display Port : 0x0f (15)
  • USB-C : 0x1B (27)
  • HDMI : 0x11 (17)

이다.

즉 터미널에서 다음과 같이 입력하면, USB-C 입력소스로 즉시 전환된다.

$ ddccontrol -r 0x60 -w 27 dev:/dev/i2c-6

이제, 이 명령을 키보드 단축키로 지정하면 쉽게 사용 가능.

설정에서 키보드 > 키보드 단축키 설정 > 사용자 단축키 설정

이제, 위 단축키를 이용하면, 모니터의 입력소스를 조정하여 쉽게 전환이 가능하다.

Dell U2723QE 모니터 구입

새로 만든 개발용PC에 사용할 모니터를 고민하다가, Dell U2723QE 모니터로 결정하고 구입하였음.

Dell UltraSharp 27 4K USB-C 허브 모니터 – U2723QE

출처: Dell.com

화질이야 어짜피 IPS 패널 정도면, 큰 무리는 없을듯 하고… 27인치냐 32인치냐를 한참 고민했었는데… 27인치에서 4k를 Native 해상도로 사용하기엔 살짝 무리가 있고, 32인치는 Native 해상도로 사용하기엔 큰 문제가 없는데, 맥북 등에서 레티나 해상도로 사용하면 글자가 엄청나게 커지니… 또 책상의 크기도 반영하여 27인치로 결정

또 하나 재밌는 기능이 포함되어 있는데, KVM 기능이 내장되어 있음. 모니터 하나를 가지고 2대의 PC에서 사용할 수 있는 기능인데, 모니터의 입력 소스를 선택하면 해당되는 PC로 키보드와 마우스를 자동으로 전환해 줌. 따라서 편하게 메인PC를 사용하다가 노트북을 붙여서 사용할 때도 큰 무리없이 함께 사용 가능. Good!

출처: Dell.com

가격은 공식 홈페이지에선 이상한 가격으로 되어 있는데, 대충 799,000원이 공식 가격인듯… (할인은 얄짤도 없다는…)

작업용 PC 조립

노트북으로는 살짝 사양이 부족하여, 집에서 개인적으로 사용할 PC를 조립하였습니다. 살짝 공돌이 마인드가 발생하여 최적화된 케이스를 찾다가 FormD사의 T1 v2 모델을 선정하였습니다.

Mini ITX보드만 들어갈 수 있고, SFX 파워, 그래픽 카드 등을 넣으면 거의 빈 공간이 없는 작은 사이즈의 케이스인데, 도전하는 마음으로..^^ 국내에는 팔지 않아, 해외 주문을 하였고, 며칠 후 관세 납입하라는 문자가 와서 수령하고 조립 시작..

대충 들어간 부품 목록은

  • CPU: Intel Core i9-12gen 12900KF (엘더레이크)
  • M/B: ASUS ROG STRIX B660-I GAMING WIFI
  • RAM: 삼성전자 DDR5-4800 (32GB) * 2EA
  • POWER: FSP DAGGER PRO 850W GOLD Full Modular (SFF)
  • GPU: COLORFUL 지포스 RTX 3090 Ti 토마호크 EX D6X 24GB
  • AIO: [FRACTAL DESIGN] Lumen S24
  • CASE: FormD T1 – SANDWICH KIT – TITANIUM COLOR
  • Cooler: Noctua NF-A12x15 PWM Premium Quiet Slim Fan 4-Pin x 2EA

케이스는 그야 말로 부품레벨로만 제공되고, 따로 조립 메뉴얼로 첨부되지 않습니다. 유투브의 여러 영상으로 통해 참고하는 수 밖에는 없었고, 조립을 하다가 여러번 나사를 풀고 조이는 작업을 반복해야 합니다. (상황에 따라)

꾸역꾸역 부품 집어넣고, 케이블 정리하고, 부팅까지 되는걸 확인하고 하니, 꽤나 만족스럽습니다. 수냉 쿨러 특성상 열이 발생해도 소음은 조용한 수준입니다.

본체 크기는 저 정도입니다. 아주 작은 크기이고, 사방으로 타공되어 있어 공기 순환도 아주 잘되는 편입니다.

Unityhub 설치 on Ubuntu 22.04

Unity를 사용하기 위해 Ubuntu 22.04에서 Unityhub 설치 과정을 진행해도 Unityhub가 실행되지 않는다.

검색해본 결과, libssl 버전이 안맞아서 그런 것인데, Ubuntu 22.04에 설치되는건 libssl3이고 Unityhub가 사용하는건 libssl1 이다.

간단히 libssl1을 받아서 설치해주면 해결됨.

$ wget http://archive.ubuntu.com/ubuntu/pool/main/o/openssl/libssl1.1_1.1.1f-1ubuntu2_amd64.deb
$ sudo dpkg -i libssl1.1_1.1.1f-1ubuntu2_amd64.deb

Unityhub 설치 과정은…

$ sudo sh -c 'echo "deb https://hub.unity3d.com/linux/repos/deb stable main" > /etc/apt/sources.list.d/unityhub.list'
$ wget -qO - https://hub.unity3d.com/linux/keys/public | sudo tee /etc/apt/trusted.gpg.d/unityhub.asc
$ sudo apt update
$ sudo apt install unityhub

WSL2에서 외부네트웍에 브릿지하여 사용하기

WSL2에서 Ubuntu 등을 설치하면 기본적으로는 내부 프라이빗 네트워크망을 사용한다. 즉, 아이피 대역이 아예 다른 서브네트웍 망을 생성하여 사용한다는 얘기.

따라서 ipconfig를 이용하여 할당된 IP를 확인해보면,

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.24.175.35  netmask 255.255.240.0  broadcast 172.24.175.255
        inet6 fe80::215:5dff:fea8:1061  prefixlen 64  scopeid 0x20<link>
        ether 00:15:5d:a8:10:61  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.24.175.35 등으로 할당된다.

여러가지 이유로 윈도우에서 접속되어 있는 외부네트웍을 접속하고, 또 외부에서 WSL2 안의 시스템에 접속하고 싶을 때가 있는데, 이때는 WSL2의 Bridge 기능을 사용하면 된다.

먼저 Hyper-V 매니저를 설치하고, 실행한다. Windows 추가 기능 관리자를 사용하여 설치할 수 있다.

설치하고, 재부팅을 완료한 이후에, Hyper-V 매니저를 실행하면, 다음과 같이 보일텐데…

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

이제 New virtual network switch를 클릭고, 외부 네트웍에 브릿지 해야 하므로 External를 선택한 후, Create Virtual Switch를 클릭한다.

이름은 적당히 입력하고 (나중에 사용해야 하므로 적당히…), Connection Type에서 External Network를 선택하고, 현재 외부망에 연결되어 있는 네트웍카드를 선택한다. (예시의 경우엔, 현재 노트북을 이용하여 무선랜으로 외부망에 접속중이므로, 무선랜카드를 선택하였음.)

Apply를 눌러 적용한다.

자, 이제 현재 사용자의 홈디렉토리에 .wslconfig 파일을 생성하고, 다음과 같이 입력한 후, 저장한다.

[WSL2]
networkingMode = bridged
vmSwitch = New Virtual Switch

vmSwitch의 이름은 아까 전 단계에서 생성했던 Virtual Network Switch 이름을 입력하면 된다.

PowerShell를 관리자 권한으로 실행하여 다음과 같이 WSL2를 아예 종료한다.

PS C:\WINDOWS\system32> .\wsl.exe --shutdown

이제 WSL2를 다시 실행한 다음, ifconfig를 실행해 보면,

~$ ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.100.193  netmask 255.255.255.0  broadcast 192.168.100.255
        ether 5c:bb:f6:9e:ee:fa  txqueuelen 1000  (Ethernet)
        RX packets 2  bytes 684 (684.0 B)
        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

정상적으로 외부 네트웍망의 아이피를 할당받았음을 알 수 있다.
끝!