리눅스 커널(
Linux kernel
)은 모놀리딕 유닉스 계열 컴퓨터 운영체제 커널이며 자유-오픈 소프트웨어이다. -Wikipedia (리눅스 커널)
필자는 예전부터 리눅스를 매우 좋아했다. 커널을 무료로 배포하여 누구나(솔직히 아무나 못하지만) 커널을 수정하고 공부하여 더 나은 방향으로 개선시킬 수 있다는 점에서 크게 감명을 받았다. 필자 역시 아직 많이 부족한 사람이지만 더 나은 세상을 만들기 위해 리눅스 커널을 공부할 생각이다.
So... you want to be a Linux kernel developer? Welcome!
이번 글에서는 리눅스 커널을 다운로드하고 빌드해볼 예정이다.
필자의 컴퓨터, 실행 환경은 다음과 같다. 노트북은 Lenovo LEGION 5
를 사용 중이고 Ubuntu
운영체제를 쓰고 있다. 커널 버전은 5.8.0-50-generic
이다.
가장 먼저 해야 하는 일은 커널 소스코드를 다운로드 받는 것이다. 앞서 말했듯이 리눅스 커널은 오픈소스이기 때문에 무료로 다운로드 받을 수 있다.
git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git
git.kernel.org
에서 안정화된 리눅스 커널을 다운로드 받을 수 있다. 필자는 git
프로그램을 통해(위에 쓰여진 명령어로) 다운로드 받았지만 홈페이지에 직접 들어가서 다운로드 받는 것 또한 가능하다. 직접 설치가 훨씬 빠르고 git clone
을 통해서 받으면 다소 시간이 걸릴 수 있다.
다운로드 후 폴더를 탐색하면 다음과 같은 파일들이 나타난다.
각 폴더와 파일 별로 그 내용을 설명 하자면 다음과 같다:
폴더/파일명 | 내용 | 폴더/파일명 | 내용 |
---|---|---|---|
arch | CPU 아키텍처 별 소스코드 | kernel | 커널 코어 소스코드 |
block | 블럭 계층 코어 소스코드 | MAINTAINERS | 커널 소스코드 관리자 정보 |
certs | 암호화, 인증 관련 소스코드 | Makefile | 커널 소스 빌드 및 버전 정보 관리 |
COPYING | 소스 저작권(GNU GPL) 정보 | mm | 메모리 관리 |
crypto | 암호화 라이브러리 | net | 네트워크 관련 소스코드 |
Documentation | 커널 문서 (메뉴얼) | scripts | 사용자 스크립트 소스코드 |
drivers | 디바이스 드라이버 소스코드 | security | 보안 모델 구현 소스코드 |
firmware | 펌웨어 소스코드 | sound | 사운드 장치를 위한 드라이버 소스코드 |
fs | 파일 시스템 관련 소스코드 | tools | 사용자 도구 소스코드 |
include | 커널 구조체 헤더 파일 | usr | initramfs cpio archive 를 위한 소스코드 |
init | 리눅스 초기화 및 부팅 소스코드 | virt | 커널 가상화(KVM) 지원 소스코드 |
ipc | 프로세간 데이터 교환 소스코드 | Kconfig | 커널 소스코드 설정 파일 |
Kbuild | 커널 소스코드 빌드 관리 | README | 커널 빌드 도움말 |
폴더랑 파일만 봐도 이미 한가득이다. 위에서 생략한 내용 또한 있다. 이 모든걸 처음부터 다 분석할순 없기 때문에 하나 하나씩 뜯어가며 분석해볼 예정이다.
리눅스 커널을 빌드하기 위해선 설치해야 하는 몇가지 패키지들이 존재한다. 자세한 내용은 다음을 참고하길 바란다.
필자의 경우 다음의 패키지를 설치하고 빌드해본 결과 정상적으로 동작했다:
sudo apt-get install git-all fakeroot build-essential ncurses-dev xz-utils libssl-dev bc flex libelf-dev bison
git log --tags='v5.12*'
다음 명령어를 통해 v5.12
라는 태그명을 가진 커밋을 찾을 수 있다.
필자의 경우 현재 5.12.2
가 가장 최신 버전이라고 나오는데, 이를 통해 커널을 빌드해보겠다. 혹시 뒤에 rc
라는 태그가 같이 붙어 있다면 이는 현재 개발 중인 unstable
버전이므로 rc
가 붙지 않은 가장 최신의 커널 버전을 찾길 바란다.
git checkout -b CV5.12.2 v5.12.2
다음 명령어로 CV5.12.2
라는 branch
를 생성하고 v5.12.2
버전으로 checkout
할 수 있다.
config
파일 생성하기 빌드에 앞서 빌드에 필요한 커널 설정 파일을 생성해야 한다. make menuconfig
를 통해 생성하는 방법도 있지만 필자는 기존의 config
파일을 불러올 것이다.
Q: 저는
config
파일 같은거 없는데요?A:
/boot/
경로에 하나씩 있으므로 걱정할 필요 없다.
필자의 경우 linux
소스코드와 빌드 파일이 섞이는 것이 마음에 안 들어서, build
라는 새로운 폴더를 하나 생성했다.
mkdir build
cd build
cp /boot/config-$(uname -r) .config
위와 같이 입력하여 기존 config
파일을 build
폴더로 복사해올 수 있다.
마지막으로 .config
파일 안에 있는 세 라인을 주석처리 해야한다. 각 라인 앞에 #
을 붙여 주석처리할 수 있다.
빌드 시 문제가 되는 라인이다. 각 라인을 주석처리 해야한다.
CONFIG_MODULE_SIG_ALL
CONFIG_MODULE_SIG_KEY
CONFIG_SYSTEM_TRUSTED_KEYS
다음 라인을 주석처리하지 않으면 정상적으로 빌드가 되지 않으므로 아래와 같이 꼭 주석처리 하길 바란다.
이제 드디어 빌드를 할 준비가 모두 끝났다. 다시 Linux
소스코드 폴더로 들어가서 다음의 명령어를 입력한다:
make -j$(nproc) O=../build/
뭔지 알 수 없는 이상한 선택지가 잔뜩 나오는데 무시하고 Enter
키를 꾹 누른다. 그럼 특별한 설정 없이 디폴트 값으로 들어간다. 여기서부터 꽤 오랜 시간이 소요 되므로 잠깐 다른 일을 하러 가면 된다. 필자의 경우 대략 30분 정도 걸린 것 같다.
빌드가 끝나면 다음과 같은 파일을 확인할 수 있다.
다음 파일 중 arch/x86/boot/bzImage
는 커널 실행 이미지이다. vmlinux
파일은 커널이 빌드될 때의 각종 리스팅 정보와 Section 정보들을 담고 있는 ELF
파일이다. 이 파일은 나중에 커널 디버깅에 사용된다.
[책] 리눅스 커널 소스 해설 기초 입문 (정재준 저)
[링크] https://www.kernel.org/
[링크] https://www.kernel.org/doc/html/latest/process/changes.html