Microsoft MVP성태의 닷넷 이야기
Linux: 51. WSL - init에서 systemd로 전환하는 방법 [링크 복사], [링크+제목 복사],
조회: 15071
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
(연관된 글이 1개 있습니다.)
(시리즈 글이 3개 있습니다.)
Linux: 51. WSL - init에서 systemd로 전환하는 방법
; https://www.sysnet.pe.kr/2/0/13104

Windows: 210. WSL에 systemd 도입
; https://www.sysnet.pe.kr/2/0/13127

개발 환경 구성: 669. WSL 2의 (init이 아닌) systemd 지원
; https://www.sysnet.pe.kr/2/0/13278




WSL - init에서 systemd로 전환하는 방법

(업데이트: 2023-03-08) 현재 systemd를 지원하는 WSL 2 정식 버전이 Windows 11에 적용돼 있습니다.




(현재, 마이크로소프트에서 WSL 0.67.6부터 systemd를 도입했습니다.)




간혹, WSL에서 프로그램을 설치하다 보면 systemd 환경이 아니라고 오류가 발생할 수 있습니다.

$ ./install.sh

👋 Thank you for trying out SigNoz!

🟡 Running installer with non-sudo permissions.
   In case of any failure or prompt, please consider running the script with sudo privileges.

🌏 Detecting your OS ...

🐳 Starting Docker ...

System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down
Starting docker service
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down
🔴 The containers didn't seem to start correctly. Please run the following command to check containers that may have errored out:

 docker-compose -f ./docker/clickhouse-setup/docker-compose.yaml ps -a
or reach us for support in #help channel in our Slack Community https://signoz.io/slack
++++++++++++++++++++++++++++++++++++++++

📨 Please share your email to receive support with the installation

We will reach out to you at the email provided shortly, Exiting for now. Bye! 👋

해당 프로그램이 systemd로 관리되는 서비스를 사용하는 경우일 텐데요, 일례로 다음과 같이 실행할 때 발생하는 오류와 동일합니다.

$ sudo systemctl status time-sync.target
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down

그런 경우 WSL은 루트 시스템 프로세스가 init이기 때문인데,

$ pstree
init─┬─init─┬─init───docker-desktop-───14*[{docker-desktop-}]
     │      └─init───docker───20*[{docker}]
     ├─init───init───bash───pstree
     └─2*[{init}]

근래 들어 리눅스 진영은 init에서 systemd로 바뀌는 추세라고 하며, WSL은 아직 그것을 반영하지 못하고 있는 것입니다. (init을 윈도우 시스템으로 치자면 wininit.exe 정도라고 보면 될 듯합니다.)

이와 관련해 검색해 보면, 이런 소식이 2021년 11월에 있었습니다.

Ubuntu desktop team teases 'proof of concept' systemd on Windows Subsystem for Linux
; https://www.theregister.com/2021/11/17/ubuntu_team_systemd_windows_wsl2/

그런데 이후로 소식이 없군요. ^^ 대신 github에 공개된 프로젝트가 있는데,

arkane-systems/genie
; https://github.com/arkane-systems/genie

위의 것을 사용하면 WSL에서도 init 시스템에서 systemd 체계로 바꿀 수 있습니다. 실제로 한번 해볼까요? ^^ 방법은, repo 등록을 하거나 아니면 deb 설치 파일을 직접 다운로드해,

$ wget --content-disposition "https://github.com/arkane-systems/genie/releases/download/v2.4/systemd-genie_2.4_amd64.deb"

설치하면 됩니다.

$ sudo apt-get install -y daemonize systemd-container

$ sudo dpkg -i systemd-genie_2.4_amd64.deb

혹은, 위의 설치와 관련된 잡다한 작업을 해주는 설치 파일을 사용해도 좋습니다.

Enable systemd in WSL 2
; https://gist.github.com/djfdyuruiry/6720faa3f9fc59bfdf6284ee1f41f950

$ cd /tmp 

$ wget --content-disposition "https://gist.githubusercontent.com/djfdyuruiry/6720faa3f9fc59bfdf6284ee1f41f950/raw/952347f805045ba0e6ef7868b18f4a9a8dd2e47a/install-sg.sh"

$ chmod +x /tmp/install-sg.sh

$ /tmp/install-sg.sh && rm /tmp/install-sg.sh

