raspberry pi4 커널 컴파일

삼국지도 다 끝났고, 남는 시간에 리눅스 커널을 배워 보기로 했다. 시간 남을 땐 이게 효과가 확실하지. 전에 샀던 “디버깅을 통해 배우는 리눅스 커널의 구조와 원리”를 따라 해보기로 했다. 커널이 리눅스 심장과 같아 꼭 배울 필요는 없지만, 알면 편하게 살 수 있다. 리눅스 역시 과거 서버를 벗어나 arm에 로딩되어 여러 임베디드 리눅스로 사용되고 있다. 라즈베리 파이 역시 미친 가격으로 집에서 누구나 쉽게 구할 수 있다. 지금 IoT가 뜨고 있는데 안 배울 이유가 없다.

책에 나온 커널이 버전 4.19다. 2021. 5월 업데이트를 하면 커널 5.10을 사용한다. 일단 커널을 4.19 버전으로 강제로 맞춰야 한다.

pi@raspberrypi:~ $ uname -a
Linux raspberrypi 5.10.17-v7l+ #1414 SMP Fri Apr 30 13:20:47 BST 2021 armv7l GNU/Linux

책 53 페이지에 나온대로 따라했다. 15년전에 비하면 정말 편해졌다. 그 때 컴파일 옵션이 너무 많아 하드웨어 지식이 없어 무엇을 선택할 지 몰랐다.

#https://www.raspberrypi.org/documentation/linux/kernel/building.md

#필요 모듈 설치.
sudo apt install git bc bison flex libssl-dev make

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

cd linux
#KERNEL=kernel7
KERNEL=kernel7l
#make bcm2709_defconfig
make bcm2711_defconfig

책은 make bcm2709_defconfig로 컴파일 옵션을 설정했다. 아무 생각없이 따라하다 보면 usb를 하나도 인식하지 못하는 현상을 겪는다.

pi@raspberrypi:~ $ lsusb
pi@raspberrypi:~ $

이거 때문에 한동안 고민했다. make menu로 usb를 설정하는 옵션을 찾아 켜주면 될 듯 한데, 내가 많이 몰라 다른 옵션을 어떻게 설정할지 판단 못하겠다. 옵션 하나 켜겠다고 그 짓을 해야되나… usb가 막혀 키보드도 연결되지 않고, usb 메모리, 카메라 등 아무것도 연결되지 않았다. usb 4포트가 모두 불량인 줄 알고 환불할 뻔 했다.

pi@raspberrypi:~ $ cat /proc/cpuinfo
processor	: 0
model name	: ARMv7 Processor rev 3 (v7l)
BogoMIPS	: 270.00
Features	: half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32 
CPU implementer	: 0x41
CPU architecture: 7
CPU variant	: 0x0
CPU part	: 0xd08
CPU revision	: 3

processor	: 1
model name	: ARMv7 Processor rev 3 (v7l)
BogoMIPS	: 270.00
Features	: half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32 
CPU implementer	: 0x41
CPU architecture: 7
CPU variant	: 0x0
CPU part	: 0xd08
CPU revision	: 3

processor	: 2
model name	: ARMv7 Processor rev 3 (v7l)
BogoMIPS	: 270.00
Features	: half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32 
CPU implementer	: 0x41
CPU architecture: 7
CPU variant	: 0x0
CPU part	: 0xd08
CPU revision	: 3

processor	: 3
model name	: ARMv7 Processor rev 3 (v7l)
BogoMIPS	: 270.00
Features	: half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm crc32 
CPU implementer	: 0x41
CPU architecture: 7
CPU variant	: 0x0
CPU part	: 0xd08
CPU revision	: 3

Hardware	: BCM2711
Revision	: b03114
Serial		: 100000003d82cd51
Model		: Raspberry Pi 4 Model B Rev 1.4

책에 없지만, 웹 사이트와 여기 보드 정보를 보면 bcm2711을 사용했다. 이 옵션이 맞다. 이게 customized 제품과 대량 생산품 차이다. 이 옵션을 개인이 일일히 다 넣어주려면 힘들겠다. 표준화된 하드웨어를 사용함이 훨씬 낫다. 아무리 많이 판대도 raspberry pi 만큼 팔릴 수 있을 지 모르겠다. 단가에서 경쟁하기 어렵다고 본다.

