WSL에서 eBPF 사용하기

WSL(Windows Subsystem for Linux)은 윈도우 사용자가 유용하게 쓸 수 있는 리눅스 플랫폼이지만, 아직 리눅스의 모든 기능을 100% 활용할 수 있는 건 아니다.

eBPF 역시 기본 WSL에서는 지원되지 않는다. 커스텀 커널을 빌드하면 WSL에서도 eBPF를 사용할 수 있다.

이 글의 내용은 WSL 2에만 해당된다.

커널 빌드

WSL2 커널 리포지토리에서 커널 소스를 받는다. Releases 페이지에서 소스 패키지를 받아도 되고, 그냥 리포지토리 통째로 클론해도 된다. 다만 윈도우 파일 시스템에다 받으면 안 되고, 리눅스 파일 시스템에 받아야 한다.

# 여기서는 5.15.83.1 버전 커널을 사용했다.
wget https://github.com/microsoft/WSL2-Linux-Kernel/archive/refs/tags/linux-msft-wsl-5.15.83.1.tar.gz
tar -xzf linux-msft-wsl-5.15.83.1.tar.gz
cd WSL2-Linux-Kernel-linux-msft-wsl-5.15.83.1

소스를 받았으면 .config 파일을 세팅해줘야 한다. 먼저 소스의 Microsoft/config-wsl로부터 기본 세팅을 복사해준다.

cp Microsoft/config-wsl .config

이제 .config 파일을 열어서 편집하자. 아래 플래그들을 찾아서 세팅해준다. # CONFIG_IKHEADERS is not set 이런 부분을 CONFIG_IKHEADERS=y처럼 바꾸면 된다. 이 세팅이 적용되어야 eBPF 기능을 사용할 수 있다.

CONFIG_BPF=y
CONFIG_BPF_SYSCALL=y
CONFIG_NET_CLS_BPF=m
CONFIG_NET_ACT_BPF=m
CONFIG_BPF_JIT=y
CONFIG_HAVE_EBPF_JIT=y
CONFIG_BPF_EVENTS=y
CONFIG_IKHEADERS=y
CONFIG_NET_SCH_SFQ=m
CONFIG_NET_ACT_POLICE=m
CONFIG_NET_ACT_GACT=m
CONFIG_DUMMY=m
CONFIG_VXLAN=m

그리고 빌드 의존성 설치를 해준다. 우분투 기준으로 아래 명령을 실행하면 된다.

sudo apt install build-essential flex bison dwarves libssl-dev libelf-dev

빌드 실행

make

빌드 중에 몇 가지 프롬프트가 뜰 수도 있는데 나는 다 기본값으로 넘겼다. 아마 커널 보안 패치 관련 이슈인 것 같다.

빌드가 끝나면 소스의 루트 디렉터리에 vmlinux라는 파일이 생성된다. 이걸 적당한 곳에 복사해두자.

커스텀 커널 적용

윈도우의 홈 디렉터리(%UserProfile%)에 .wslconfig 파일을 작성한다.

# .wslconfig
[wsl2]
kernel=C:\\Temp\\myCustomKernel  # 방금 복사해둔 파일의 경로 입력

그리고 PowerShell에서 WSL을 종료한다. 내친 김에 WSL 업데이트도 한 번 돌려주었다.

wsl.exe --shutdown
wsl.exe --update

이제 WSL을 다시 실행시키고, uname -a 명령을 실행해본다. 대충 아래같은 형태로 나타나면 된다.

uname -a
# Linux AWESOME-PC 5.15.83.1-microsoft-standard-WSL2 #3 SMP Wed Dec 28 12:34:56 KST 2022 x86_64 x86_64 x86_64 GNU/Linux

BCC 툴킷 설치

BCC(BPF Compiler Collection)는 eBPF 프로그램을 간단하게 개발, 실행할 수 있게 해주는 도구이다.

우분투에서는 APT 패키지 매니저로 간편하게 설치할 수 있다.

sudo apt install bpfcc-tools

다른 방법으로 설치하고 싶으면 여기를 참고.

/sbin 디렉터리에 -bpfcc로 끝나는 파일들이 잔뜩 생겨난 것을 확인할 수 있다. sudo opensnoop-bpfcc를 실행해봐서 에러가 안 나면 이상없이 설치된 것이다.

Exception: Failed to detach BPF from kprobe 에러가 난다면 debugfs가 마운트되지 않은 것이 원인일 수 있다.

sudo mount -t debugfs debugfs /sys/kernel/debug

이제 WSL에서도 eBPF를 사용할 준비가 되었다. 실제로 eBPF 프로그램을 적용하는 것은 다른 글에서…


참고 자료

https://velog.io/@ruby/WSL2-커스텀-커널-빌드하기
https://github.com/iovisor/bcc/blob/master/INSTALL.md

태그:

업데이트: