* 원문 링크 : https://www.raspberrypi.com/documentation/computers/linux_kernel.html
Building the Kernel
사용하는 OS 환경에서의 default compilers와 linkers는 그 OS에서 동작할 실행 파일을 빌드할 수 있도록 구성되어있다. 이를 native tools이라고 한다. 하지만, 꼭 build를 위해 native tools를 사용하지 않아도 된다. cross-compiler는 build하는 환경(host)의 code가 아닌 run할 환경(target)의 code를 build한다. 이를 cross-compilation이라 한다.
Raspberry Pi kernel의 cross-compilation은 두 가지 이유에서 유용하다.
1. 32bit OS에서 64bit kernel을 build할 수 있고 반대도 가능하다.
2. 일반 노트북에서도 Pi에서 보다 더 빠르게 cross-compile할 수 있다.
아래의 가이드는 native builds와 cross-compilation으로 구분된다. 읽는 이의 상황에 맞게 적절한 section을 선택한다. - 두 방법 사이엔 많은 공통점이 있지만 몇 가지 중요한 차이점도 있다.
Building the Kernel Locally
먼저 Raspberry Pi OS의 최신 버전을 설치한다. Pi를 boot하고 source에 접근할 수 있게 Ethernet을 연결한다.
Pi에서 log-in후 git과 build dependencies를 설치한다.
sudo apt install git bc bison flex libssl-dev make
다음으로 sources를 가져온다. 이는 시간이 소요되는 작업이다.
git clone --depth=1 https://github.com/raspberrypi/linux
* Choosing Sources
위의 "git clone" 명령은 현재 active branch를 다운로드한다(without any history). "--depth=1" 옵션을 생략하면 모든 repository를 다운로드한다(full history of all branches). 하지만 이경우 더 많은 시간과 용량이 필요하다.
다른 branch의 code를 받고 싶다면 "--branch" 옵션을 사용한다.
git clone --depth=1 --branch <branch> https://github.com/raspberrypi/linux
"<branch>" 부분에 원하는 branch 이름을 적는다.
사용 가능한 branches의 정보를 확인하려면 original GitHub repository 링크를 참조한다.
* Kernel Configuration
kernel을 설정한다. 때때로 더 상세하게 설정하거나 필요한 기능을 add or remove하기 위해 다른 source의 patches를 적용하고 싶을 수 있다.
- Apply the Default Configuration
사용하는 Raspberry Pi version에 따라 다음의 명령을 실행하여 default configuration을 준비한다:
For Raspberry Pi 1, Pi Zero, Pi Zero W and Comute Module default build configuration
cd linux
KERNEL=kernel
make bcmrpi_defconfig
For Raspberry Pi 2, Pi 3, Pi 3+ and Compute Module 3 default build configuration
cd linux
KERNEL=kernel7
make bcm2709_defconfig
- Customising the Kernel Version Using LOCALVERSION
설정한 kernel이 upstream kernel과 같은 version string을 사용하지 않도록 LOCALVERSION 변수를 사용할 수 있다. 이를 통해 "uname" 명령의 출력 결과에서 사용중인 kernel이 내가 build한 kernel임을 알 수 있고 내가 만든 modules가 "/lib/modules"의 기본 modules를 덮어쓰지 않을 수 있다.
그렇게 하기위해 다음 줄을 따라 ".config"를 바꾼다:
CONFIG_LOCALVERSION="-v7l-MY_CUSTOM_KERNEL"
위 설정은 the kernel configuration instructions에서와 같이 GUI상에서 설정할 수도 있다. "General setup => Local version - append to kernel release"에 위치한다.
* Building the Kernel
kernel, modules, device tree blobs를 build하고 install한다; 이 단계는 사용하는 Pi model에 따라 시간이 많이 걸릴 수 있다.
For the 32-bit kernel:
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
For the 64-bit kernel:
make -j4 Image modules dtbs
sudo make modules_install
sudo cp arch/arm64/boot/dts/broadcom/*.dtb /boot/
sudo cp arch/arm64/boot/dts/overlays/*.dtb* /boot/overlays/
sudo cp arch/arm64/boot/dts/overlays/README /boot/overlays/
sudo cp arch/arm64/boot/Image /boot/$KERNEL.img
Note.
Raspberry Pi 2/3/4에서 "-j4" flag는 작업을 4개 코어로 분할하여 compilation 속도를 높힌다.
Cross-Compiling the Kernel
cross-compilation host로는 linux가 적합하다. 가이드의 환경은 Ubuntu다; Raspberry Pi OS도 하나의 Debian 계열 distribution이기 때문에 command lines와 더불어 많은 측면에서 유사하다.
Windows에서 VirtualBox (or VMWare)을 사용할 수도 있다. 다음 Wikihow 링크를 참조한다.
* Install Required Dependencies and Toolchain
sources를 cross-compilation으로 build하기 위해 다음을 실행하여 host에 필요한 dependencies를 다운받는다.
sudo apt install git bc bison flex libssl-dev make libc6-dev libncurses5-dev
이외 다른 것이 필요하다면 comment를 작성하여 이 documentation을 변경할 수 있도록 한다.
Install the 32-bit Toolchain for a 32-bit Kernel
sudo apt install crossbuild-essential-armhf
Install the 64-bit Toolchain for a 64-bit Kernel
sudo apt install crossbuild-essential-arm64
* Get the Kernel Sources
위 "Building Kernel Locally > Choosing Sources"를 참고한다.
* Build sources
to be continue...
'개발 > linux' 카테고리의 다른 글
내가 쓰는 bash 단축키 모음 (0) | 2021.12.09 |
---|---|
커널 소스 폴더 구조 (0) | 2021.11.29 |
리눅스 역사 (0) | 2021.11.23 |
[기초편] Shell 이란? (0) | 2020.08.24 |
vi 사용법 (0) | 2020.06.16 |