[Linux] 커널 빌드 & 설치 (with 라즈베리파이 4)

4 minute read

간단한 것부터 하나씩 포스팅 해보려고 노력중입니다..
github page는 관리가 좀 귀찮은 단점이 있네요.
Documents에도 업로드 예정입니다.

리눅스 커널 빌드 및 설치

커널 버전: 4.19.y 이상 (패키지 호환성)

커널을 빌드하는 이유는 여러가지 있겠지만,
보통은 커널에서 어떤 부분을 수정하거나 추가한 후
변경사항을 테스트하고 적용하기 위해 빌드합니다.

커널 빌드하는 방법 2가지를 정리해 보려고 합니다.
사실 둘 다 make 입니다. 패키지는 make 빌드를 스크립트로 작성하고,
대화형으로 동작하게 만들었습니다.

예시는 raspberry Pi 4 , 5.4.y 커널입니다.

raspberrypi
raspberry Pi 4


Native

타겟에서 직접 소스를 받고, 빌드하고, install 하는 과정입니다.

make 명령으로 설치하기

raspberry Pi 4 커널 5.4.y 빌드 & 설치 하는 과정입니다.
raspberry Pi 4 타겟에서 직접 진행합니다.

의존성 패키지 설치

$ sudo apt-get install build-essential bc bison flex libssl-dev

소스파일 다운로드

$ git clone --depth=1 -b rpi-5.4.y https://github.com/raspberrypi/linux.git
$ cd linux
$ make bcm2711_defconfig
$ make -j4
$ make modules_install dtbs_install
$ sudo cp arch/arm64/boot/Image /boot/kernel8.img
$ sudo vi /boot/config.txt
# device_tree=dtbs/5.4.47-v8+/broadcom/bcm2711-rpi-4-b.dtb
# overlay_prefix=dtbs/5.4.47-v8+/overlays/
# kernel=kernel8.img
$ reboot

패키지로 설치하기

라즈비안 이미지(distro: buster)는 지원하지 않습니다. (2023-05-15 기준)

우분투 이미지는 20.04, 22.04 지원됩니다. (2023-05-15 기준)
아래는 우분투 이미지에서 진행과정입니다.
우분투 공식 패키지가 아닌 개인 아카이브에서 패키지를 가져올 것입니다.

의존성 패키지 설치

$ sudo apt-get install software-properties-common

PPA 추가

$ sudo add-apt-repository ppa:how2flow/ppa
$ sudo apt-get update

패키지 설치

$ sudo apt-get install kernel-scripts

소스파일 다운로드

$ git clone --depth=1 -b rpi-5.4.y https://github.com/raspberrypi/linux.git

커널 빌드 & 설치

$ cd linux
$ kernel-script --crosscompile

[kernel build architecture]
Input architecture: arm64

[kernel build config]
Input config: bcm2711_defconfig

[kernel build target]
Input target: all

커널 빌드 output 파일들이 out/ 에 있습니다.

$ cd out
$ make modules_install
$ make dtbs_install
$ cp arch/arm64/boot/Image /boot/kernel8.img
$ sudo vi /boot/config.txt
# device_tree=dtbs/5.4.47-v8+/broadcom/bcm2711-rpi-4-b.dtb
# overlay_prefix=dtbs/5.4.47-v8+/overlays/
# kernel=kernel8.img
$ reboot

Cross-compile

크로스-컴파일 빌드를 하는 이유는
커널 빌드는 시간이 오래 걸리기도 하고 native_build를 했을 때
잘못하면 커널 시스템을 망가트릴 수 있으므로, 빌드머신을 따로 두고
cross-compile 하는게 좋습니다.

빌드 머신은 x86 머신, 그리고 OS는 Ubuntu 20.04 LTS 기준입니다.
라즈베리파이 이미지가 설치된 메모리 장치(sd-card)를 빌드머신에 연결하고 진행합니다.

make 명령으로 설치하기

과정은 전체적으로 Native와 비슷합니다.

의존성 패키지 설치

$ sudo apt-get install build-essential bc bison flex libssl-dev gcc-aarch64-linux-gnu

소스파일 다운로드

$ git clone --depth=1 -b rpi-5.4.y https://github.com/raspberrypi/linux.git

먼저 커널 소스트리의 루트 경로로 이동합니다.

$ cd linux

빌드 타겟은 크게 3가지가 있는데,
커널 이미지(zImage/Image.gz (.o)), 커널 모듈(.ko), 커널 디바이스트리(.dtb) 입니다.

빌드시에 필요한 환경변수가 몇가지 있습니다.
ARCH, CROSS_COMPILE, INSTALL_MOD_PATH, INSTALL_DTBS_PATH

ARCH는 타겟의 아키텍쳐를 지정합니다.

지정 가능한 아키텍쳐는 커널소스 루트에서

