jungin500/efinextboot – 멀티부팅을 좀더 간단하게

Windows/Ubuntu를 멀티부팅할 일이 잦아서 자주 사용하던 chengxuncc/booToLinux 유틸리티에는 몇가지 문제점이 존재한다.

  1. 한글이 깨지는 문제
  2. 느린 실행속도

해당 레포지토리 소스코드를 살펴본 결과 Golang으로 작성되었으며 생각보다 간단하게 구성되었다. 각 문제의 해결 방법을 찾을 수 있을것 같아 직접 밑바닥부터 다시 구현하였다.

Features

  • 한글 깨짐 문제 수정 (cmd 인코딩 변경)
  • Powershell 라이브러리 사용하지 않아 속도 향상

[macOS][Karabiner][V13] macOS Control <=> Command 키 토글

서두

본 글은 macOS에서 Command 키나 Control 키가 먹히지 않을 경우, Karabiner를 이용하여 두 키를 서로 바꾸어(토글) 사용할 수 있는 해결 방법을 공유한다. 키가 고장났을때도 유용할 것 같다.

최근 sickcodes/Docker-OSX를 WSL2 위에서 돌려서 만족하면서 써보고 있는데, Windows 키가 WSL2 KVM QEMU에서 제대로 전달되지 않아 macOS에서 Command 키를 사용할 수 없다는 문제가 발생했다. 해당 문제를 Karabiner를 이용하여 해결해보았다.

Karabiner 소개

macOS에서 키 바인딩을 편리하게 바꿀수 있는 도구이다. 이전 글에서도 이 어플리케이션을 이용하여 한/영키를 Shift+Space로 편리하게 자동 전환하는 JSON 스크립트를 만든적이 있었다.

[V13] left_shift twice to toggle between Control 스크립트 설치

간단하게 아래 페이지를 열어 스크립트를 Karabiner에 적용할 수 있다: 링크
(주소가 매우 긴데, 이는 JSON 스크립트 Body 자체가 인코딩되어 들어있기 때문이다. 원본 JSON 스크립트는 이 링크에서 확인할 수 있다)

Press left_shift twice to toggle between Control and Command key. Another key pressed during each left_shift press will be considered as a cancel, and timeout will also considered as cancel.

사용법

Karabiner에 스크립트를 적용 완료하였다면, “Left Shift”를 두번 연타하여 Control과 Command를 토글할 수 있게 된다. 상태가 총 두 가지인데,

  • 일반 상태: Control 키와 Command 키가 각각 원래 역할을 한다.
  • 토글 상태: Control 키는 Command 키로, Command 키는 Control 키로 동작한다.

위와 같은 방식으로 동작하게 된다. 토글의 조건이 몇가지가 있는데, 신경쓰인다면 확인해보는것도 좋을것 같다.

  • Shift를 두번 연타할 때에는 500ms 이내로 연타하면 된다.
  • 처음 Shift pressed event 이후 다음 Shift pressed event 전까지 임의의 키가 입력되면 무시된다.
  • 처음 Shift pressed event에서 Shift가 modifier key로 사용되었다면 (예, Shift+A 등의 조합키) 무시된다.

여기서 무시된다는 것은, 해당 동작이 토글을 바꾸는 데에 효과가 없다는 것을 의미한다. 이는 빠른 타이핑 도중에 여러번 Shift가 눌리는 상황을 고려하여 만들었다.

개선 사항

  • 알고리즘이나 키 바인딩 관련한 개선이 필요한 경우 해당 Gist에 댓글로 부탁드립니다.
  • 더 간단한 구현이 가능할 경우 공유해주시면 매우 환영입니다!

[M1/M2] 수월한 macOS 한/영 전환 환경 만들기

환경

  • 메인 PC: Macbook Air M1
  • 작동 가능한 원격 환경 (키보드/마우스 공유 포함)
    • Microsoft Remote Desktop – Windows 11 (x64)
    • Parallels Desktop 18 – Windows 11 (ARM64)
    • Synergy (M1 Macbook Air가 Host, Windows 11이 Guest)

