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
✅ 정리
- 부트 파티션 장치명이 /dev/mmcblk0p1 또는 /dev/sdX1로 다를 수 있음
- 64비트 커널을 사용하려면 config.txt에서 arm_64bit=1이 필요할 수 있음
- 빌드된 커널의 시간 정보는 빌드 시점에 따라 다를 수 있음
'프로그래밍 > 시스템' 카테고리의 다른 글
커널 포팅 (마무리 및 추가 학습 자료) (0) | 2025.03.06 |
---|---|
커널 포팅 (6. 실전 커널 포팅 프로젝트 / 6.2 새로운 보드용 커널 포팅 프로젝트 진행) (0) | 2025.03.06 |
커널 포팅 (5. 고급 커널 포팅 및 최적화 / 5.3 커널 디버깅 및 프로파일링) (0) | 2025.03.06 |
커널 포팅 (5. 고급 커널 포팅 및 최적화 / 5.2 루트 파일 시스템 설정) (0) | 2025.03.06 |
커널 포팅 (5. 고급 커널 포팅 및 최적화 / 5.1 부트로더 커스터마이징) (0) | 2025.03.06 |