Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (seongtaejeong at gmail.com)
홈페이지
첨부 파일
 

WSL + eBPF: modprobe: FATAL: Module kheaders not found in directory

다음과 같은 오류가 발생한다면?

$ sudo bpftrace -e 'BEGIN { printf("hello\n"); }'
modprobe: FATAL: Module kheaders not found in directory /lib/modules/5.15.153.1-microsoft-standard-WSL2
Attaching 1 probe...
hello

실제로 WSL의 경우 /lib/modules 디렉터리는 텅 비어 있습니다. 검색해 보니까, 해결책이 나오는데요, ^^

Enable CONFIG_IKHEADERS=m in WSL kernel #5526
; https://github.com/microsoft/WSL/issues/5526

cd /path/to/WSL2-Linux-Kernel #check out branch corresponding to uname -r tag
make KCONFIG_CONFIG=Microsoft/config-wsl
sudo ln /path/to/WSL2-Linux-Kernel -s /lib/modules/4.19.104-microsoft-standard/build


정리해 보면, (또 다른 방법이 있는지는 알 수 없으나) 현재로서는 커널 소스를 빌드하는 수밖에는 없습니다. 따라서 지난 글에 설명한 대로 (가능하다면) 현재 설치된 버전의 WSL 커널 소스를 다운로드해 빌드하시면 됩니다. 설치를 완료했으면, 이제 다음과 같은 경로가 있어야 합니다.

// 5.15.153.1 WSL 커널 소스를 빌드하면 /lib/modules/ 디렉터리 하위에 2개의 디렉터리가 생성됩니다.
// * 5.15.153.1-microsoft-standard-WSL2
// * 5.15.153.1-microsoft-standard-WSL2+
//
// 테스트를 해보면, 저 상태에서 커널을 교체하지 않아도 (디렉터리가 이미 있으므로,
// bpftrace 명령어가 잘 동작합니다.

$ ll /lib/modules/5.15.153.1-microsoft-standard-WSL2+/build
lrwxrwxrwx 1 root root 34 Oct 22 20:50 /lib/modules/5.15.153.1-microsoft-standard-WSL2+/build -> /home/testusr/temp/WSL2-Linux-Kernel/

// 이외에도 source 경로도 링크돼 있습니다.
$ ll /lib/modules/5.15.153.1-microsoft-standard-WSL2+/source
lrwxrwxrwx 1 root root 34 Oct 22 20:50 /lib/modules/5.15.153.1-microsoft-standard-WSL2+/source -> /home/testusr/temp/WSL2-Linux-Kernel/

보시면, WSL 소스코드를 다운로드해 빌드한 경로가 (아마도 "make modules_install headers_install" 명령에서) 자동으로 /lib/modules/.../build로 링크돼 있습니다.

이후 다시 bpftrace 예제를 실행하면 아무런 오류 메시지 없이 동작할 것입니다.

$ sudo bpftrace -e 'BEGIN { printf("hello\n"); }'
Attaching 1 probe...
hello
^C




참고로 "kheaders not found"와 관련해 검색해 보면,

Issue with bcc tools execution #3686
; https://github.com/iovisor/bcc/issues/3686

오류 메시지에 CONFIG_IKHEADERS 옵션을 적용하지 않고 커널 빌드를 했기 때문이라고 나옵니다.

Unable to find kernel headers. Try rebuilding kernel with CONFIG_IKHEADERS=m (module) or installing the kernel development package for your running kernel version.
chdir(/lib/modules/5.4.0-84-generic/build): No such file or directory

실제로 WSL의 경우 해당 옵션이 비활성화돼 있습니다.

// WSL + Ubuntu 20.04 LTS

$ zcat /proc/config.gz | grep CONFIG_IKHEADERS
# CONFIG_IKHEADERS is not set

$ dpkg --get-selections | grep linux-headers-$(uname -r)
$

반면, (WSL이 아닌) 별도로 설치한 Ubuntu 22.04의 경우에는 이렇게 headers가 설치돼 있습니다.

// Ubuntu 22.04 LTS (VM)

$ cat /boot/config-$(uname -r) | grep CONFIG_IKHEADERS
CONFIG_IKHEADERS=m

$ dpkg --get-selections | grep linux-headers-$(uname -r)
linux-headers-6.8.0-47-generic                  install

만약 WSL 이미지도 저렇게 CONFIG_IKHEADERS를 활성화하고 싶다면 커널 소스를 빌드하기 전에 ".config" 파일을 수정해 CONFIG_IKHEADERS 값을 "m"으로 변경하면 됩니다.

// WSL 커널 소스코드를 다운로드한 경로

$ cat .config | grep CONFIG_IKHEADERS
CONFIG_IKHEADERS=m

또는 텍스트 편집기로 직접 수정하는 것이 귀찮다면, "make menuconfig" 명령을 내려도 되지만,