목표

  • macOS를 메인으로 사용할 때, Synergy Guest인 Windows, Parallels Guest인 Windows, 그리고 Remote Desktop 모두에서 한/영 전환을 문제없이 하기 위함
  • 오른쪽 Command키를 Shift+Space와 동일한 효과를 나도록 함

준비물

세팅 방법 – Windows 파트

Windows에서는 날개셋 입력기만 설치하고 주 입력기로 설치하면 된다. 기본적으로 날개셋 입력기는 Shift+Space와 한/영키 두 가지 모두 한/영 변환이 가능하다. 이는 모든 Windows Guest에 설치해야 작동할 것이다.

세팅 방법 – macOS 파트

macOS에서는 여러 프로그램을 설치할 필요가 있다. 기본적으로 아무 세팅도 하지 않은 상태에서는 Caps Lock키가 한/영 전환키이며, 길게 누르면 기존 Windows와 동일한 Caps Lock Toggle을 수행하게 된다. 이를 바꿔서, 우리는 Shift+Space를 한/영 전환키로 바꿔보고 원격이나 Synergy에서도 활용할 수 있게 해보자. (각 프로그램의 설치 과정은 상세히 기록하지 않았다. 일반적인 설치 방법을 참고하면 된다.)

  1. Karabiner-Elements 설치: 설치는 일반적인 방식대로 진행하면 된다.
  2. Right Command to Left Shift+Space 프리셋 먹이기: Karabiner-Elements에 먹일 수있는 Preset이다. 이를 적용하고 나면 오른쪽 Command 키가 시스템 전역으로 Left Shift+Space로 대체된다.
  3. 구름 입력기 설치: 설치 과정을 진행하고 난 뒤 언어 입력기 설정에서 기본 입력기인 “두벌식”을 구름 아이콘의 “두벌식”으로 변경하자. 이 때부터는 Caps Lock을 통한 한/영 전환이 비활성화된다.
  4. com.apple.symbolichotkeys.plist 수정: 기본적으로 설정>키보드>단축키>입력 소스>입력 메뉴에서 다음 소스 선택 부분을 Shift+Space로 변경하면 끝나는데, macOS Monterey에서는 이를 허용하지 않는것 같다. plist 파일을 수정하고 재 부팅하면 이때부터는 값이 변경되어 있으므로 오른쪽 Command나 Shift+Space를 통해 한/영 전환을 사용할 수 있을 것이다.

세팅 방법 – Parallels Desktop 18

Parallels Desktop 18에서는 기본적으로 입력소스 전환 키를 윈도우의 LALT+Shift로 매핑하는것 같다. 하지만 우리는 Windows Guest에 날개셋 입력기를 설치하였으므로, 이를 Override해보자.

먼저 Parallels 제어 센터에서 설정으로 들어간다

다음으로는 단축키에서 Windows 11 섹션으로 들어간다. 기본적으로 Shift+Space가 언어 변경으로 매핑되고 끌 수 없는것을 확인할 수 있다.

이는 엔트리를 추가하여 Override할 수 있다. 아래 + 버튼으로 Shift+Space를 그대로 Shift+Space로 전달하는 룰을 추가한다.

이렇게 하면 Windows 안에서도 언어 전환이 가능하다.

한계점

언어 전환시 언어 자체의 동기화는 되지 않는다. 이 말은, Windows에서는 한글로 입력 중이나 macOS에서는 영어 상태일 수 있다는 의미이다. 큰 의미는 없지만, 언어 선택이 완벽하게 일관성있게 작동하지 않으므로 나중에 문제가 생길수도 있을 것이다.

또한 날개셋 입력기는 기본 Windows 입력기가 아니다. 웬만한 상황에서는 잘 작동할 것이라 생각하나 일부 게임/뱅킹 프로그램이 작동하지 않거나 입력기 프로그램을 차단할 수 있으므로, 해당 상황에서는 기본 Windows 입력기로 전환하여 사용하는 것이 좋을 것이다.

