Linux Tutorial #0 커널 소스코드 빌드하기

문연수·2021년 5월 9일
0

Linux Tutorial

목록 보기
1/25
post-thumbnail

리눅스 커널(Linux kernel)은 모놀리딕 유닉스 계열 컴퓨터 운영체제 커널이며 자유-오픈 소프트웨어이다. - Wikipedia (리눅스 커널)

필자는 예전부터 리눅스를 매우 좋아했다. 커널을 무료로 배포하여 누구나(솔직히 아무나 못하지만) 커널을 수정하고 공부하여 더 나은 방향으로 개선시킬 수 있다는 점에서 크게 감명을 받았다. 필자 역시 아직 많이 부족한 사람이지만 더 나은 세상을 만들기 위해 리눅스 커널을 공부할 생각이다.

So... you want to be a Linux kernel developer? Welcome!

이번 글에서는 리눅스 커널을 다운로드하고 빌드해볼 예정이다.

0. 실행 환경

필자의 컴퓨터, 실행 환경은 다음과 같다. 노트북은 Lenovo LEGION 5 를 사용 중이고 Ubuntu 운영체제를 쓰고 있다. 커널 버전은 5.8.0-50-generic 이다.

1. 커널 소스코드 다운로드

가장 먼저 해야 하는 일은 커널 소스코드를 다운로드 받는 것이다. 앞서 말했듯이 리눅스 커널은 오픈소스이기 때문에 무료로 다운로드 받을 수 있다.

git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git

git.kernel.org 에서 안정화된 리눅스 커널을 다운로드 받을 수 있다. 필자는 git 프로그램을 통해(위에 쓰여진 명령어로) 다운로드 받았지만 홈페이지에 직접 들어가서 다운로드 받는 것 또한 가능하다. 직접 설치가 훨씬 빠르고 git clone 을 통해서 받으면 다소 시간이 걸릴 수 있다.

다운로드 후 폴더를 탐색하면 다음과 같은 파일들이 나타난다.
각 폴더와 파일 별로 그 내용을 설명 하자면 다음과 같다:

폴더/파일명내용폴더/파일명내용
archCPU 아키텍처 별 소스코드kernel커널 코어 소스코드
block블럭 계층 코어 소스코드MAINTAINERS커널 소스코드 관리자 정보
certs암호화, 인증 관련 소스코드Makefile커널 소스 빌드 및 버전 정보 관리
COPYING소스 저작권(GNU GPL) 정보mm메모리 관리
crypto암호화 라이브러리net네트워크 관련 소스코드
Documentation커널 문서 (메뉴얼)scripts사용자 스크립트 소스코드
drivers디바이스 드라이버 소스코드security보안 모델 구현 소스코드
firmware펌웨어 소스코드sound사운드 장치를 위한 드라이버 소스코드
fs파일 시스템 관련 소스코드tools사용자 도구 소스코드
include커널 구조체 헤더 파일usrinitramfs cpio archive 를 위한 소스코드
init리눅스 초기화 및 부팅 소스코드virt커널 가상화(KVM) 지원 소스코드
ipc프로세간 데이터 교환 소스코드Kconfig커널 소스코드 설정 파일
Kbuild커널 소스코드 빌드 관리README커널 빌드 도움말

폴더랑 파일만 봐도 이미 한가득이다. 위에서 생략한 내용 또한 있다. 이 모든걸 처음부터 다 분석할순 없기 때문에 하나 하나씩 뜯어가며 분석해볼 예정이다.

2. 빌드에 필요한 패키지 설치하기

리눅스 커널을 빌드하기 위해선 설치해야 하는 몇가지 패키지들이 존재한다. 자세한 내용은 다음을 참고하길 바란다.

필자의 경우 다음의 패키지를 설치하고 빌드해본 결과 정상적으로 동작했다:

sudo apt-get install git-all fakeroot build-essential ncurses-dev xz-utils libssl-dev bc flex libelf-dev bison

3. 버전 확인 및 체크아웃

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 할 수 있다.

4. 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

다음 라인을 주석처리하지 않으면 정상적으로 빌드가 되지 않으므로 아래와 같이 꼭 주석처리 하길 바란다.

5. 빌드하기

이제 드디어 빌드를 할 준비가 모두 끝났다. 다시 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

profile
2000.11.30

0개의 댓글