[라즈베리파이] 커널 빌드 (로컬)
나는 "디버깅을 통해 배우는 리눅스 커널의 구조와 원리1" 이라는 책을 참조했다.
라즈베리파이의 라즈비안 OS를 포팅하고 빌드시키고, SSH로 원격접속 등을 통해 환경은 구성하였다.
커널은 오픈소스로 배포하고 있어서, 라즈베리파이에서 직접 빌드시키고 적용할 수 있다. 한번 빌드한 커널을 적용시켜보겠다.
PC에서 받고 전송하는 크로스컴파일 방법도 다음포스트에서 할것이다.
https://www.raspberrypi.com/documentation/computers/linux_kernel.html
이사이트에서 공식적으로 라즈베리파이 리눅스 커널 빌드 방법을 자세히 알려주고 있다.
먼저 현재 내 커널 정보를 확인해보자.
- 운영체제 이름과 버전: Linux
- 호스트 이름: raspberrypi
- 커널 버전: 6.6.31+ (라즈베리 파이용 커널 버전)
- 아키텍처: aarch64 (64비트 ARM 아키텍처)
- GNU/Linux 배포판: Debian 기반
임을 알 수 있다.
소스받기
git clone --depth=1 https://github.com/raspberrypi/linux
해당 코드를 통해 linux 소스를 받을 수 있다.
git clone --depth=1 --branch rpi-4.18.y https://github.com/raspberrypi/linux
특정 버전의 소스를 원한다면 위처럼 --branch 와 버전을 선택하여 소스를 다운받으면 된다.
받는데 좀 시간이 걸린다.
빌드하기
공식 홈페이지에서는 빌드 구성 후 빌드 하는 걸 차례로 명령어를 입력해서 하는데, 나는 셸스크립트를 사용해서 재사용성을 높여서 사용했다.
내용자체는 같다.
#!/bin/bash
echo "configure build output path"
KERNEL_TOP_PATH="$(cd "$(dirname "$0")" ; pwd -P )"
OUTPUT="$KERNEL_TOP_PATH/out"
echo "$OUTPUT"
KERNEL=kernel8
BUILD_LOG="$KERNEL_TOP_PATH/rpi_build_log.txt"
echo "move kernel source"
cd linux
echo "make defconfig"
make O=$OUTPUT bcm2711_defconfig
echo "kernel build"
make O=$OUTPUT Image.gz modules dtbs -j6 2>&1 | tee $BUILD_LOG
32비트 커널을 빌드하고 싶다면
- ARCH = arm 옵션과
- KERNEL = kernel7l
- Image.gz -> zImage로 변경이 필요하다.
사실 32비트 커널을 빌드해서 넣으려고했는데 라즈비안 이미지를 넣을때 64비트로 넣어서 gcc 컴파일러가 32비트 컴파일을 못하는 듯 보여서 그냥 64비트 커널을 빌드했다.
위 셸 스크립트는 빌드한 파일을 out이라는 폴더에 저장하도록 OUTPUT 경로를 설정해 주었으며, 빌드로그는 txt 파일에 따로 저장하도록 설정하였다.
defconfig와같은 경우 기본설정 파일이며, 커널 빌드 이전에 빌드환경을 설정해준다고 보면된다.
.config 파일을 생성해준다.
그리고 마지막 줄이 커널 빌드를 하는줄로
- Image.gz: 압축된 커널 이미지 파일을 생성합니다.
- modules: 커널 모듈을 빌드합니다.
- dtbs: 장치 트리 바이너리 파일을 생성합니다.
이 3가지가 커널을 구성하는데 필요한 요소들이다.
이제 구성한 쉘스크립트를 실행하면 쭉 빌드가 되는 것을 볼 수 있다.
한참걸린다. 지금이 새벽이라 키고 자야겠다.
커널 설치하기
빌드가 끝나면 빌드된 것들이 out 폴더에 저장된 것을 볼 수 있다.
다시 쉘스크립트를 만들어 적용해줄 것이다.
install_rpi_kernel.sh 파일이다.
#!/bin/bash
KERNEL_TOP_PATH="$(cd "$(dirname "$0")" ; pwd -P )"
OUTPUT="$KERNEL_TOP_PATH/out"
echo "$OUTPUT"
cd linux
make O=$OUTPUT modules_install
cp $OUTPUT/arch/arm64/boot/dts/broadcom/*.dtb /boot/firmware/
cp $OUTPUT/arch/arm64/boot/dts/overlays/*.dtb* /boot/firmware/overlays/
cp $OUTPUT/arch/arm64/boot/Image.gz /boot/firmware/kernel8.img
먼저 OUTPUT 경로를 미리 만든 현재 디렉토리에서의 out으로 설정한다.
그 후 명령어를 살펴보면
1. 모듈 설치
2. dtb 파일들 옮기기
DTB?
다음 포스트에서 좀 더 자세히 설명하겠지만 주변 장치를 연결하는데 필요한 바이너리 파일이라고 보면된다.
커널이 연결할 수 있도록 제공한다. 부팅시 필요하다.
오버레이는 ?
기본 디바이스 트리에 추가적으로 수정하거나 특정 하드웨어 구성 요소를 활성화할 수 있도록 하는 추가 설정 파일이다.\ .dtbo의 형태를 띈다.
3. 커널 이미지 옮기기
이 3가지는 이전 포스트에서 자세히 설명하였다.
아무튼 빌드한 커널을 위의 명령어로 설치할 수 있다.
[라즈베리파이] 커널 구성 요소 : 커널이미지, 모듈, DTB
앞선 커널 빌드 과정에서 보았듯이 총 3개의 모듈을 빌드해서 적용시킨다.차례대로 자세히 알아보자.1. 이미지파일설명:Image.gz는 커널 빌드 과정에서 생성된 커널 이미지 파일을 gzip 형식으로 압
oragg.tistory.com
설치가 끝난후 reboot now 명령어를 입력해서 재부팅하면 새로운 커널로 부팅된다.
위가 이전, 밑이 새롭게 부팅했을때 커널 정보이다.
최신 버전 커널이 설치된 것을 확인할 수 있다!!