[OpenWRT] 외부 네트워크로부터 WOL(Wake on LAN) 패킷 보내기

OpenWRT에서 외부 네트워크로부터 WOL packet을 전달하여 PC나 NAS 기기를 켜는 방법입니다.

OpenWRT의 경우 PC를 종료하면 자동으로 ARP Table이 날라갑니다 (심지어는 Permanent로 지정해주어도 PC를 켰다가 다시 종료하면 또 날라갑니다.) IP주소와 MAC 주소가 ARP Table에 있어야만 WOL packet이 해당 PC에 정상적으로 전달되기 때문에, 여기서는 1분에 한 번씩 ARP cache를 확인하여 없으면 추가해주는 방식으로 진행하도록 하겠습니다. firewall-based 방식도 있을텐데, 건드려야 할 부분이 생각보다 많을것 같아서 포기하고 이 방식을 선택했습니다. 다만, 이 방식은 PC를 종료하자마자 1분 안에 켤 경우에 작동하지 않는다는 단점이 있습니다.

목차

  1. Port Forwarding
  2. Crontab
  3. Android Application

1. Port Forwarding

먼저 WOL Packet을 해당 PC로 전달할 수 있도록 Port forwarding을 진행합니다.

외부 port를 내부 Port 7번으로 forward합니다.

2. Crontab

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed

# check static ARP table by every minute
* * * * * /bin/sh -c 'export IPADDR=172.x.x.x; export LLADDR=00:11:22:33:44:55; export DEV=eth0; [ -n "$(ip neigh | grep $IPADDR | grep FAIL)" ] && (echo "Restoring ARP table ..."; ip neigh del $IPADDR dev $DEV || true; ip neigh add $IPADDR lladdr $LLADDR nud permanent dev $DEV)'

위 crontab entry의 IPADDR, LLADDR, DEV 변수를 수정해 주시면 됩니다. 정상 작동을 위해 cron 서비스를 재시작해주시면 되며, 잘 적용되었는지 여부는 1분 정도 뒤 ip neigh 를 통해 해당 테이블에 PERMANENT라고 뜨는 것으로 확인 가능합니다.

저는 두 개를 세팅해서 사용해서, PERMANENT가 두 개로 뜹니다.

3. Android Application

마지막으로 WOL Packet을 쉽게 보내줄 Android application입니다. 다른 어플리케이션이나 PC에서 보내도 문제는 없습니다만, 이 어플리케이션이 가장 간편하고 위젯 형태로 사용 가능해서 활용중입니다.

설정 페이지입니다.
  1. MAC주소: 전원을 켤 PC의 MAC 주소입니다. 상단 스크립트의 LLADDR 과 동일합니다.
  2. 호스트네임 / IP / 브로드캐스트 주소: 라우터의 공용 IP입니다. 라우터에 접속된 PC에서 whatsmyip.com에 접속 하여 간단히 확인할 수 있습니다.
  3. 포트: 포트포워딩 할 때 사용했던 외부 포트입니다.
  4. (선택) 기기 IP, 상태 확인 포트: 켜졌는지 여부를 확인하는 IP와 포트입니다. 저는 동일한 IP와 RDP 포트를 사용했습니다.

이제, Wake On Lan 어플리케이션에서 쉽게 PC 전원을 켤 수 있습니다. 위젯을 만들어 홈 화면에 배치하면 더 쉽게 켤 수도 있습니다!

Windows 멀티부팅 폴더 접근권한 삭제(복원)하기

Windows를 멀티부팅하게 되면, 서로 다른 OS 내의 홈폴더 (예를 들어, D:\Users\jungin500)에 접근해야할 일이 생깁니다. 다만 폴더 접근 권한 때문에 이런 창이 한번은 뜨게 되고, <계속> 버튼을 누르면 오랜 시간이 걸린 뒤 어찌되었든 해당 폴더에는 이제부터 접근할 수 있게 됩니다.

