커널 v6.x 컴파일
앞으로 "김동현"님의 [디버깅을 통해 배우는 리눅스 커널의 구조와 원리] 책을 공부하며, 공부한 내용을 정리해보려고 한다.
책에서는 라즈베리파이를 가지고 내용이 진행되는데, 나는 VMWare에 Ubuntu 24.04를 올려서 진행했다.
커널 컴파일
가상머신 Ubuntu 24.04(커널 v6.8)에서 커널 컴파일을 해보겠다.
컴파일하고 나면 용량이 16GB 정도 사용된다. Ubuntu의 기본 사용 용량 등을 고려해서 Disk 크기를 64GB 정도는 잡는 것이 여유로울 것이다.
그렇지 않으면 오랜 컴파일의 결과가 디스크 부족일 수도 있다..
일단 빌드 툴 설치부터 하자.
sudo apt update
sudo apt install -y build-essential libncurses-dev bison flex libssl-dev libelf-dev
이제 커널 소스 코드를 다운받자.
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.8.2.tar.xz
tar -xf linux-6.8.2.tar.xz
cd linux-6.8.2
그 뒤엔, 기본 설정 파일을 만들어야 한다.
지금 시스템의 설정을 복사해서 쓰자.
cp /boot/config-$(uname -r) .config
make olddefconfig
컴파일 하기 전에 .config 파일에서 커널 버전의 이름에 -custom을 추가하자.
이제 커널 컴파일을 해보자.
지금까지 경험을 보면 아마 에러가 날 것이다...
time make -j$(nproc) > ~/build.log 2>&1
컴파일 시간을 보기 위해 앞에 time을 추가해서 진행했고, 빌드 로그는 build.log 파일에 저장되도록 했다.
...
GEN kernel/kheaders_data.tar.xz
AR kernel/built-in.a
CC [M] kernel/kheaders.o
make[1]: *** [/home/ubuntu/linux-6.8.2/Makefile:1921: .] Error 2
make: *** [Makefile:240: __sub-make] Error 2
make -j$(nproc) 471.47s user 76.05s system 368% cpu 2:28.78 total
역시 에러다. 이 에러가 자주 나온다.
에러 메세지에 "Error 2"만 달랑 나온 경우, 진짜 에러는 그 위에 있다고 한다.
build.log 파일을 보자.
CC certs/system_keyring.o
make[3]: *** No rule to make target 'debian/canonical-certs.pem', needed by 'certs/x509_certificate_list'. Stop.
make[3]: *** Waiting for unfinished jobs....
AR kernel/power/built-in.a
CC kernel/irq/irqdesc.o
make[2]: *** [scripts/Makefile.build:481: certs] Error 2
make[2]: *** Waiting for unfinished jobs....
make[3]: *** No rule to make target 'debian/canonical-certs.pem', needed by 'certs/x509_certificate_list'. Stop.
이 메세지를 봐보자.
커널 빌드 중에 certs/x509_certificate_list 라는 걸 만들려고 했는데, debian/canonical-certs.pem 파일이 필요하다고 해놓고 그 파일이 없어서 빌드가 멈췄다는 메세지이다.
GPT에 의하면,
다운받은 커널 소스가 "Ubuntu 커널 패치" 영향을 받았기 때문에 이런 문제가 생겼다고 한다.
- 리눅스 커널 오리지널 소스(kernel.org)에는 debian/canonical-certs.pem 파일이 없음
- Ubuntu는 커널에 위 파일을 추가해 부팅 시 모듈 서명 검증을 강화함
- 그래서 기존 Ubuntu 시스템의 설정 파일을 복사해서 .config 파일을 생성하면 문제가 생김
- 즉, Ubuntu 전용 옵션이 남아서 커널 빌드를 망치고 있음
.config 파일 안에서 이 부분을 수정하자.
make olddefconfig
time make -j$(nproc) > ~/build.log 2>&1
또 오류 발생..
AR fs/notify/dnotify/built-in.a
CC fs/notify/inotify/inotify_fsnotify.o
make[3]: *** No rule to make target 'debian/canonical-revoked-certs.pem', needed by 'certs/x509_revocation_list'. Stop.
make[3]: *** Waiting for unfinished jobs....
GEN certs/blacklist_hash_list
make[2]: *** [scripts/Makefile.build:481: certs] Error 2
make[2]: *** Waiting for unfinished jobs....
make[3]: *** No rule to make target 'debian/canonical-revoked-certs.pem', needed by 'certs/x509_revocation_list'. Stop.
근데 위에서 처리한 에러와 비슷한 것 같다.
.config 수정하자.
다시 컴파일!
성공했다. 야호.
빌드를 편하게 하기 위해 빌드 전용 스크립트를 작성했다.
#! /bin/bash
echo "configure build otuput path"
KERNEL_TOP_PATH="$( cd "$(dirname "$0")" ; pwd -P )"
BUILD_LOG="$KERNEL_TOP_PATH/build.log"
echo "move kernel source"
cd linux-6.8.2
echo "make defconfig"
make olddefconfig
echo "kernel build"
time make -j$(nproc) > ~/build.log 2>&1
홈 디렉터리에 두고 사용하면 된다.