이후 wsl 인스턴스를 종료하고 다시 실행해야 하는데요, 이때 기존처럼 시작하면 여전히 init으로 초기화가 됩니다. 즉, 명시적으로 systemd를 사용하라고 해야 하는데요, 이를 위해 윈도우 명령행에서 wsl을 경유해 다음과 같이 실행해 줍니다.

// 특정 인스턴스만 종료하고 싶다면
// wsl -t [인스턴스명]

// 속 편하게 모든 wsl 인스턴스를 종료한 후,
// wsl --shutdown

// systemd를 초기 프로세스로 부팅
c:\temp> wsl genie -s

그런데, 실제로 해보니까 다음과 같이 일부 서비스가 failed 상태입니다.

c:\temp> wsl genie -s
genie: WARNING: systemd default target is default.target; targets other than multi-user.target may not work
genie: WARNING: if you wish to use a different target, this warning can be disabled in the config file
genie: WARNING: if you experience problems, please change the target to multi-user.target
Waiting for systemd....!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
genie: systemd did not enter running state (degraded) after 240 seconds
genie: this may be due to a problem with your systemd configuration
genie: information on problematic units is available at https://github.com/arkane-systems/genie/wiki/Systemd-units-known-to-be-problematic-under-WSL
genie: a list of failed units follows:

  UNIT                       LOAD   ACTIVE SUB    DESCRIPTION
● systemd-remount-fs.service loaded failed failed Remount Root and Kernel File Systems
● multipathd.socket          loaded failed failed multipathd control socket

LOAD   = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB    = The low-level unit activation state, values depend on unit type.

2 loaded units listed.
genie: WARNING: systemd is in degraded state, issues may occur!

$

하지만 어쨌든 init 초기 프로세스가 systemd로 교체되긴 했습니다.

$ pstree
systemd─┬─ModemManager───2*[{ModemManager}]
        ├─NetworkManager───2*[{NetworkManager}]
        ...[생략]...
        ├─unattended-upgr───{unattended-upgr}
        └─wpa_supplicant

실제로 테스트도 잘 됩니다.

$ sudo systemctl status time-sync.target
● time-sync.target - System Time Synchronized
     Loaded: loaded (/lib/systemd/system/time-sync.target; static; vendor preset: disabled)
     Active: active since Wed 2022-07-20 15:07:34 KST; 1h 15min ago
       Docs: man:systemd.special(7)

Jul 20 15:07:34 Kevin10-wsl systemd[1]: Reached target System Time Synchronized.

그럼에도 불구하고 2가지 오류가 거슬린다면, 혹은 거슬리지 않더라도 시작하는데 4분이 소요되는 것은 참기 힘들기 때문에 다음의 글에 따라 수정하셔도 좋습니다.

WSL - systemd-genie와 관련한 2가지(systemd-remount-fs.service, multipathd.socket) 에러
; https://www.sysnet.pe.kr/2/0/13103

참고로, 위와 같이 systemd로 바꾸는 것은 WSL 2 인스턴스만 가능하며, 그 외에 한 가지 눈에 띄는 부작용이 있다면, 이후로는 WSLg가 동작하지 않는다는 점입니다.

$ xclock
Error: Can't open display: :0




다음과 같은 오류가 발생한다면?

$ sudo apt-get install -y python3-psutil
Reading package lists... Done
Building dependency tree
Reading state information... Done
You might want to run 'apt --fix-broken install' to correct these.
The following packages have unmet dependencies:
 systemd-genie : Depends: daemonize but it is not going to be installed
                 Depends: systemd-container (>= 232-25) but it is not going to be installed
E: Unmet dependencies. Try 'apt --fix-broken install' with no packages (or specify a solution).

딴 생각하지 마시고, ^^ 알려주는 대로 그냥 --fix-broken install 옵션을 줘 실행하면 됩니다.

$ sudo apt --fix-broken install
Reading package lists... Done
Building dependency tree
...[생략]...
Processing triggers for dbus (1.12.16-2ubuntu2.2) ...

$ sudo apt-get install -y python3-psutil
Reading package lists... Done
Building dependency tree
Reading state information... Done
python3-psutil is already the newest version (5.5.1-1ubuntu4).
python3-psutil set to manually installed.
The following packages were automatically installed and are no longer required:
  libfwupdplugin1 libpq5
Use 'sudo apt autoremove' to remove them.
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]