윈도우 이 폴더에 액세스할 수 있는 권한이 거부되었습니다. 해결 방법
현재 사용자에 대한 권한을 부여하는 창.

문제 제기

다른 OS로 다시 부팅해서 C:\Users\jungin500 폴더의 속성 내 보안 탭을 보면, 기존에 없던 새로운 엔트리가 생겨 있습니다.

기존에는 없던 “알 수 없는 계정” 엔트리.

어쨌든 저는 이제 필요한 파일 복사가 끝나서 재부팅한 지금 OS를 계속 사용할 생각이며, 기존에 부팅했던 OS는 삭제하려고 합니다. 이러한 상황에서 저 “알 수 없는 계정”에 대한 엔트리를 삭제하려고 합니다.

이 경우에는 SetACL 도구(다운로드)(문서)를 이용하여 삭제가 가능합니다.
다만 주의할 점은… 이 명령어를 다른 OS가 설치된 드라이브에서 실행한다거나(-on의 타겟을 D:\Users\jungin500으로 둔다거나) 하면, 다른 OS가 아예 부팅이 안될 가능성도 있습니다. 결과적으로는 다른 OS의 사용자 입장에서는 홈 폴더에 대한 해당 사용자의 권한을 완전히 빼앗는 거니까요…

setacl -on C:\Users\jungin500 -ot file -actn delorphanedsids -os dacl -rec cont

이 명령어를 cmd 관리자 권한으로 실행하면 C:\Users\jungin500 디렉토리 내의 Orphan SID를 전부 제거할 수 있습니다. 현재 OS 입장에서 다른 OS의 SID는 등록되어 있지 않기 때문에, Orphan SID로 취급되어 삭제됩니다.

C:\Users\jungin500 폴더 내 Orphan SID를 삭제하는 과정

이유

위와 같은 “이 폴더에 액세스할 수 있는 권한이 없습니다”라고 뜨는 이유는, 지금 실행중인 Windows 사용자의 SID와 접근하려고 하는 다른 파티션에 설치된 Windows 사용자의 SID가 서로 다르기 때문입니다. SID는 아래에서 계속 설명합니다.

먼저 Windows는 다중 사용자가 사용 가능한 OS입니다. 이러한 환경에서 각 사용자는 각각 사람이 만든 (jungin500과 같은)사용자명 외에도 고유한 번호인 SID (Security Identifier)가 부여됩니다. SID는 사용자가 만들어질 때 랜덤하게 부여되는 고유 번호입니다. 같은 사용자명이라고 해도 OS 설치마다 다른 SID가 부여됩니다.

S 1 5 21-3623811015-3361044348-30300820 1013
The string is an SID. The revision level (the version of the SID specification). The identifier authority value. Subauthority value
In this case, a domain (21) with a unique identifier.There may be more than one subauthority,especially if the account exists on a domainand belongs to different groups.[1]
Relative ID (RID). Any group or user that is not created by default will have a Relative ID of 1000 or greater.
SID의 구조 (출처)

Windows는 Windows NT 시절부터 NTFS라는 파일시스템을 사용해왔으며, 이 파일시스템에는 Access Control 기능이 내장되어 있습니다. OS는 NTFS 파일시스템을 통해 모든 파일과 폴더에 대한 ACL(Access Control List)을 관리하며, 어떤 사용자가 특정 폴더나 파일에 접근(일반적으로 읽기/쓰기/수정/실행으로 나뉩니다)하려고 할 때 이 ACL을 참조하여 사용자에게 접근 권한을 허용할지, 거부할지를 결정합니다. 이 ACL에는 사용자의 식별자로서 SID를 사용합니다.

현재 설치된 OS는 (다른 파티션에 설치된) 다른 OS의 사용자의 SID를 알 수 없으므로, 말그대로 “알 수 없는 계정”라는 이름으로 표시됩니다.

