Processing math: 0%
본문 바로가기
Operating System/Linux

라즈베리 파이 커널 빌드하기

by 임아톰 2021. 7. 30.

라즈베리 파이에서 리눅스 커널을 수정하고 이를 적용하려면 커널을 빌드하고 설치할 수 있어야 합니다. 커널 빌드할 일이 꽤 생길 거 같아서 관련 내용을 정리하려 합니다.

 

불필요한 권한 설정을 피하기 위해 root 권한을 획득하였습니다.

$ sudo su

 

커널 소스를 다운 받을 디렉토리를 생성합니다.

$ mkdir rpi_kernel_src

 

 

Step 1: 커널 소스 다운로드

라즈비안 소스 코드를 다운 받기 전에 필요한 리눅스 유틸리티 프로그램을 설치합니다.

$ apt-get install git bc bison flex libss-dev

 

rpi_kernel_src 폴더에 커널 소스를 다운 받습니다.

cd rpi_kernel_src git clone --depth=1 --branch rpi-4.19.y https://github.com/raspberrypi/linux

 

소스 코드를 다운 받는 데 5분정도 소요됩니다. –branch 옵션을 넣지 않을 경우 최신 커널 소스가 다운받아 집니다.

 

 

Step 2: 커널 빌드

커널 빌드를 하기 위해 빌드 쉘 스크립터 작성합니다. 쉘 스크립터의 이름은 build_rpi_kernel.sh입니다.

#!/bin/bash
 
echo "configure build output path"
 
KERNEL_TOP_PATH="$( cd "$(dirname "$0")" ; pwd -P )"
OUTPUT="$KERNEL_TOP_PATH/out"
echo "$OUTPUT"
 
KERNEL=kernel7
BUILD_LOG="$KERNEL_TOP_PATH/rpi_build_log.txt"

echo "move kernel source"
cd linux

echo "make defconfig"
make O=$OUTPUT bcm2709_defconfig
 
echo "kernel build"
make O=$OUTPUT zImage modules dtbs -j4 2>&1 | tee $BUILD_LOG

 

01 #!/bin/bash

’#!’는 스크립트를 실행할 쉘을 지정하는 선언문입니다. 사용 하려는 명령어 해석기가 bash Shell임을 알려주는 것입니다.

 

05 KERNEL_TOP_PATH="$( cd "$(dirname "$0")" ; pwd -P )"

 KERNEL_TOP_PATH에 현재 작업 디렉토리를 저장하는 라인입니다. 해당 라인이 실행되면 KERNEL_TOP_PATH에는 home/pi/rpi_kernel_src가 들어가게 됩니다.

 

 한 줄에 두 개의 명령어 cd “(dirname “0”)” 와 pwd -P가 합쳐져 있습니다. 
 pwd - P 는 현재 쉘의 절대 경로를 받아오는 명령어입니다. pwd -P는 쉘의 위치에 따라 결과가 달라지기 때문에 앞에 추가적인 명령이 붙게 되는데 $0는 명령어의 첫번째 인자를 의미합니다. 여기서는 home/pi/rpi_kernel_src/build_rpi_kernel.sh 입니다.

 dirname 은 문자열에서 디렉토리만 출력하는 명령어입니다. dirname “$0”을 한 결과는 home/pi/rpi_kernel_src이 됩니다. 따라서 현재 디렉토리를 이동 후 절대 경로를 받아왔으므로 KERNEL_TOP_PATH에는 현재 작업 디렉토리가 저장됩니다.

큰따옴표 안에 넣은 값은 변수가 실제 값으로 치환된 후 출력되고
작은 따옴표로 감싸진 문자열은 변화없이 그대로 출력됩니다.
세미콜론은 하나의 명령이 끝날 때 뒤에 붙여서 한 명령이 끝났음을 나타냅니다.

 

16 make O=$OUTPUT bcm2709_defconfig

