커널 포팅 (6. 실전 커널 포팅 프로젝트 / 6.1 라즈베리파이(Raspberry Pi) 커널 포팅 실습)

2025. 3. 6. 19:46프로그래밍/시스템

6.1 라즈베리파이(Raspberry Pi) 커널 포팅 실습

라즈베리파이에서 커널을 포팅하고 커스터마이징하는 과정은 커널 소스 코드 빌드, 부팅 설정 변경, 커널 테스트로 구성됩니다.
이 장에서는 라즈베리파이 커널 소스 빌드 및 커스터마이징, config.txt 및 cmdline.txt 설정 변경, 부팅 성공 여부 확인을 다룹니다.
또한 부트 파티션과 루트 파일 시스템 파티션의 장치명, 미래 날짜 표기 예시, 최신 config.txt의 64비트 커널 설정 여부에 대한 고려사항을 반영합니다.


🔹 1️⃣ 라즈베리파이 커널 소스 빌드 및 커스터마이징

📌 1️⃣ 라즈베리파이 커널 소스 다운로드

라즈베리파이의 공식 커널 소스 코드는 GitHub에서 제공됩니다.
최신 버전을 다운로드하려면 다음 명령어를 실행합니다.

git clone --depth=1 https://github.com/raspberrypi/linux.git
cd linux
  • --depth=1 옵션을 사용하면 최신 커밋만 다운로드하여 속도를 높일 수 있습니다.

현재 사용 중인 라즈베리파이 커널 버전 확인

uname -r

예제 출력:

6.1.21-v8+

만약 특정 버전의 커널을 다운로드하려면 다음과 같이 체크아웃합니다.

git checkout <원하는 커널 버전 태그>

예제:

git checkout rpi-6.1.y

📌 2️⃣ 크로스 컴파일러 설정

라즈베리파이의 커널을 빌드하려면 ARM 크로스 컴파일러가 필요합니다.
라즈베리파이에서 직접 빌드할 수도 있지만, 속도가 느리기 때문에 PC에서 크로스 컴파일하는 것이 권장됩니다.

크로스 컴파일러 설치

sudo apt install gcc-aarch64-linux-gnu

환경 변수 설정

export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-

📌 3️⃣ 기본 커널 설정

라즈베리파이에서 사용하는 기본 커널 설정 파일을 로드합니다.

기본 설정 적용

make bcm2711_defconfig
  • bcm2711_defconfig → 라즈베리파이 4 모델에 적합한 기본 설정 로드

커널 설정 변경 (menuconfig)

make menuconfig
  • 필요한 드라이버 추가/제거 가능
  • Device Drivers → 특정 하드웨어 지원 추가 가능
  • Kernel hacking → 디버깅 관련 옵션 활성화 가능

설정 저장 후 종료


📌 4️⃣ 커널 빌드

커널을 빌드할 때 병렬 빌드를 수행하여 속도를 높일 수 있습니다.

make -j$(nproc) Image modules dtbs
  • Image → 커널 바이너리
  • modules → 커널 모듈
  • dtbs → 디바이스 트리 파일

빌드 완료 후 생성된 커널 확인

ls arch/arm64/boot/Image

빌드된 커널 모듈 설치

sudo make modules_install INSTALL_MOD_PATH=/mnt/rpi-rootfs
  • /mnt/rpi-rootfs는 라즈베리파이의 SD 카드가 마운트된 경로

🔹 2️⃣ config.txt 및 cmdline.txt 설정 변경

라즈베리파이의 부트 설정은 /boot 디렉토리에 있는 config.txt 및 cmdline.txt 파일에서 관리됩니다.

SD 카드 마운트

sudo mount /dev/mmcblk0p1 /mnt/rpi-boot
sudo mount /dev/mmcblk0p2 /mnt/rpi-rootfs
  • 최신 라즈베리파이 OS 버전에서는 부트 파티션과 루트 파일 시스템 파티션이 /dev/mmcblk0p1과 /dev/mmcblk0p2로 표시될 수 있음
  • 그러나 PC에서 SD 카드를 마운트할 때는 /dev/sdX1과 /dev/sdX2 형식으로 나타날 수 있음

📌 1️⃣ config.txt 수정

파일 경로: /mnt/rpi-boot/config.txt

sudo nano /mnt/rpi-boot/config.txt

부팅할 커널 변경

kernel=Image
disable_overscan=1
dtparam=i2c_arm=on
dtparam=spi=on
  • kernel=Image → 커널 파일을 /boot/Image로 설정
  • dtparam=i2c_arm=on → I2C 활성화
  • dtparam=spi=on → SPI 활성화

64비트 커널 사용 설정 (필요한 경우) 라즈베리파이 4의 경우 최신 config.txt에서는 64비트 커널을 사용하려면 arm_64bit=1 설정이 필요할 수 있습니다.

arm_64bit=1
  • 하지만 이는 시스템 구성에 따라 선택적으로 필요한 설정이며, 모든 경우에 필수는 아님.

HDMI 및 UART 설정 (옵션)

hdmi_force_hotplug=1
enable_uart=1

📌 2️⃣ cmdline.txt 수정

파일 경로: /mnt/rpi-boot/cmdline.txt

sudo nano /mnt/rpi-boot/cmdline.txt

커널 커맨드라인 설정

console=serial0,115200 root=/dev/mmcblk0p2 rootfstype=ext4 rw elevator=deadline fsck.repair=yes

cmdline.txt 설정 적용 후 부팅 SD 카드를 제거하고 라즈베리파이에 삽입한 후 부팅합니다.


🔹 3️⃣ 라즈베리파이에서 부팅 성공 여부 확인

1️⃣ 부팅 로그 확인 (dmesg)

dmesg | grep "Linux version"

출력 예시:

[    0.000000] Linux version 6.1.21-v8+ (user@host) (gcc version 11.3.0, GNU ld version 2.38) #1 SMP PREEMPT Fri Mar 1 12:00:00 UTC 2024

참고: Fri Mar 1 12:00:00 UTC 2024는 단순한 예시이며, 빌드 시점에 따라 다르게 나타남.

2️⃣ 새로운 커널 버전 확인

uname -r

출력 예시:

6.1.21-v8+

3️⃣ 커널 모듈 로드 확인

lsmod

4️⃣ GPIO, I2C, SPI 활성화 확인

ls /dev | grep gpio
ls /dev | grep i2c
ls /dev | grep spi

5️⃣ UART 시리얼 콘솔을 통한 부팅 로그 확인

sudo screen /dev/ttyUSB0 115200

✅ 정리

  1. 부트 파티션 장치명이 /dev/mmcblk0p1 또는 /dev/sdX1로 다를 수 있음
  2. 64비트 커널을 사용하려면 config.txt에서 arm_64bit=1이 필요할 수 있음
  3. 빌드된 커널의 시간 정보는 빌드 시점에 따라 다를 수 있음