커널을 빌드하는 두 가지 주요한 방법이 있습니다. Raspberry Pi에서 직접 빌드하는 것은 많은 시간이 걸립니다. 크로스 컴파일은 더 빠르지만 셋업이 좀 더 필요합니다.
로컬 빌딩
먼저 Raspberry Pi에 Raspbian의 최신 버전을 다운로드하여 설치합니다. 그런 다음 Pi를 부트하고, 소스에 접근하기 위해 이더넷을 연결한 다음, 로그인합니다.
먼저 소스를 받습니다. 시간이 좀 걸릴 것입니다.
git clone --depth=1 https://github.com/raspberrypi/linux
의존성이 있는 패키지를 추가합니다.
sudo apt-get install bc
커널을 구성합니다. 기본 구성에서 커널을 자세히 설정하거나, 필요한 기능을 추가하거나 제거하기 위해 다른 소스로부터 패치를 적용할 수 있습니다.
Raspberry Pi의 버전에 따라, 아래의 명령을 실행합니다.
Raspberry Pi 1 (또는 Compute Module) 기본 빌드 구성
cd linux
KERNEL=kernel
make bcmrpi_defconfig
Raspberry Pi 2/3 기본 빌드 구성
cd linux
KERNEL=kernel7
make bcm2709_defconfig
커널, 모듈, 장치 트리 blob를 빌드 및 설치합니다. 이 단계는 시간이 오래 걸립니다.
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 scripts/mkknlimg arch/arm/boot/zImage /boot/$KERNEL.img
참고: Raspberry Pi 2/3에서, -j4
플래그는 작업을 네 개의 코어에 할당하여, 컴파일 속도를 현저히 높여줍니다.
크로스 컴파일링
먼저, 적당한 Linux 크로스 컴파일 호스트가 필요합니다. 여기서는 Ubuntu를 사용할 것입니다. Raspbian도 Debian 배포본이므로 명령행이 비슷한 것과 같은 이유 때문입니다.
Windows에서 VirtualBox(또는 VMWare)를 사용하거나, 컴퓨터에 바로 설치할 수도 있습니다. Wikihow의 온라인 지침을 참고로 따라할 수 있습니다.
toolchain 설치
다음의 명령을 사용하여 툴체인을 설치합니다.
git clone https://github.com/raspberrypi/tools
그 다음에 뒤따르는 /tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian
디렉터리를 공통적인 위치로 복사하고, 홈 디렉터리에 있는 .bashrc의 $PATH에 /tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin
을 추가할 수 있습니다. 64 비트 호스트 시스템에서는, /tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin
을 사용합니다. 이 단계가 꼭 필요한 것은 아니지만, 나중에 명령행을 사용할 때에 편리합니다!
소스 얻기
소스를 얻기 위해, 다양한 브랜치를 가진 GitHub 저장소를 참조합니다.
$ git clone --depth=1 https://github.com/raspberrypi/linux
소스 빌드
크로스 컴파일을 위해 소스를 빌드함에 있어서, Ubuntu의 기본 설치 외에 추가로 의존성이 있을 수 있습니다. 다른 것이 더 필요한 것을 발견하면 문서를 변경할 수 있도록 풀 요청을 제출해주시기 바랍니다.
다음의 명령을 입력하여 소스 및 장치 트리 파일을 빌드합니다.
Pi 1 또는 Compute Module의 경우:
cd linux
KERNEL=kernel
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcmrpi_defconfig
Pi 2/3의 경우:
cd linux
KERNEL=kernel7
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2709_defconfig
그 다음, 양쪽 모두에 해당:
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs
Raspberry Pi 2에서는, 두 번째 행에서 bcmrpi_defconfig
대신 bcm2709_defconfig
를 사용합니다.
참조: 멀티프로세서 시스템에서 컴파일 속도를 높이거나, 싱글 프로세서에서도 그런 효과를 얻으려면, -j n
을 사용합니다. n은 프로세서의 갯수 * 1.5입니다. 다른 숫자도 실험해보세요!
SD 카드에 직접 설치
커널을 빌드하였으면 그것을 Raspberry Pi에 복사하고 모듈을 설치할 필요가 있습니다. 이것은 SD 카드 리더를 사용하여 직접 수행하는 것이 최선의 방법입니다.
먼저, SD 카드를 꽂기 전과 후에 lsblk
를 사용하여 장치를 식별합니다. 다음과 비슷하게 나타날 것입니다.
sdb
sdb1
sdb2
sdb1
은 FAT (부트) 파티션이고, sdb2
는 ext4 파일시스템 (루트) 파티션입니다.
NOOBS 카드라면 다음과 같이 나타날 것입니다.
sdb
sdb1
sdb2
sdb5
sdb6
sdb7
sdb6
은 FAT (부트) 파티션이고, sdb7
은 ext4 파일시스템 (루트) 파티션입니다.
먼저 이것들을 마운트합니다(NOOBS 카드의 파티션 번호를 조정합니다).
$ mkdir mnt/fat32
$ mkdir mnt/ext4
$ sudo mount /dev/sdb1 mnt/fat32
$ sudo mount /dev/sdb2 mnt/ext4
다음으로, 모듈을 설치합니다.
$ sudo make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=mnt/ext4 modules_install
끝으로, 오래된 커널을 백업하고, 커널과 장치 트리 blob을 SD 카드로 복사합니다.
$ sudo cp mnt/fat32/$KERNEL.img mnt/fat32/$KERNEL-backup.img
$ sudo scripts/mkknlimg arch/arm/boot/zImage mnt/fat32/$KERNEL.img
$ sudo cp arch/arm/boot/dts/*.dtb mnt/fat32/
$ sudo cp arch/arm/boot/dts/overlays/*.dtb* mnt/fat32/overlays/
$ sudo cp arch/arm/boot/dts/overlays/README mnt/fat32/overlays/
$ sudo umount mnt/fat32
$ sudo umount mnt/ext4
다른 선택사항은 커널을 같은 곳에 다른 이름으로 복사하는 것입니다. 즉, kernel.img 파일을 덮어쓰기보다는 kernel-myconfig.img과 같은 이름으로 복사하는 것입니다. 그런 다음 Pi가 부트할 커널을 선택하기 위하여 config.txt 파일을 편집할 수 있습니다.
kernel=kernel-myconfig.img
이 방법은 여러분의 커널을 시스템이 관리하는 커널 및 자동 업데이트 도구로부터 격리할 수 있으며, 여러분의 커널로 부트할 수 없는 상황이 되었을 때에 스톡 커널로 쉽게 복원할 수 있도록 해줍니다.
끝으로, 카드를 Pi에 꽂고 부트합니다!