$ ls -lh arch/
-rw-r--r--   1 user user  31K May  8 09:51 Kconfig
drwxr-xr-x   9 user user 4.0K May  8 09:51 alpha
drwxr-xr-x  14 user user 4.0K May  8 09:51 arc
drwxr-xr-x 101 user user 4.0K May  8 09:51 arm
drwxr-xr-x  12 user user 4.0K May  8 09:51 arm64
drwxr-xr-x   9 user user 4.0K May  8 09:51 c6x
drwxr-xr-x   8 user user 4.0K May  8 09:51 h8300
drwxr-xr-x   7 user user 4.0K May  8 09:51 hexagon
drwxr-xr-x  14 user user 4.0K May  8 09:51 ia64
drwxr-xr-x  25 user user 4.0K May  8 09:51 m68k
drwxr-xr-x  10 user user 4.0K May  8 09:51 microblaze
drwxr-xr-x  52 user user 4.0K May  8 09:51 mips
drwxr-xr-x   8 user user 4.0K May  8 09:51 nds32
drwxr-xr-x   9 user user 4.0K May  8 09:51 nios2
drwxr-xr-x   8 user user 4.0K May  8 09:51 openrisc
drwxr-xr-x  10 user user 4.0K May  8 09:51 parisc
drwxr-xr-x  19 user user 4.0K May  8 09:51 powerpc
drwxr-xr-x   7 user user 4.0K May  8 09:51 riscv
drwxr-xr-x  19 user user 4.0K May  8 09:51 s390
drwxr-xr-x  15 user user 4.0K May  8 09:51 sh
drwxr-xr-x  15 user user 4.0K May  8 09:51 sparc
drwxr-xr-x   8 user user 4.0K May  8 09:51 um
drwxr-xr-x   8 user user 4.0K May  8 09:51 unicore32
drwxr-xr-x  27 user user 4.0K May  8 09:51 x86
drwxr-xr-x  11 user user 4.0K May  8 09:51 xtensa

Kconfig를 제외한 나머지 디렉토리 이름과 같습니다.

CROSS_COMPILE은 빌드에 사용할 툴체인을 정합니다.
타겟의 아키텍쳐에 따라 x86_64-linux-gnu- 또는,
aarch64-linux-gnu- 등 아키텍처에 맞는 툴체인을 정하면 됩니다.
예시는 raspberry Pi 4 이므로 컴파일러는 aarch64-linux-gnu-를 사용하면 됩니다.

INSTALL_MOD_PATHINSTALL_DTBS_PATH 는 메모리 디바이스를 연결 했을 때 마운트 되는 장치의 부트 파티션 경로를 지정하면 됩니다.
마운트 경로는 따로 지정하지 않았다면 보통 /media/$(whoami)/.. 에 마운트 됩니다.

만약 sudo 를 사용하면 root의 변수를 가져오기 때문에 일반 유저의 변수와 다릅니다.
섞어 쓰지 마세요.

커널 빌드하기

$ export ARCH=arm64
$ export CROSS_COMPILE=aarch64-linux-gnu-
$ make bcm2711_defconfig
$ make -j$(nproc)

커널 설치하기

$ make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- INSTALL_MOD_PATH=/media/$(whoami)/\"root_partition\"" modules_install
$ make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- INSTALL_DTBS_PATH=/media/$(whoami)/"\root_partition\"" dtbs_install
$ cp arch/arm64/boot/Image /media/$(whoami)/"boot_partition"/kernel8.img
$ vi /media/$(whoami)/"boot_partition"/config.txt
# device_tree=dtbs/5.4.47-v8+/broadcom/bcm2711-rpi-4-b.dtb
# overlay_prefix=dtbs/5.4.47-v8+/overlays/
# kernel=kernel8.img

패키지로 설치하기

우분투 공식 패키지가 아닌 개인 아카이브에서 패키지를 가져올 것입니다.

의존성 패키지 설치

$ sudo apt-get install software-properties-common

PPA 추가

$ sudo add-apt-repository ppa:how2flow/ppa
$ sudo apt-get update

패키지 설치

$ sudo apt-get install kernel-scripts

소스파일 다운로드

$ git clone --depth=1 -b rpi-5.4.y https://github.com/raspberrypi/linux.git

커널 빌드 & 설치

$ cd linux
$ kernel-script --crosscompile

[kernel build architecture]
e.g 'arm64' or 'x86' or ...
Input architecture: arm64

[kernel build config]
e.g 'i386_defconfig' or 'oldconfig' or ...
Input config: bcm2711_defconfig

[kernel build target]
e.g 'dtbs' or 'modules' or 'vmlinux' or ...
Input target: all

Would you want to separate the result files? [Y/n]: n

마지막 질문의 default는 Y 입니다.
y/Y 선택하면 빌드 output 파일들이 out/ 에 생성됩니다.
n/N 선택하면 소스파일들과 같은 경로에 빌드 output 파일들이 생성됩니다.

Leave a comment