라즈베리파이

[라즈베리파이] 커널 빌드 (크로스 컴파일) - SCP 이용

다락공방 2024. 8. 30. 23:20

라즈베리파이상에서 커널을 빌드하는건 시간이 너무 오래 걸린다.

크로스컴파일하면 커널을 빌드하면 시간을 절약할 수 있다. 

 

aarch64용 리눅스 커널우분투 가상 머신에서 빌드하고, 전송하여 적용시키는 것을 설명하고자 한다. 

내가 사용한 PC 우분투 버전은 Ubuntu 22.04.4 LTS (GNU/Linux 4.4.0-19041-Microsoft x86_64) 이다.

커널적용 대상은 라즈베리파이 4B 64비트 운영체제 기준이다.

 

 

 

https://www.raspberrypi.com/documentation/computers/linux_kernel.html

이사이트에서 공식적으로 라즈베리파이 리눅스 커널 빌드 방법을 자세히 알려주고 있다.

 

 

 


소스 받기

로컬 기기에서 빌드할때와 마찬가지로 아래 코드를 통해 linux 소스를 받을 수 있다. 

 

git clone --depth=1 https://github.com/raspberrypi/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 directory: $OUTPUT"

KERNEL=kernel8
BUILD_LOG="$KERNEL_TOP_PATH/rpi_build_log.txt"

echo "Move to kernel source directory"
cd linux

echo "Make defconfig for bcm2711"
make CROSS_COMPILE=arm-linux-gnueabihf- O=$OUTPUT bcm2711_defconfig

echo "Build kernel, modules, and device tree blobs"
make CROSS_COMPILE=arm-linux-gnueabihf- O=$OUTPUT Image.gz modules dtbs -j12 2>&1 | tee $BUILD_LOG

echo "Kernel build completed. Log saved to $BUILD_LOG"

# 현재 디렉토리에 모듈 설치 디렉토리 생성
MODULES_DIR=$KERNEL_TOP_PATH/modules
mkdir -p $MODULES_DIR

echo "Install modules"
sudo make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- O=$OUTPUT INSTALL_MOD_PATH=$MODULES_DIR modules_install

echo "Kernel image and modules have been installed to $MODULES_DIR"

마찬가지로 셸스크립트를 만들어 자동화시켰다.

로컬때 처럼 /out 폴더를 만들어 빌드한 결과를 저장하였다.

로그는 txt파일에 저장하였다. 

로컬에서 빌드할때와 비슷한데 크게 차이점을 살펴보면 

1. CROSS_COMPILE 옵션의 추가

CROSS_COMPILE=arm-linux-gnueabihf-의 옵션을 추가하므로써 x86 아키텍처의 컴퓨터(일반적인 PC)에서 ARM 아키텍처(라즈베리 파이 등)에서 실행될 소프트웨어를 컴파일을 가능하게 한다.

2. 모듈 설치 디렉토리 추가

모듈도 설치한후에 옮길것이므로 설치 디렉토리에 설치해준다.

 

이렇게 하면 이전에 말한 3가지 

1. 커널 이미지

2. 모듈

3. dtb 파일들

파일들을 얻을 수있다. 이제 빌드한 파일들을 scp 통신방법으로 라즈베리파이에 전송하고, 설치할 것이다.

아래는 스크립트 적용후 파일디렉토리

 

 

 

 

 

 


 

이제 라즈베리파이로 전송해야되는데, 인터넷에는 sd카드를 이용하는것도 있어보였지만 나는 SCP를 이용했다.

SCP

SCP(Secure Copy Protocol)는 네트워크를 통해 파일을 안전하게 전송하기 위해 사용되는 프로토콜이다. SCP는 SSH(Secure Shell) 프로토콜을 기반으로 하며, 보안성 높은 파일 전송을 가능하게 한다. SCP는 주로 서버 간에 파일을 복사하거나, 로컬 컴퓨터에서 원격 서버로 또는 원격 서버에서 로컬 컴퓨터로 파일을 전송하는 데 사용된다.

 

사용법:

scp [옵션] [원본 파일 경로] [목적지 경로]

 

예시:

scp localfile.txt user@remotehost:/remote/directory/

 

 

 

셸스크립트: 빌드된 파일 전송

 

#!/bin/bash

# 라즈베리 파이의 사용자명과 IP 주소 설정
PI_USER="aoddudwo"
PI_IP="..."
REMOTE_PATH="/home/$PI_USER/cross_kernel"
REMOTE_OVERLAYS_PATH="$REMOTE_PATH/overlays"
REMOTE_DTB_PATH="$REMOTE_PATH/dtb"

# 빌드된 파일 경로 설정
KERNEL_IMAGE="$PWD/out/arch/arm64/boot/Image.gz"
MODULES_DIR="$PWD/modules/lib/modules"
DTB_FILES="$PWD/out/arch/arm64/boot/dts/broadcom/*.dtb"
OVERLAYS_DIR="$PWD/out/arch/arm64/boot/dts/overlays"


# 커널 이미지 전송
echo "Transferring kernel image..."
scp -P 100 $KERNEL_IMAGE $PI_USER@$PI_IP:$REMOTE_PATH/

# 모듈 디렉토리 전송
echo "Transferring modules..."
scp -r -P 100 $MODULES_DIR $PI_USER@$PI_IP:$REMOTE_PATH/modules

# 디바이스 트리 블롭 전송
echo "Transferring device tree blobs..."
scp -P 100 $DTB_FILES $PI_USER@$PI_IP:$REMOTE_DTB_PATH/

# overlays 디렉토리 전송
echo "Transferring overlays..."
scp -P 100 $OVERLAYS_DIR/*.dtb* $PI_USER@$PI_IP:$REMOTE_OVERLAYS_PATH/

echo "File transfer completed."

 

커널이미지, 모듈, DTB파일의 경로를 설정후, 전송하낟.

이때 -P는 전송 포트를 설정하는 것으로 이전에 말했듯이 나는 100번 포트를 22번으로 SSH 포트포워딩 시켜놨기때문에 100번 포트로 전송했다. IP는 각자 기기의 IP로 설정하면된다.

 

 


커널 설치

이제 로컬로 파일이 전송되었다.

 

update_kernel.sh 셸로 적용해보자

 

#!/bin/bash

# 현재 폴더 경로
CURRENT_DIR=$(pwd)


# 백업 현재 커널 이미지
echo "Backing up the current kernel image..."
sudo cp /boot/firmware/$KERNEL.img /boot/firmware/$KERNEL-backup.img

# 새로운 커널 이미지 복사
echo "Copying the new kernel image..."
sudo cp $CURRENT_DIR/Image.gz /boot/firmware/$KERNEL.img

# DTB 파일 복사
echo "Copying DTB files..."
sudo cp $CURRENT_DIR/dtb/*.dtb /boot/firmware/

# Overlays 복사
echo "Copying overlay files..."
sudo cp $CURRENT_DIR/overlays/*.dtb* /boot/firmware/overlays/
sudo cp $CURRENT_DIR/README /boot/firmware/overlays/

# 6.6.37-v7l+ 폴더를 /lib/firmware로 복사
echo "Copying 6.6.37-v7l+ to /lib/firmware..."
sudo cp -r $CURRENT_DIR/modules/modules/6.6.37-v7l+ /lib/modules/

echo "Kernel update completed."

현재 커널이미지는 백업하고, 나머지는 알맞은 경로에 맞게 삽입하는것을 보인다. 

경로나 파일의 의미는 아래 포스트를 참조하면 좋을 듯하다.

https://oragg.tistory.com/65

 

[라즈베리파이] 커널 구성 요소 : 커널이미지, 모듈, DTB

앞선 커널 빌드 과정에서 보았듯이 총 3개의 모듈을 빌드해서 적용시킨다.차례대로 자세히 알아보자.1. 이미지파일설명:Image.gz는 커널 빌드 과정에서 생성된 커널 이미지 파일을 gzip 형식으로 압

oragg.tistory.com

 

적용하고 리부팅하면, 커널이 적용됨을 확인할 수 있다. 

 

... 

다음엔 디바이스 드라이버 포스트를 할 예정이다.