참고자료

혹시나 제가 잘못 이해했거나 틀렸던 부분이 있다면 댓글로 남겨주세요.

Windows 11 안드로이드 어플리케이션 구동하기

얼마전 Windows 11이 출시되기 이전, 초기 버전에서는 안드로이드 앱 구동 지원이 안될 것이라는 뉴스가 있었습니다. 실제로 얼마전 출시된 Windows 11 정식 버전에서는 해당 지원이 빠져 있었습니다.

하지만 바로 몇 시간전, Windows Insider Preview 버전에서 안드로이드 어플리케이션을 구동할 수 있도록 베타 지원이 시작되었습니다. 아직 정식버전은 아니지만, 쓸만한 것일지 한번 설치해보고, 어플리케이션이 잘 열리는지 아주 간단히 테스트해보았습니다.

키워드: Windows 11 안드로이드, 윈도우11 안드로이드, Windows Subsystem for Android, WSA

요구 사항

아래 적힌 요구사항 중 “미국이어야 함” 조건은, Windows Store에서 앱을 다운로드하는데 필요한 조건입니다. 어플리케이션을 수동으로 설치하는 방법을 이용하면 미국으로 바꾸지 않으셔도 됩니다. 여기서는 국가가 한국인 설정 상태에서 미국으로 바꾸지 않고 진행하겠습니다. (그러면 어플리케이션은 adb를 이용해 수동으로 설치해야 합니다.)

  • Windows 11 Insider Preview (Build 22000.xxx) // 22000.282에서 테스트 완료
  • UEFI BIOS에서 가상화 기능 활성
  • PC의 지역이 미국이여야 하며 미국 Amazon 계정이 있어야 함
    → 이 부분의 경우 안드로이드 어플리케이션을 Microsoft Store에서 다운로드하는데만 필요함!
  • Windows 11 Insider Preview가 Beta 채널에 있어야 함 // Preview 채널에서 테스트 완료

먼저 Microsoft Store를 업그레이드하자(버전 22110.1402.6).

1. 먼저 Windows Store를 업그레이드하기 위해 MsixBundle 파일을 다운로드받아야 합니다.

2. 아래 사이트에 접속합니다.

https://store.rg-adguard.net/

3. 우측 드롭다운 메뉴의 “Slow“를 선택합니다.

4. 아래 Microsoft Store 링크를 입력하고 체크 표시를 클릭하여 검색합니다.
아래 링크는 “Microsoft Store” 앱을 설치할 수 있는 Microsoft Store 링크입니다. 재귀함수

https://www.microsoft.com/store/productId/9WZDNCRFJBMP

5. 검색 결과 리스트 아이템들 중 맨 아래에 있는 msixbundle 확장자의 파일을 다운로드합니다.
(미러도 제공해드립니다!)

맨 아래에 있는 76.02 MB의 msixbundle 파일.

6. 해당 파일을 설치하기 위해서 Powershell을 관리자 권한으로 Open합니다.

7. 다운로드받은 폴더를 C:\Users\jungin500\Downloads라고 했을 때, 아래와 같이 명령어를 입력하여 설치를 시작합니다.

> cd C:\Users\jungin500\Downloads\
> Add-AppxPackage .\Microsoft.WindowsStore_22110.1402.6.0_neutral___8wekyb3d8bbwe.Msixbundle

8. 마지막 명령어를 통해 설치가 시작됩니다.

다음으로 안드로이드 구동 패키지를 설치하자.

1. 이전 챕터와 비슷한 과정을 한번 더 진행합니다. 이번에는 1.2GB짜리 Msixbundle 파일을 설치합니다. 패키지에 들어있는 앱 이름은 “Windows Subsystem for Android™” 입니다.

안드로이드 구동을 위해 설치해야 하는 Windows App 패키지.
이렇게 생겼습니다.

2. 다운로드 위치는:

https://store.rg-adguard.net/

3. 그리고 Windows Store 링크는:

