Embedded/RaspberryPI

라즈베리파이(Raspberry Pi) 리눅스 커널 구성 확인 및 빌드(build) 해보기

변화의 물결1 2025. 1. 10. 23:59

 

 

안녕하세요.

  

 Rasbperry Pi를 사용하지만, 실질적으로 커널을 빌드해 볼 일을 많이 없을 것이라 생각됩니다. Device Driver 개발을 위해 커널 소스 혹은 해더를 다운로드하는 정도일 것입니다. 간단하게 커널 구성 내용과 빌드하는 방법 정도는 알아 두면 좋을 듯합니다.

 

 언제 시점에서 테스트하느냐에 따라서 디렉터리 경로가 변경될 수 있으니 참고해서 따라 하시면 도움일 될 것입니다.

 


 

1. 커널 빌드를 위한 패키지 설치

 

git : 버전 관리 시스템으로, 소스 코드를 효율적으로 관리하고 공동 작업을 지원합니다. Git은 로컬과 원격 저장소 간의 코드 동기화를 가능하게 합니다.

 

bc : 고급 계산기 언어로, 명령줄에서 수학적 계산을 수행할 수 있습니다. 특히, 스크립트에서 복잡한 계산을 처리할 때 유용합니다.

 

bison : 파서(GNU Parser) 생성기로, 문법 정의에 기반하여 컴파일러나 인터프리터를 개발할 때 사용됩니다. 주로 C 프로그래밍 언어와 함께 쓰입니다.

 

flex : 렉서(어휘 분석기) 생성기로, 문자열을 분석하여 토큰으로 변환하는 프로그램을 생성합니다. Bison과 함께 컴파일러 개발에 자주 사용됩니다.

 

libssl-dev : OpenSSL 라이브러리를 포함하며, SSL/TLS 프로토콜 구현을 위한 헤더 파일과 라이브러리를 제공합니다. 네트워크 통신 보안을 설정하는 데 필수적입니다.

 

make : 빌드 자동화 도구로, Makefile을 사용하여 소프트웨어 컴파일 및 빌드 프로세스를 자동화합니다. 개발 중 의존성 관리를 지원합니다.

 

libncurses5-dev : 터미널 기반 애플리케이션 개발을 위한 라이브러리로, 터미널에서 UI를 구성하는 데 사용됩니다. 텍스트 기반 메뉴나 화면 갱신 기능을 구현할 수 있습니다. 예를 들어, 커널 메뉴 구성을 선택할 수 있는 화면 기능을 구현합니다.

   

$ sudo apt-get install git bc bison flex libssl-dev make libncurses5-dev -y

 

 

 

2. Raspberry Pi Linux 커널 소스코드 다운로드

 

소스코드를 받을 디렉터리를 생성합니다.

 

$ mkdir ras_kernel
$ cd ras_kernel

 

 

 

 이제 커널 소스코드를 가져와야 하는데요 --depth=1 옵션을 넣어 최신 커밋 내용만 가져옵니다. 소스코드 전체를 분석할 하거나 commit을 할 것이 아니기 때문에 최신내용만 가지고 와서 빌드하겠습니다. (참고, Git 리파지토리의 전체 이력 일부만 받아오는 행위를 shallow clone이라고 합니다.)

 

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

 

 

커널 빌드과정에서 사용되는 특정 명령어는 root 권한이 필요하기 때문에 루트권한으로 시작합니다.

 

$ sudo su

 

 

 

타깃보드마다 아키텍처에 맞게 커널 설정을 해야 하는데 기본 설정파일들을 선택해 줄 수 있습니다. 64bit 모드인 경우 설정파일 확인할 수 있습니다.

 

# ls -al arch/arm64/configs/

 

 

 

 Raspberry Pi 4 model 경우 bcm2711이므로 bcm2711_defconfig를 사용합니다. 미리 커널이미지 이름(환경 변수)을 지정해 주는 데 32bit 경우 kernel7l, 64bit 경우 kernel8로 해줍니다. 그리고 make로 커널 빌드에 필요한 .config 구성파일을 생성합니다.

 

# KERNEL=kernel8
# make bcm2711_defconfig

 

 

카테고리별 커널 기능의 구성 메뉴 프로그램을 실행합니다. 구성만 확인하고 Exit를 선택하고 나옵니다.

 

# make menuconfig

 

 

 .config로 보면 어떤 기능들이 설정되어 있는지 확인할 수 있습니다. 그러나 주석처럼 자동으로 생성된 파일이니 수정하지 말라고 쓰여있습니다.

 

# vim .config

 

 

 

3. 커널 빌드하기

 

 make 명령어로 커널 이미지와 구성요소를 빌드합니다. 여기서 32bit 경우 빌드 타깃 명을  zImage로 64bit 경우 Image로 입력합니다. 커널 이미지만 빌드하고 싶을 경우 modules, dtbs를 빼고 입력하면 됩니다. 여기서는 다 포함해서 빌드 진행합니다.

 

 라즈베리 파이에서 직접 빌드하다 보니 시간이 오래 걸립니다. 커널 빌드 테스트만 할 경우 이전 시간에 만들었던 RAMDisk에서 작업하시면 조금 더 빠른 결과를 확인할 수 있습니다. 그러나 주의할 점은 2G RAM 이상 버전에서 추천드리며 실수로 재부팅하면 다시 위의 작업을 해야 하므로 주의가 필요합니다.

 

# make -j4 Image modules dtbs

 

 

 

 빌드가 완료되면 arch/arm64/boot 아래에 파일들이 생성되며 빌드가 끝난 커널 모듈은 모듈 디렉터리에 복사할 수 있도록 명령어를 modules_install 명령어를 실행합니다.

 

# ls -al arch/arm64/boot

 

 

 

# sudo make modules_install

 

 

  

 DT(Device Tree) 파일들도 정해진 위치에 복사합니다. 

 

# sudo cp arch/arm64/boot/dts/broadcom/*.dtb /boot/firmware/
# sudo cp arch/arm64/boot/dts/overlays/*.dtb* /boot/firmware/overlays/
# sudo cp arch/arm64/boot/dts/overlays/README /boot/firmware/overlays/

 

 

 

위의 방법 혹은 아래 명령을 실행합니다.

 

# make dtbs_install

 

 

4. 커널 이미지 적용

 

<커널 적용하기 전>

 

위에서 빌드된 커널 이미지를 적용하기 전에 기존의 이미지를 버전을 확인하고 복사해 둡니다.

 

# cat /proc/version

혹은

# uname -r

 

 

 

커널 이미지 교체 전의 파일 정보

 

 

 

<빌드한 커널 이미지 적용 후>

 

 빌드한 커널 이미지를 복사하고 재부팅하면 변경된 커널 이미지를 복사합니다. 기존에 최적화된 것과 달리 용량이 큰 것을 알 수 있습니다.

 

# sudo cp arch/arm64/boot/Image /boot/firmware/$KERNEL.img

 

 

# reboot

 

 

재부팅이 된 이후에 다시 커널 정보를 확인하면 버전 정보와 날짜가 변경된 것을 확인할 수 있습니다.

 

$ cat /proc/version

혹은

$ uname -r

 

 

 

 

감사합니다.

 

 

 

<참고 자료>

1. [도서] 임베디드 소프트웨어 베이직, 8.1 리눅스 커널 구성/빌드

2. 커널 빌드 & 설치 (with 라즈베리파이 4)

https://www.how2flow.net/posts/kernel-build/ 

반응형