$ make menuconfig

// 이후 뜨는 설정 창에서 "General setup" -> "Enable kernel headers through /sys/kernel/kheaders.tar.xz (NEW)" 옵션을 켜서 .config 파일에 반영

어차피 소스코드와 함께 빌드를 했다면 kheaders에 준하는 모든 파일들이 마련돼 있으므로 굳이 저 옵션을 적용해 빌드할 필요까지는 없습니다.




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]







[최초 등록일: ]
[최종 수정일: 10/23/2024]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 61  62  63  64  65  66  67  68  69  70  71  72  73  [74]  75  ...
NoWriterDateCnt.TitleFile(s)
12178정성태3/10/202024838개발 환경 구성: 480. Linux 운영체제의 docker를 위한 tcp 바인딩 추가 [1]
12177정성태3/9/202023852개발 환경 구성: 479. docker - MySQL 컨테이너 실행
12176정성태3/9/202023459개발 환경 구성: 478. 파일의 (sha256 등의) 해시 값(checksum) 확인하는 방법
12175정성태3/8/202023478개발 환경 구성: 477. "Docker Desktop for Windows"의 "Linux Container" 모드를 위한 tcp 바인딩 추가
12174정성태3/7/202021535개발 환경 구성: 476. DockerDesktopVM의 파일 시스템 접근 [3]
12173정성태3/7/202024017개발 환경 구성: 475. docker - SQL Server 2019 컨테이너 실행 [1]
12172정성태3/7/202028499개발 환경 구성: 474. docker - container에서 root 권한 명령어 실행(sudo)
12171정성태3/6/202022844VS.NET IDE: 143. Visual Studio - ASP.NET Core Web Application의 "Enable Docker Support" 옵션으로 달라지는 점 [1]
12170정성태3/6/202019933오류 유형: 599. "Docker Desktop is switching..." 메시지와 DockerDesktopVM CPU 소비 현상
12169정성태3/5/202022728개발 환경 구성: 473. Windows nanoserver에 대한 docker pull의 태그 사용 [1]
12168정성태3/5/202024990개발 환경 구성: 472. 윈도우 환경에서의 dockerd.exe("Docker Engine" 서비스)가 Linux의 것과 다른 점
12167정성태3/5/202022003개발 환경 구성: 471. C# - 닷넷 응용 프로그램에서 DB2 Express-C 데이터베이스 사용 (3) - ibmcom/db2express-c 컨테이너 사용
12166정성태3/4/202024392개발 환경 구성: 470. Windows Server 컨테이너 - DockerMsftProvider 모듈을 이용한 docker 설치
12165정성태3/2/202021887.NET Framework: 900. 실행 시에 메서드 가로채기 - CLR Injection: Runtime Method Replacer 개선 - 네 번째 이야기(Monitor.Enter 후킹)파일 다운로드1
12164정성태2/29/202022951오류 유형: 598. Surface Pro 6 - Windows Hello Face Software Device가 인식이 안 되는 문제
12163정성태2/27/202021526.NET Framework: 899. 익명 함수를 가리키는 delegate 필드에 대한 직렬화 문제
12162정성태2/26/202027600디버깅 기술: 166. C#에서 만든 COM 객체를 C/C++로 P/Invoke Interop 시 메모리 누수(Memory Leak) 발생 [6]파일 다운로드2
12161정성태2/26/202022672오류 유형: 597. manifest - The value "x64" of attribute "processorArchitecture" in element "assemblyIdentity" is invalid.
12160정성태2/26/202022371개발 환경 구성: 469. Reg-free COM 개체 사용을 위한 manifest 파일 생성 도구 - COMRegFreeManifest
12159정성태2/26/202017752오류 유형: 596. Visual Studio - The project needs to include ATL support
12158정성태2/25/202022270디버깅 기술: 165. C# - Marshal.GetIUnknownForObject/GetIDispatchForObject 사용 시 메모리 누수(Memory Leak) 발생파일 다운로드1
12157정성태2/25/202021168디버깅 기술: 164. C# - Marshal.GetNativeVariantForObject 사용 시 메모리 누수(Memory Leak) 발생 및 해결 방법파일 다운로드1
12156정성태2/25/202019549오류 유형: 595. LINK : warning LNK4098: defaultlib 'nafxcw.lib' conflicts with use of other libs; use /NODEFAULTLIB:library
12155정성태2/25/202020557오류 유형: 594. Warning NU1701 - This package may not be fully compatible with your project
12154정성태2/25/202019054오류 유형: 593. warning LNK4070: /OUT:... directive in .EXP differs from output filename
12153정성태2/23/202024458.NET Framework: 898. Trampoline을 이용한 후킹의 한계파일 다운로드1
... 61  62  63  64  65  66  67  68  69  70  71  72  73  [74]  75  ...