티스토리 뷰

 

4학년 2학기 클라우드 컴퓨팅 수업 프로젝트 과제 협업을 위해 팀원이 보내준 Dockerfile을 내 원격 WSL에 전송하던 중 발생한 오류를 해결하기 위해 타고 타고 가다가 발견한 근본적인 원인은 바로 'Systemd'가 아직 내 WSL에 적용되지 않았다는 것이다.

 

여러 블로그부터 깃허브, 스택오버플로우까지 다 찾아봤지만 결국 해결해 준 것은 윈도우의 공식 문서였다. 

나의 해결 방법을 공유해보려고 한다.

0. 오류 화면

$ sudo systemctl status 

System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down

에러 메시지: System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down

 

우선 systemctl, ssh와 관련한 모든 명령어가 사용되지 않는다. 당연히 scp를 사용한 파일 전송도 불가하다. 

원인은 WSL은 루트 시스템 프로세스가 systemd가 아닌 init이기 때문이다. 

 

이는, pstree 명령어를 사용해 확인할 수 있는데, pstree는 실행되고 있는 프로세스들 간 연결 구조를 트리 형식으로 보여준다.

 

$ pstree
init─┬──init───init───bash───pstree
     └─2*[{init}]

➡️ 모든 프로세스에서 init으로 실행되고 있는 것을 확인할 수 있다.

현재 리눅스는 init에서 systemd로 바뀌고 있고, WSL도 이에 맞추어 systemd를 사용하도록 변경해줘야 한다.

1. WSL 버전 확인 및 최신 버전 다운로드

WSL 버전이 0.67.6 이상인지 확인해야 한다. 명령어는 wsl --version으로 확인할 수 있다.

업데이트는 wsl --update를 실행하면 된다. 

 

나의 경우에는 두 명령어가 모두 실행이 되지 않아서 그냥 Microsoft Store에서 최신 버전을 다운로드했다.

 

기존 WSL을 지우거나 수정할 필요 없이 그냥 위의 항목을 다운로드하면 알아서 적용된다.

성공적으로 업데이트하면 WSL 아이콘에 완전 초면인 NEW 펭귄이 있다. 새로운 버전에 맞추어 업데이트한 펭귄인 것 같은데 원래 펭귄이 더 귀여웠던 것 같다.. 큼

2. /etc/wsl.conf 파일 작성하기

cd /를 입력하여 루트 디렉터리에 액세스 한 뒤,

$ cd /
$ sudo vi /etc/wsl.conf

 

 vi /etc/wsl.conf 파일을 아래와 같이 작성한다. ( i 눌러서 --insert-- 모드에서 작성 후 :wq 눌러서 저장하고 나오기)

[boot]
systemd=true

etc 디렉터리는 배포에 대한 WSL 구성 파일이 포함되어 있다. 편집기는 vi나 nano를 사용하면 된다.

3. 재부팅

이제 리눅스 배포를 닫고 모든 WSL 인스턴스 재시작하면 끝이다. 명령어는 아래와 같다.

wsl.exe --shutdown

이 명령어를 입력하면 WSL이 꺼졌다가 자동으로 다시 시작되면서 systemd가 실행된다.

Linux 배포와 연결된 모든 서비스의 상태를 표시하는 아래 명령어를 사용해서 확인할 수 있다.

systemctl list-unit-files --type=service

4. 해결 완료

 

🔎참고자료

 

Systemd를 사용하여 WSL로 Linux 서비스 관리

Systemd를 사용하여 Linux용 Windows 하위 시스템을 사용하여 Linux 서비스를 관리하는 방법을 알아봅니다.

learn.microsoft.com

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함