기본 콘텐츠로 건너뛰기

라즈베리파이 커널 컴파일

- 라즈베리파이의 부트절차

1. Power on
2. SoC Rom의 첫번째 부트로더(Firmware)을 읽음.
3. 첫번째 부트로더가 MicroSD의 두번째 부트로더(bootcode.bin)을 호출
4. 두번째 부트로더가 MicroSD의 config.txt 파일을 읽고 실행.
5. 두번째 부트로더가 세번째 부트로더 (start.elf)을 호출 실행 ARM core 활성화
6. ARM core가 네번째 부트로더(kernel.img)을 호출 실행
7. module load
8. init 실행 (daemon 실행)

부팅에 필요한 최소한의 세가지 : bootcode.bin, start.elf(start_cd.elf / start_x.elf), kernel.img


- 라즈베리파이 커널 크로스 컴파일

- 커널 소스 내려받기 : 커널 소스가 필요한 이유? 임베디드 환경에 맞게 커널을 축소하기 위해서.


  • git : sw 버전관리& 페키지를 쉽게 다운받기 위해 사용.
#atp-get install git -y
#git init


#mkdir /raspberrypi
  • 필요한 커널 소스 다운 및 크로스컴파일러 다운.
    : www.kernel.org 에서도 다운 가능.
#cd /raspberrypi
#apt-get update
#apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386 libc6-dev-i386 lib32z1

#git clone --depth=1 https://github.com/raspberrypi/linux
#export KERNEL=kernel7
  • make를 이용해 크로스 컴파일 시켜줌.
#apt-get install gcc-arm-linux-gnueabi make
#cd linux
#make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2709_defconfig
#make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage
#make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- modules
#make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- dtbs
#make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=/root/raspberrypi/rpi/root modules_install

  • kpartx : 파일시스템의 루프백 이미지를 만들어줌
#apt-get install kpartx
#dd if=/dev/zero of=rpi.img bs=1204 count=0 seek=$[1024*1000]

#file rpi.img
#rpi.img : data

#fdisk rpi.img를 이용해 2개의 파티션을 만들어줌, 하나의 파티션은 FAT32

#kpartx -av rpi.img // 루프백 파일
#mkdir -p rpi/boot rpi/root

// 파일시스템 만들기.
#mkfs.vfat /dev/mapper/loop0p1
#mkfs.ext4 /dev/mapper/loop0p2

//마운트
#mount /dev/mapper/loop0p1 rpi/boot
#mount /dev/mapper/loop0p2 rpi/root

#scripts/mkknlimg arch/arm/boot/zImage /raspberrypi/rpi/boot/$KERNEL.img

#cp arch/arm/boot/dts/*.dtb /raspberrypi/rpi/boot

  • overlays에 관련 파일 복사
#mkdir /raspberrypi/rpi/boot/overlays
#cp arch/arm/boot/dts/overlays/*.dtb* /raspberrypi/rpi/boot/overlays
#cp arch/arm/boot/dts/overlays/README /raspberrypi/rpi/boot/overlays

  • Firmware다운로드 후 복사

#cd ../
#git clone --depth=1 https://github.com/raspberrypi/firmware.git

#cd firmware/boot
#cp bootcode.bin fixup.dat fixup_cd.dat fixup_db.dat fixup_x.dat start.elf start_cd.elf start_cd.elf start_x.elf /raspberrypi/rpi/boot

  • 라즈베리파이 부팅 usb 삽입후 파일 복사
#cd /media/yjlee/boot 
#cp config.txt /raspberrypi/rpi/boot
#cp comdline.txt /raspberrypi/rpi/boot

- busybox

하나의 실행 파일 안에 스트립 다운된 일부 유닉스 도구들을 제공하는 소프트웨어이다. 리눅스안드로이드,[6] FreeBSD,[7]와 같은 다양한 POSIX 환경에서 실행되지만 도구들 중 다수가 리눅스 커널이 제공하는 인터페이스와 함께 동작하도록 설계되어 있다. 자원이 매우 적은 임베디드 운영 체제를 위해 작성되었다. 제작자들은 이를 임베디드 리눅스의 스위스 군용 칼로 불렀는데,[8] 그 이유는 하나의 실행 파일이 300개 이상의 공통 명령들의 기본 기능들을 대체하기 때문이다. GNU GPL v2 조항에 의거하여 자유 소프트웨어로 출시된다.

#cd /raspberrypi
#wget http://busybox.net/downloads/buxybox-1.25.0.tar.bz2
#tar -xvf busybox-1.25.0.tar.bz2
#cd busybox-1.25.0.tar.bz2
#make defconfig
#apt-get install libncurses5-dev
#make menuconfig
Busybox Settings --> Build Option에서 다음과 같이 설정. 저장 후 종료.


#make
#make install
#cp -R _install/* /raspberrypi/rpi/root
#cd /raspberrypi/rpi/root
#rm linuxrc
#mkdir dev etc proc root src sys tmp
#chmod 1777 tmp //스키티 비트

#vi bootscript.sh // 아래 내용 작성 후 저장

#chmod +x bootscript.sh

#vi rc.dhcp

#chmod +x rc.dhcp

#vi welcome.txt

#vi inittab

#cd ..
#cd root
#vi init
#chmod +x init

#cd ../../..
#umount rpi/boot
#umount rpi/root
#kpartx -dv rpi.img

#wget https://raw.githubusercontent.com/abock/image-usb-stick/master/image-usb-stick
#chmod +x image-usb-stick
#./image-usb-stick rpi


  • 라즈베리파이로 옮겨와 부팅!

약간의 오류가 있긴 했지만. 일단은 성공!


- 임베디드 리눅스 쉽게 설치하기.

- 라즈베리파이3

https://buildroot.org/ 에서 받을 수 있음. : 다양한 버전을 지원한다.
#wget https://buildroot.org/downloads/buildroot-2017.02.5.tar.gz
#tar xvf buildroot-2017.02.5.tar.gz
#cd buildroot-2017.02.5
#ls configs/rasp*
#make raspberrypi3_defconfig
#make menuconfig

 : 임베디드 설정에 맞게 설정 변경.



  • 최신 ARM 리눅스 커널 4.x 분석 블로그 : http://jake.dothome.co.kr/


댓글

이 블로그의 인기 게시물

유닉스 & 리눅스 가계도. Unix&Linux Family

- Unix Family - Shell History

모든 프로그래머가 알아야 할 것들 목록.

Every Programmer Should Know Algorithms Big O Cheatsheet 📖   Grokking Algorithms Sorting Algorithms Numbers 📄   Floating Point Guide 📄   Basic Number Theory Every Programmer Should Know... 📄   Falsehoods Programmers Believe About Phone Numbers Strings Big List of Naughty Strings 📄   Unicode and Character Sets Homoglyphs Unicode Common Locale Data Repository Falsehoods Programmers Believe About Names Latency Interactive Latency Infographics 📄   Latency Numbers Every Programmer Should Know Time 📄   Falsehoods programmers believe about time 📄   More falsehoods programmers believe about time; “wisdom of the crowd” edition 📄   Some notes about time 📄   Falsehoods programmers believe about time and time zones Memory 📄   What every Programmer should know about memory Distributed Systems 📖   Designing Data-Intensive Applications 📜   Designs, Lessons and Advice from Building Large Distributed Systems 📜   Time, Clocks and the Orderi