https://www.microsoft.com/store/productId/9P3395VX91NR

4. 마찬가지로 다운로드받아 아래 파일을 얻을 수 있습니다(Slow로 바꾸는 부분도 중요합니다!)(미러!)

MicrosoftCorporationII.WindowsSubsystemForAndroid_1.7.32815.0_neutral_~_8wekyb3d8bbwe.msixbundle

5. 동일하게 Powershell (관리자 실행)로 설치합니다. 그러면 시작 메뉴에 새로운 어플리케이션이 설치됩니다.

Android Studio는 제가 따로 설치한 것이니 무시해주세요.
안은 이렇게 생겼습니다.

사용법은?

사실상 저 안을 들여다보면 어디에도 어플리케이션을 구동할 수 있는 것이 있어 보이지는 않습니다. 여기서부터, 안드로이드 어플리케이션 설치 방법이 두 가지로 나뉩니다.

  1. 지역이 미국이라면 Windows Store 안에서 Amazon Store 로그인 후 Android 어플리케이션을 다운로드받으실 수 있으실 것입니다 (아마도… 테스트해보지는 않았습니다.)
  2. adb를 이용해서 수동으로 어플리케이션을 설치합니다.

사실상 아직까지는 adb를 이용하는 방법밖에 없는 것 같습니다. 추후에 더 좋은 방법을 찾을 수도 있을것 같습니다. 이제 adb를 이용해서 apk 파일 하나를 설치 진행해보도록 하겠습니다.

adb로 어플리케이션 설치하기

먼저 설치할 어플리케이션의 apk가 필요합니다. apk는 각종 다운로드받는 사이트들에서 찾을수 있지만, 불법인곳도 많고 정식 apk인줄 알고 받았는데 알고보니 멜웨어… 일수도 있으니, 실제 스마트폰에 설치된 apk를 가져오는게 더 안전할듯 합니다.

저는 원신 apk를 준비했습니다.

apk 파일 설치에 앞서, 먼저 adb를 구합니다. adb는 Android Studio를 설치하고 Android SDK의 platform-tools를 설치하면 그 안에 있습니다.. 여기에 관련된 내용이 소개되어 있습니다.

아까 Windows Subsystem for Android™ 앱을 들어가면 “개발자 모드”가 있습니다. 이부분을 활성화 시켜줍니다. 그리고 바로 아래 “개발자 설정 관리”에 들어감과 동시에 Android가 부팅됩니다.

ADB 주소가 같이 뜹니다. 어차피 켤때마다 바뀔테니, 공개해도 괜찮겠죠.

이 주소로 adb를 연결해봅니다. 아래 명령어를 이용해 네트워크를 이용한 ADB 연결을 진행합니다. (마치 이 과정은 안드로이드 스마트폰을 USB에 연결하는 것과 비슷합니다.)

adb connect 127.0.0.1:58526

분명 포트는 다를테니, 한번 꼭 확인해보세요. 저 명령어로 연결이 되면 connected to 127.0.0.1:58526 라고 표시됩니다. 이제부터는 adb install이나 adb shell 같은 명령어를 사용할 수 있게 됩니다. 어플리케이션을 설치하려면 apk 파일이 있는 곳으로 이동하여 아래와 같이 입력합니다.

adb install "Genshin Impact 2.2.0.apk"

이 명령어가 잘 실행되었다면, 무려 윈도우 시작 메뉴에 Android 어플리케이션 바로가기가 나타납니다.

와! Android 원신이다!

결론

실제로 실행되는 어플리케이션이 대부분이겠지만, 아직은 베타니까 안되는 경우도 많을 것입니다. 원신의 경우도 계속 튕겨서 재시도해봤는데, 세번째로 켜니까 이제 되네요. 이것저것 한번 테스트해볼수 있을 것 같습니다.

안드로이드 어플리케이션이 윈도우에서 구동 가능하다면 이점들이 많을것 같습니다. 당장 생각나는건 게임뿐이지만, 생산성 관련한 어플리케이션 등을 설치해서 다양하게 활용할 수 있을것 같습니다.

