라즈베리파이용 커널 크로스 컴파일

라즈베리파이는 널리 사용되는 임베디드 시스템으로, 리눅스 커널을 사용한다. 커널을 컴파일 하는 방법은 크게 호스트에서 사용할 커널을 직접 빌드하는 네이티브 빌드와 타깃용 커널을 호스트에서 빌드하는 크로스 컴파일 빌드로 나뉜다. 이 글에서는 라즈베리파이용 커널을 호스트 PC에서 크로스 컴파일하는 방법에 대해 알아본다.

Cross-compile 툴체인 설치

먼저 크로스 컴파일을 위한 패키지를 설치한다.

sudo apt install git bc bison flex libssl-dev make libc6-dev libncurses5-dev

라즈베리파이는 ARM 아키텍처 칩셋을 사용한다. 따라서 ARM 아키텍처를 위한 툴체인을 설치해야 한다.

32bit 크로스 툴체인 설치

sudo apt install crossbuild-essential-armhf

64bit 크로스 툴체인 설치

sudo apt install crossbuild-essential-arm64

커널 소스 다운로드

라즈베리파이 github로 부터 linux kernel 소스를 git clone 으로 다운 받는다.

git clone --depth=1 https://github.com/raspberrypi/linux

특별히 사용하기 원하는 branch가 있다면 --branch 를 지정하여 다운로드 한다.

git clone --depth=1 --branch <branch> https://github.com/raspberrypi/linux

사용 가능한 branch에 대한 정보는 원본 GitHub 저장소를 참조한다.

커널 설정(Kconfig)

먼저, 32bit 용으로 빌드 할 것인지 64bit용으로 빌드할 것인지에 따라 커널 구성을 각각 진행한다.

32bit config

Raspberry Pi 1, Zero 및 Zero W 및 Raspberry Pi 컴퓨팅 모듈 1의 경우:

cd linux
KERNEL=kernel
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcmrpi_defconfig

Raspberry Pi 2, 3, 3+ 및 Zero 2W와 Raspberry Pi 컴퓨팅 모듈 3 및 3+의 경우:

cd linux
KERNEL=kernel7
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2709_defconfig

Raspberry Pi 4 및 400, Raspberry Pi 컴퓨팅 모듈 4의 경우:

cd linux
KERNEL=kernel7l
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2711_defconfig

64bit config

Raspberry Pi 3, 3+, 4, 400 및 Zero 2W와 Raspberry Pi 컴퓨팅 모듈 3, 3+ 및 4의 경우:

cd linux
KERNEL=kernel8
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- bcm2711_defconfig

라즈베리 파이 5의 경우:

cd linux
KERNEL=kernel_2712
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- bcm2712_defconfig

커널 컴파일

32bit 빌드

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs

64bit 빌드

make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- Image modules dtbs

SD 카드에 설치

커널을 빌드한 후에는 이를 라즈베리파이에 복사하고 모듈을 설치해야 한다. 라즈베리파이 이미지가 설치되어 있는 SD카드를 호스트에 연결한다.

먼저, lsblk 사용하여 SD 카드의 파티션을 확인한다.

sdb
   sdb1
   sdb2

sdb1은 FAT 파일 시스템(부팅) 파티션이고 sdb2는 ext4 파일 시스템(루트) 파티션이다. 필요에 따라 파티션 문자를 조정한 후 아래와 같이 mount 한다.

mkdir mnt
mkdir mnt/fat32
mkdir mnt/ext4
sudo mount /dev/sdb1 mnt/fat32
sudo mount /dev/sdb2 mnt/ext4

다음으로 SD 카드에 커널 모듈을 설치한다.

32bit 모듈 설치

sudo env PATH=$PATH make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=mnt/ext4 modules_install

64bit 모듈 설치

sudo env PATH=$PATH make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- INSTALL_MOD_PATH=mnt/ext4 modules_install

마지막으로 커널과 장치 트리 Blob을 SD 카드에 복사하고 이전 커널을 백업한다.

32bit 커널 설치

sudo cp mnt/fat32/$KERNEL.img mnt/fat32/$KERNEL-backup.img
sudo cp arch/arm/boot/zImage mnt/fat32/$KERNEL.img
# Choose one of the following based on the kernel version
  # For kernels up to 6.4:
  sudo cp arch/arm/boot/dts/*.dtb mnt/fat32/
  # For kernel 6.5 and above:
  sudo cp arch/arm/boot/dts/broadcom/*.dtb mnt/fat32/
sudo cp arch/arm/boot/dts/overlays/*.dtb* mnt/fat32/overlays/
sudo cp arch/arm/boot/dts/overlays/README mnt/fat32/overlays/
sudo umount mnt/fat32
sudo umount mnt/ext4

64bit 커널 설치

sudo cp mnt/fat32/$KERNEL.img mnt/fat32/$KERNEL-backup.img
sudo cp arch/arm64/boot/Image mnt/fat32/$KERNEL.img
sudo cp arch/arm64/boot/dts/broadcom/*.dtb mnt/fat32/
sudo cp arch/arm64/boot/dts/overlays/*.dtb* mnt/fat32/overlays/
sudo cp arch/arm64/boot/dts/overlays/README mnt/fat32/overlays/
sudo umount mnt/fat32
sudo umount mnt/ext4

또 다른 옵션은 커널을 동일한 위치에 복사하는 것이다. 그것 보다는 파일을 다른 이름으로 복사하고, config.txt 파일을 편집하여 라즈베리파이가 부팅할 커널을 선택할 수 있게 할 수 있다.

[all]
kernel=vmlinuz
cmdline=cmdline.txt
initramfs initrd.img followkernel

이는 사용자 정의 커널을 시스템 및 자동 업데이트 도구에서 관리하는 기본 커널 이미지와 별도로 유지하고 커널을 부팅할 수 없는 경우 쉽게 기본 커널로 되돌릴 수 있다는 이점이 있다.

마지막으로 카드를 Raspberry Pi에 연결하고 부팅하고, 커널 버전을 확인한다.

Linux raspberrypi 6.6.23-v8+ #1 SMP PREEMPT Thu Apr  4 17:29:09 UTC 2024 aarch64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Sun Apr  7 05:45:24 2024

참고 사이트

답글 남기기