삼국지도 다 끝났고, 남는 시간에 리눅스 커널을 배워 보기로 했다. 시간 남을 땐 이게 효과가 확실하지. 전에 샀던 “디버깅을 통해 배우는 리눅스 커널의 구조와 원리”를 따라 해보기로 했다. 커널이 리눅스 심장과 같아 꼭 배울 필요는 없지만, 알면 편하게 살 수 있다. 리눅스 역시 과거 서버를 벗어나 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를 전에 받았던 백업에서 복사했다. 다행히 잘 된다. 두 번은 하지만, 세 번은 못 하겠다. 책이 왜 스크립트를 설명했는지 이해된다.