시스템 프로그래밍/리눅스

WSL에서 커널 컴파일하기

맛있는김치찜 2020. 10. 17. 16:39

서론

WSL(Windows Subsystem for Linux)은 리눅스 시스템을 NT커널에 탑재하여 리눅스의 주요 기능을 사용할 수 있는 시스템이다.

WSL1이 리눅스를 NT커널에서 드라이브를 통해 돌리는 반면, WSL2는 Hyper-V기술을 이용해 진짜 리눅스 커널을 탑재했다.

위 그림을 보면 리눅스커널이 Hyper-V위에서 NT 커널과 함께 병렬적으로 돌아간다는 것을 확인할 수 있다.

wsl2에서는 윈도우 C 드라이브를 /mnt/c에 마운트해서 사용자 파일을 접근하는 것도 가능하다.

 

커널 컴파일 하기

우선 이 실습은 wsl2에서 진행된다.

wsl version1을 사용중이라면 wsl2로 업데이트 하고 실습해야한다.

 

wsl2에서는 실제 리눅스 커널을 탑재했으니 커널 컴파일도 가능하다.

단, wsl2에는 흔히 볼 수 있는 리눅스 커널이 아니라 microsoft-standard라고 불리는 살짝 변형한 버전이 탑재되어 있다.

wsl의 특징을 고려해 마이크로소프트에서 약간의 수정을 한것 같은데, 자세한 사항은 조금 더 찾아봐야겠다.

현재 커널 버전은 4.19.128이고, 현 시점에서 최신 버전은 4.19.84로 확인했다.

 

과정1)

우선 github.com/microsoft/WSL2-Linux-Kernel에서 wsl전용 리눅스 커널 최신 버전을 다운받는다.

본인은 그냥 다음과 같이 git clone 시켰다.

아무래도 용량이 좀 되다보니 시간이 좀 걸렸다.

 

과정2)

다음으로 커널 컴파일에 필요한 패키지들을 설치한다.

 

과정3 - 선택사항)

이왕 커널 컴파일을 직접 하는김에 커널 이름을 한번 설정해보자

다음 위치로 가서 config-wsl파일을 수정한다.

본인은 뒤에 Happy라는 단어만 추가했다. ㅎ

 

과정4)

make를 이용해 폴더속 파일들을 컴파일한다.

make다음에 오는 첫번째 매개변수는 config파일의 위치이고, 두번째 매개변수는 몇개의 프로세스를 만들어서 병렬적으로 수행할지 선택하는 옵션이다.

각자의 cpu 코어 수를 확인하고 넣으면 된다.

도중에 다음과 같은 선택창이 나왔다.

TSX(Transactional Synchronization eXtension)는 멀티코어를 사용하는 소프트웨어의 성능 향상을 위해 intel에서 만든 명령어 집합이다.

하지만 보안문제등 여러 치명적인 오류가 발생하여 intel에서 비활성화 하는 업데이트를 배포했다고 한다.

그러므로 본인은 1번을 선택하여 비활성화 했다. 

다음과 같이 익숙한 화면이 뜨면서 컴파일이 진행된다.

15분정도 지나니 컴파일이 완료되었다.

평소에 리눅스커널을 컴파일 한 시간보다 훨씬 짧게 걸렸는데 이 커널에는 잡다한 드라이버들이 없어서 그런게 아닐까? 라고 추측해본다.

 

과정4)

폴더 내부를 살펴보면 vmlinux라고 커널 이미지 파일이 생성되어 있다.

이 이미지는 커널과 드라이버 등등이 들어있는 raw binary file이다.

 

이 파일을 위과 같이 사용자 폴더 안에 복사한다.

그런 다음 폴더 내부에 .wslconfig파일을 생성하고

다음과 같은 내용을 추가한다.

이것은 wsl이 우리가 컴파일한 커널 파일을 인식하도록 하는 일종의 트릭이다.

이 과정을 통해 wsl은 Hyper-V에 올릴 커널의 경로를 확인하여 wsl2에 결합해서 사용할 수 있게 만든다.

 

과정5)

거의 다 끝났다.

마지막으로 powershell에서 wsl --shutdown Ubuntu 명령을 입력하여 wsl을 강제종료 시킨다.

--shutdown 뒤에 Ubuntu를 입력했는데 여러분이 사용하는 리눅스 배포판 버전을 입력하면 된다.

그리고 wsl을 다시 실행시키면

위와 같이 우리가 컴파일한 커널이 잘 올라간 것을 확인할 수 있다.

 

마치며

wsl은 윈도우에서도 리눅스 개발 환경을 구축해준다는 점에서 매우 획기적인 프로그램이다.

심지어 wsl2는 실제 리눅스 커널을 탑재하여 위와 같이 커널 컴파일 과정도 거칠 수 있다.

비록 이번에는 커널 이름만 바꾸고 최신 커널로 업데이트 하는 과정에서 끝났지만, 조금 더 수정하면 우리만의 wsl전용 커널을 만드는 것도 충분히 가능할 것 같다.

 

 

출처: microhobby.com.br/blog/2019/09/21/compiling-your-own-linux-kernel-for-windows-wsl2/