/home/p/rpi_kernel_src/linux/arch/arm/configs/bcm2709_deconfig 경로에 있는 bcm2709_decofig 파일에 선언된 컨피그 파일을 참조해 .config 파일을 생성합니다.

 

19 make O=$OUTPUT zImage modules dtbs -j4 2>&1 | tee $BUILD_LOG

 리눅스 커널 소스를 빌드하는 명령어입니다.
파일을 저장한 후에는 chmod 명령어를 입력해 파일에 실행 권한을 부여해야 합니다.

 

root@raspberrypi:/home/pi/rpi_kernel_src# chmod +x build_rpi_kernel.sh

 

 

이제 작성한 빌드 스크립트를 실행합니다.

root@raspberrypi:/home/pi/rpi_kernel_src# ./build_rpi_kernel.sh

빌드를 완료하는 데는 3~4시간 정도 소요 됩니다.

 

Step 3: 커널 설치

빌드한 커널 이미지를 설치합니다. 라즈비안 이미지를 설치하는 셸 스크립트를 작성합니다.

 

#!/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/arm/boot/dts/*.dtb /boot/
cp $OUTPUT/arch/arm/boot/dts/overlays/*.dtb* /boot/overlays/
cp $OUTPUT/arch/arm/boot/dts/overlays/README /boot/overlays/
cp $OUTPUT/arch/arm/boot/zImage /boot/kernel7.img

 

다음 명령어로 셸 스크립트를 실행합니다.

root@raspberrypi:/home/pi/rpi_kernel_src# ./install_rpi_kernel.sh

커널 빌드 시 에러가 발생했다면 반드시 수정하고 설치해야 합니다. 그렇지 않으면 제대로 설치되지 않습니다.

 

전처리 코드 생성

리눅스 커널 소스를 분석하다 보면 수 많은 매크로를 만나게 됩니다. 매크로가 소스코드를 이해하는 걸림돌로 작용하기도 하는데 이럴 때 매크로를 풀어서 표현하면 이해에 도움이 됩니다.

 

전처리 코드를 생성하는 셸 스크립트 build_preprocess_rpi_kernel.sh을 작성합니다.

#!/bin/bash

echo "configure build output path"

KERNEL_TOP_PATH="$( cd "$(dirname "$0")" ; pwd -P )"
OUTPUT="$KERNEL_TOP_PATH/out"
echo "$OUTPUT"

KERNEL=kernel7
BUILD_LOG="$KERNEL_TOP_PATH/rpi_preproccess_build_log.txt"

PREPROCESS_FILE=$1
echo "build preprocessed file: $PREPROCESS_FILE"

echo "move kernel source"
cd linux

echo "make deconfig"
make O=$OUTPUT bcm2709_defconfig

echo "kernel build"
make $PREPROCESS_FILE O=$OUTPUT zImage modules dtbs -j4 2>$1 | tee $BUILD_LOG


파일을 저장한 후에는 chmod 명령어를 입력해 파일에 실행 권한을 부여합니다.

root@raspberrypi:/home/pi/rpi_kernel_src# chmod +x build_rpi_kernel.sh

linux/kernel/sched/core.c 파일을 전처리 코드로 추출하려면 다음 현식으로 셸 스크립트를실행하면 됩니다.

./build_preprocess_rpi_kernel.sh kernel/sched/core.i

 

소스 코드의 디렉토리를 잘 못 입력하면 에러 메시지와 함께 빌드가 종료됩니다. linux 폴더를 기준으로 한 소스 코드의 위치를 입력하면 됩니다.

 

*Reference
https://www.raspberrpi.org/documentation/linux/kernel/building.md
디버깅을 통해 배우는 리눅스 커널의 구조와 원리
http://egloos.zum.com/rousalome/v/10011640

반응형

'Operating System > Linux' 카테고리의 다른 글

[Linux] Vim 설치 및 vimrc 설정  (0) 2021.09.12
[Linux] 쉘 스크립트 기본 문법  (0) 2021.08.18