티스토리 뷰
[Linux/WSL] Systemctl 명령 에러 해결 방법 | Systemd 사용하도록 설정하는 방법 | System has not been booted with systemd as init system (PID 1)
YouJungJang 2023. 11. 22. 02:19
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. 해결 완료
🔎참고자료
'Study > Linux' 카테고리의 다른 글
[Linux/WSL] SCP | 윈도우 로컬과 리눅스 원격 간 파일 전송 | scp port 22: Connection refused 해결 방법 | Connection timed out 해결 방법 (1) | 2023.11.22 |
---|