[최초 등록일: ]
[최종 수정일: 10/16/2023]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




1  2  [3]  4  5  6  7  8  9  10  11  12  13  14  15  ...
NoWriterDateCnt.TitleFile(s)
13747정성태9/28/20241428닷넷: 2300. C# - OpenSSH의 공개키 파일에 대한 "BEGIN OPENSSH PUBLIC KEY" / "END OPENSSH PUBLIC KEY" PEM 포맷파일 다운로드1
13746정성태9/28/20241477오류 유형: 924. Python - LocalProtocolError("Illegal header value ...")
13745정성태9/28/20241361Linux: 80. 리눅스 - 실행 중인 프로세스 내부의 환경변수 설정을 구하는 방법 (lldb)
13744정성태9/27/20242135닷넷: 2299. C# - Windows Hello 사용자 인증 다이얼로그 표시하기파일 다운로드1
13743정성태9/26/20241881닷넷: 2298. C# - Console 프로젝트에서의 await 대상으로 Main 스레드 활용하는 방법 [1]
13742정성태9/26/20242322닷넷: 2297. C# - ssh-keygen으로 생성한 ecdsa 유형의 Public Key 파일 해석 [1]파일 다운로드1
13741정성태9/25/20241769디버깅 기술: 202. windbg - ASP.NET MVC Web Application (.NET Framework) 응용 프로그램의 덤프 분석 시 요령
13740정성태9/24/20241835기타: 86. RSA 공개키 등의 modulus 값에 0x00 선행 바이트가 있는 이유(ASN.1 인코딩)
13739정성태9/24/20241635닷넷: 2297. C# - ssh-keygen으로 생성한 Public Key 파일 해석과 fingerprint 값(md5, sha256) 생성 [1]파일 다운로드1
13738정성태9/22/20241395C/C++: 174. C/C++ - 윈도우 운영체제에서의 file descriptor, FILE*파일 다운로드1
13737정성태9/21/20241889개발 환경 구성: 727. Visual C++ - 리눅스 프로젝트를 위한 빌드 서버의 msbuild 구성
13736정성태9/20/20241566오류 유형: 923. Visual Studio Code - Could not establish connection to "...": Port forwarding is disabled.
13735정성태9/20/20241792개발 환경 구성: 726. ARM 플랫폼용 Visual C++ 리눅스 프로젝트 빌드
13734정성태9/19/20241780개발 환경 구성: 725. ssh를 이용한 원격 docker 서비스 사용
13733정성태9/19/20241667VS.NET IDE: 194. Visual Studio - Cross Platform / "Authentication Type: Private Key"로 접속하는 방법
13732정성태9/17/20241788개발 환경 구성: 724. ARM + docker 환경에서 .NET 8 설치
13731정성태9/15/20242352개발 환경 구성: 723. C# / Visual C++ - Control Flow Guard (CFG) 활성화 [1]파일 다운로드2
13730정성태9/10/20241769오류 유형: 922. docker - RULE_APPEND failed (No such file or directory): rule in chain DOCKER
13729정성태9/9/20242227C/C++: 173. Windows / C++ - AllocConsole로 할당한 콘솔과 CRT 함수 연동 [1]파일 다운로드1
13728정성태9/7/20241933C/C++: 172. Windows - C 런타임에서 STARTUPINFO의 cbReserved2, lpReserved2 멤버를 사용하는 이유파일 다운로드1
13727정성태9/6/20242475개발 환경 구성: 722. ARM 플랫폼 빌드를 위한 미니 PC(?) - Khadas VIM4 [1]
13726정성태9/5/20242669C/C++: 171. C/C++ - 윈도우 운영체제에서의 file descriptor와 HANDLE파일 다운로드1
13725정성태9/4/20241678디버깅 기술: 201. WinDbg - sos threads 명령어 실행 시 "Failed to request ThreadStore"
13724정성태9/3/20243014닷넷: 2296. Win32/C# - 자식 프로세스로 HANDLE 상속파일 다운로드1
13723정성태9/2/20243876C/C++: 170. Windows - STARTUPINFO의 cbReserved2, lpReserved2 멤버 사용자 정의파일 다운로드2
13722정성태9/2/20241725C/C++: 169. C/C++ - CRT(C Runtime) 함수에 의존성이 없는 프로젝트 생성
1  2  [3]  4  5  6  7  8  9  10  11  12  13  14  15  ...