make -j4 zImage modules dtbs
sudo make modules_install
sudo cp arch/arm/boot/dts/*.dtb /boot/
sudo cp arch/arm/boot/dts/overlays/*.dtb* /boot/overlays/
sudo cp arch/arm/boot/dts/overlays/README /boot/overlays/
sudo cp arch/arm/boot/zImage /boot/$KERNEL.img

나머지를 실행한다. boot 디렉토리 파일을 덮어쓰기 전에 기존 파일을 꼭 백업해야 한다. 그냥 날려 버리면 나처럼 다시 이미지를 구워야 한다.

pi@raspberrypi:~ $ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
pi@raspberrypi:~ $ uname -a
Linux raspberrypi 4.19.127-v7l+ #2 SMP Thu May 13 15:17:29 BST 2021 armv7l GNU/Linux

1.5시간 컴파일 후 정상적으로 부팅했음을 확인했다.

cross compile을 하기로 했다. 1.5 시간이 10분으로 줄어드는 마법을 보았다. https://www.raspberrypi.org/documentation/linux/kernel/building.md 사이트에 가면 cross compile 하는 방법이 나와 있다. 그대로 따라하면 된다.

/boot 디렉토리 내용을 통째로 날렸는데, 그러면 안된다. start.elf 파일이 없다고 부팅되지 않는다.

pi@raspberrypi:/boot $ ls -l
total 27721
-rwxr-xr-x 1 root root   24270 May 15  2021 bcm2708-rpi-b-plus.dtb
-rwxr-xr-x 1 root root   24007 May 15  2021 bcm2708-rpi-b.dtb
-rwxr-xr-x 1 root root   23788 May 15  2021 bcm2708-rpi-cm.dtb
-rwxr-xr-x 1 root root   24448 May 15  2021 bcm2708-rpi-zero-w.dtb
-rwxr-xr-x 1 root root   23712 May 15  2021 bcm2708-rpi-zero.dtb
-rwxr-xr-x 1 root root   25334 May 15  2021 bcm2709-rpi-2-b.dtb
-rwxr-xr-x 1 root root   25483 May 15  2021 bcm2710-rpi-2-b.dtb
-rwxr-xr-x 1 root root   27143 May 15  2021 bcm2710-rpi-3-b-plus.dtb
-rwxr-xr-x 1 root root   26524 May 15  2021 bcm2710-rpi-3-b.dtb
-rwxr-xr-x 1 root root   25338 May 15  2021 bcm2710-rpi-cm3.dtb
-rwxr-xr-x 1 root root   41185 May 15  2021 bcm2711-rpi-4-b.dtb
-rwxr-xr-x 1 root root   18695 May 15  2021 bcm2835-rpi-a-plus.dtb
-rwxr-xr-x 1 root root   18579 May 15  2021 bcm2835-rpi-a.dtb
-rwxr-xr-x 1 root root   18982 May 15  2021 bcm2835-rpi-b-plus.dtb
-rwxr-xr-x 1 root root   18858 May 15  2021 bcm2835-rpi-b-rev2.dtb
-rwxr-xr-x 1 root root   18725 May 15  2021 bcm2835-rpi-b.dtb
-rwxr-xr-x 1 root root   18690 May 15  2021 bcm2835-rpi-cm1-io1.dtb
-rwxr-xr-x 1 root root   19173 May 15  2021 bcm2835-rpi-zero-w.dtb
-rwxr-xr-x 1 root root   18647 May 15  2021 bcm2835-rpi-zero.dtb
-rwxr-xr-x 1 root root   19558 May 15  2021 bcm2836-rpi-2-b.dtb
-rwxr-xr-x 1 root root   21027 May 15  2021 bcm2837-rpi-3-b-plus.dtb
-rwxr-xr-x 1 root root   20238 May 15  2021 bcm2837-rpi-3-b.dtb
-rwxr-xr-x 1 root root   52456 May 15  2021 bootcode.bin
-rwxr-xr-x 1 root root     121 May 15  2021 cmdline.txt
-rwxr-xr-x 1 root root    1809 May 15  2021 config.txt
-rwxr-xr-x 1 root root    7314 May 15  2021 fixup.dat
-rwxr-xr-x 1 root root    5446 May 15  2021 fixup4.dat
-rwxr-xr-x 1 root root    3191 May 15  2021 fixup4cd.dat
-rwxr-xr-x 1 root root    8454 May 15  2021 fixup4db.dat
-rwxr-xr-x 1 root root    8452 May 15  2021 fixup4x.dat
-rwxr-xr-x 1 root root    3191 May 15  2021 fixup_cd.dat
-rwxr-xr-x 1 root root   10298 May 15  2021 fixup_db.dat
-rwxr-xr-x 1 root root   10298 May 15  2021 fixup_x.dat
-rwxr-xr-x 1 root root     145 May 15  2021 issue.txt
-rwxr-xr-x 1 root root 5773448 May 15  2021 kernel7l.img
drwxr-xr-x 2 root root   16384 May 15  2021 overlays
-rwxr-xr-x 1 root root 2952928 May 15  2021 start.elf
-rwxr-xr-x 1 root root 2228768 May 15  2021 start4.elf
-rwxr-xr-x 1 root root  793084 May 15  2021 start4cd.elf
-rwxr-xr-x 1 root root 3722504 May 15  2021 start4db.elf
-rwxr-xr-x 1 root root 2981160 May 15  2021 start4x.elf
-rwxr-xr-x 1 root root  793084 May 15  2021 start_cd.elf
-rwxr-xr-x 1 root root 4794472 May 15  2021 start_db.elf
-rwxr-xr-x 1 root root 3704712 May 15  2021 start_x.elf

overlays 내용을 날리고, 새로 컴파일 버전으로 설치했고, start.elf, *.dat, bootcode.bin, *.txt를 전에 받았던 백업에서 복사했다. 다행히 잘 된다. 두 번은 하지만, 세 번은 못 하겠다. 책이 왜 스크립트를 설명했는지 이해된다.

코멘트

댓글 남기기

이 사이트는 Akismet을 사용하여 스팸을 줄입니다. 댓글 데이터가 어떻게 처리되는지 알아보세요.