문제점이 있거나 더 좋은 방식이 있다면 댓글로 남겨 주세요.

참고자료

[해결됨] WSL2 CUDA undefined symbol: devicesetgpcclkvfoffset 문제 해결하기

[추가] 현재는 Fix된 이슈임

Windows 11 Insider Preview Build 22000.51이 나온 뒤에는 해결된 문제입니다. 아래 환경에서 테스트하였으니 apt 패키지와 드라이버를 업데이트 해보시기 바랍니다.

  • OS: Windows 11 Insider Preview Build 22000.51
  • Driver: NVIDIA 470.76
  • APT Package Version List
Inst libnvidia-container1 (1.4.0-1 NVIDIA CORPORATION [email protected]:1.0/bionic [amd64])
 Inst libnvidia-container-tools (1.4.0-1 NVIDIA CORPORATION [email protected]:1.0/bionic [amd64])
 Inst nvidia-container-toolkit (1.5.1-1 NVIDIA CORPORATION [email protected]:1.0/bionic [amd64])
 Inst nvidia-container-runtime (3.5.0-1 NVIDIA CORPORATION [email protected]:1.0/bionic [amd64])
 Inst nvidia-docker2 (2.6.0-1 NVIDIA CORPORATION [email protected]:1.0/bionic [all])
 Conf libnvidia-container1 (1.4.0-1 NVIDIA CORPORATION [email protected]:1.0/bionic [amd64])
 Conf libnvidia-container-tools (1.4.0-1 NVIDIA CORPORATION [email protected]:1.0/bionic [amd64])
 Conf nvidia-container-toolkit (1.5.1-1 NVIDIA CORPORATION [email protected]:1.0/bionic [amd64])
 Conf nvidia-container-runtime (3.5.0-1 NVIDIA CORPORATION [email protected]:1.0/bionic [amd64])
 Conf nvidia-docker2 (2.6.0-1 NVIDIA CORPORATION [email protected]:1.0/bionic [all])

Environment: Windows 10 Insider Preview Build 21376.1
WSL2 Ubuntu release: 20.04
NVIDIA Forum Links: https://forums.developer.nvidia.com/t/nvidia-container-cli-error/177403/2?u=ji5489

문제 제기

if I run sudo nvidia-container-cli -k -d /dev/tty info

I got this error
where is ‘devicesetgpcclkvfoffset’ symbol?

– WARNING, the following logs are for debugging purposes only –
I0509 06:20:58.858216 1009 nvc.c:372] initializing library context (version=1.4.0, build=704a698b7a0ceec07a48e56c37365c741718c2df)
I0509 06:20:58.858281 1009 nvc.c:346] using root /
I0509 06:20:58.858287 1009 nvc.c:347] using ldcache /etc/ld.so.cache
I0509 06:20:58.858293 1009 nvc.c:348] using unprivileged user 65534:65534
I0509 06:20:58.858311 1009 nvc.c:389] attempting to load dxcore to see if we are running under Windows Subsystem for Linux (WSL)
I0509 06:20:58.891385 1009 dxcore.c:226] Creating a new WDDM Adapter for hAdapter:40000000 luid:1e946dc
I0509 06:20:58.917427 1009 dxcore.c:267] Adding new adapter via dxcore hAdapter:40000000 luid:1e946dc wddm version:3000
I0509 06:20:58.917515 1009 dxcore.c:325] dxcore layer initialized successfully
W0509 06:20:58.918854 1009 nvc.c:397] skipping kernel modules load on WSL
I0509 06:20:58.919404 1010 driver.c:101] starting driver service
E0509 06:20:58.950931 1010 driver.c:168] could not start driver service: load library failed: /usr/lib/wsl/drivers/nv_dispi.inf_amd64_43efafcd74b2efc9/libnvidia-ml.so.1: undefined symbol: devicesetgpcclkvfoffset
I0509 06:20:58.951399 1009 driver.c:203] driver service terminated successfully
nvidia-container-cli: initialization error: driver error: failed to process request

