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