해결방법

I’m currently installing WSL2 Ubuntu 20.04 within Windows 10 Insider Preview Build 21376.1, and faced same issue like below.

# sudo nvidia-container-cli -k -d /dev/tty info

-- WARNING, the following logs are for debugging purposes only --

I0512 07:05:58.485519 5592 nvc.c:372] initializing library context (version=1.4.0, build=704a698b7a0ceec07a48e56c37365c741718c2df)
I0512 07:05:58.485581 5592 nvc.c:346] using root /
I0512 07:05:58.485601 5592 nvc.c:347] using ldcache /etc/ld.so.cache
I0512 07:05:58.485604 5592 nvc.c:348] using unprivileged user 65534:65534
I0512 07:05:58.485659 5592 nvc.c:389] attempting to load dxcore to see if we are running under Windows Subsystem for Linux (WSL)
I0512 07:05:58.502183 5592 dxcore.c:226] Creating a new WDDM Adapter for hAdapter:40000000 luid:185673b
I0512 07:05:58.512924 5592 dxcore.c:267] Adding new adapter via dxcore hAdapter:40000000 luid:185673b wddm version:3000
I0512 07:05:58.512956 5592 dxcore.c:325] dxcore layer initialized successfully
W0512 07:05:58.513266 5592 nvc.c:397] skipping kernel modules load on WSL
I0512 07:05:58.513404 5593 driver.c:101] starting driver service
E0512 07:05:58.521931 5593 driver.c:168] could not start driver service: load library failed: /usr/lib/wsl/drivers/nv_dispi.inf_amd64_43efafcd74b2efc9/libnvidia-ml.so.1: undefined symbol: devicesetgpcclkvfoffset
I0512 07:05:58.522047 5592 driver.c:203] driver service terminated successfully
nvidia-container-cli: initialization error: driver error: failed to process request

and I found out that apt-get experimental repository and stable one is mixed out – failing to install WSL2 one (which is available in experimental repository). as stable package is released, experimental(=WSL2) package should be released, but It wasn’t. see apt-cache madison result below.

# apt-cache madison libnvidia-container1
libnvidia-container1 |    1.4.0-1 | https://nvidia.github.io/libnvidia-container/stable/ubuntu18.04/amd64  Packages
libnvidia-container1 |    1.3.3-1 | https://nvidia.github.io/libnvidia-container/stable/ubuntu18.04/amd64  Packages
libnvidia-container1 | 1.3.3~rc.2-1 | https://nvidia.github.io/libnvidia-container/experimental/ubuntu18.04/amd64  Packages
libnvidia-container1 | 1.3.3~rc.1-1 | https://nvidia.github.io/libnvidia-container/experimental/ubuntu18.04/amd64  Packages
libnvidia-container1 |    1.3.2-1 | https://nvidia.github.io/libnvidia-container/stable/ubuntu18.04/amd64  Packages
libnvidia-container1 |    1.3.1-1 | https://nvidia.github.io/libnvidia-container/stable/ubuntu18.04/amd64  Packages

The point is, we should install libnvidia-container1=1.3.3~rc.2-1 version rather than libnvidia-container1=1.4.0-1. but normal apt-get install nvidia-docker2 command would install 1.4.0-1 version, and It mostly like to fail in WSL2 environment.

I successfully installed older (WSL2-exclusive) packages via apt-get install command below:

apt-get install \
    libnvidia-container1=1.3.3~rc.2-1 \
    libnvidia-container-tools=1.3.3~rc.2-1 \
    nvidia-container-toolkit=1.4.1-1 \
    nvidia-container-runtime=3.4.1-1 \
    nvidia-docker2=2.5.0-1

Those commands will install older packages, and after sudo service docker stop and sudo service docker start, CUDA will work inside docker.