RHEL에서 라즈베리파이 커널 컴파일하기

Phonedolly·2021년 7월 5일
0

linux

목록 보기
7/7
post-custom-banner

그 편한 Debian을 놔두고 굳이 RHEL로 하는 것 자체가 기행이다. 그래도 어제 힘들게 세팅 다 해놨는데 또 갈아엎기는 너무 아깝지 않은가.


시작

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

위 가이드는 한 번 쯤 읽어보았을 것이다. apt를 쓰기 때문에 Debian 기반 배포판이 아니면 패키지 설치 명령어가 아예 안먹힌다.

일단 할 수 있는 것이라도 해보자.

커널 소스코드 Clone하기

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

나는 보고 있는 책이 있어서 rpi-4.19.y 브런치를 받았다. 이건 자신의 필요에 따라 조정하도록 하고, clone --depth=1 옵션은 되도록이면 붙이도록 하자. 그렇지 않으면 전체 commit을 받기 때문에 소스 트리가 비대해진다.

(할 수 있는 대로) 패키지 설치 해보기

sudo dnf install gcc flex make bison openssl-devel elfutils-libelf-devel ncurses-devel

빌드에 필요한 패키지를 설치해본다. 분명 이것 말고도 몇 개 더 설치했었는데 기억이 안난다. 만약 끝까지 따라해보고 안되면 따로 찾아보자.

툴체인 다운로드 받기

앞서 설치했던 패키지는 크로스 컴파일러(혹은 툴체인)이 포함되어있지 않다. 툴체인을 받자.

https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-a/downloads

여기서 자신의 환경에 맞게 다운로드 받으면 된다. 나는 라즈베리 파이4(라즈베리 파이 OS 32비트)에 64비트 리눅스를 사용하기 때문에 gcc-arm-10.2-2020.11-x86_64-arm-none-linux-gnueabihf.tar.xz을 받았다.

여기서 none이라는 키워드가 거슬리는가? 여기서 의문을 풀도록 하자.

빌드 명령어는 도대체 무슨 뜻일까?

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2711_defconfig

빌드 환경 설정.

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs

빌드 명령어.

sudo env PATH=$PATH make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=mnt/ext4 modules_install

빌드 결과물을 설치하는 명령어.


위 셋 모두 CROSS_COMPILE 변수로 arm-linux-gnueabihf-를 받고 있다. 이 가이드는 Debian 기반임을 전제로 하고 있다. 패키지가 전부 설치된 상태. /usr/bin 같은 곳에 참조 링크가 있어서 arm-linux-gnueabihf-로 시작하는 프로그램(툴체인)을 마음대로 불러올 수 있다.

우리는 패키지 설치가 안되었으니 그럴만한 상황이 아니다. 툴체인을 직접 링크해주도록 하자.

툴체인 연결하기

우리가 해야할 건 arm-linux-gnueabihf-를 빌드 프로세스가 불러올 수 있도록 하는 것이다.

PATH에 툴체인 경로를 추가해보자. 나는 툴체인 압축 파일을 다음 경로에 풀었다.

~/rpi_kernel_src/gcc-arm-10.2-2020.11-x86_64-arm-none-linux-gnueabihf/


~/rpi_kernel_src/gcc-arm-10.2-2020.11-x86_64-arm-none-linux-gnueabihf/bin

위 경로에는 아래 파일들이 있다.

➜  bin ls -l
합계 69080
-rwxr-xr-x. 1 ruby ruby   965024 11월 21  2020 arm-none-linux-gnueabihf-addr2line
-rwxr-xr-x. 2 ruby ruby   994600 11월 21  2020 arm-none-linux-gnueabihf-ar
-rwxr-xr-x. 2 ruby ruby  1789416 11월 21  2020 arm-none-linux-gnueabihf-as
-rwxr-xr-x. 2 ruby ruby  1300568 11월 21  2020 arm-none-linux-gnueabihf-c++
-rwxr-xr-x. 1 ruby ruby   959808 11월 21  2020 arm-none-linux-gnueabihf-c++filt
-rwxr-xr-x. 1 ruby ruby  1296432 11월 21  2020 arm-none-linux-gnueabihf-cpp
-rwxr-xr-x. 1 ruby ruby  2841120 11월 21  2020 arm-none-linux-gnueabihf-dwp
-rwxr-xr-x. 1 ruby ruby    38496 11월 21  2020 arm-none-linux-gnueabihf-elfedit
-rwxr-xr-x. 2 ruby ruby  1300568 11월 21  2020 arm-none-linux-gnueabihf-g++
-rwxr-xr-x. 2 ruby ruby  1296384 11월 21  2020 arm-none-linux-gnueabihf-gcc
-rwxr-xr-x. 2 ruby ruby  1296384 11월 21  2020 arm-none-linux-gnueabihf-gcc-10.2.1
-rwxr-xr-x. 1 ruby ruby    35032 11월 21  2020 arm-none-linux-gnueabihf-gcc-ar
-rwxr-xr-x. 1 ruby ruby    35032 11월 21  2020 arm-none-linux-gnueabihf-gcc-nm
-rwxr-xr-x. 1 ruby ruby    35040 11월 21  2020 arm-none-linux-gnueabihf-gcc-ranlib
-rwxr-xr-x. 1 ruby ruby   723072 11월 21  2020 arm-none-linux-gnueabihf-gcov
-rwxr-xr-x. 1 ruby ruby   524272 11월 21  2020 arm-none-linux-gnueabihf-gcov-dump
-rwxr-xr-x. 1 ruby ruby   550416 11월 21  2020 arm-none-linux-gnueabihf-gcov-tool
-rwxr-xr-x. 1 ruby ruby  8523112 11월 21  2020 arm-none-linux-gnueabihf-gdb
-rwxr-xr-x. 1 ruby ruby     4045 11월 21  2020 arm-none-linux-gnueabihf-gdb-add-index
-rwxr-xr-x. 1 ruby ruby  1301000 11월 21  2020 arm-none-linux-gnueabihf-gfortran
-rwxr-xr-x. 1 ruby ruby  1028440 11월 21  2020 arm-none-linux-gnueabihf-gprof
-rwxr-xr-x. 4 ruby ruby  2201328 11월 21  2020 arm-none-linux-gnueabihf-ld
-rwxr-xr-x. 4 ruby ruby  2201328 11월 21  2020 arm-none-linux-gnueabihf-ld.bfd
-rwxr-xr-x. 2 ruby ruby  3300176 11월 21  2020 arm-none-linux-gnueabihf-ld.gold
-rwxr-xr-x. 1 ruby ruby 27572288 11월 21  2020 arm-none-linux-gnueabihf-lto-dump
-rwxr-xr-x. 2 ruby ruby   976192 11월 21  2020 arm-none-linux-gnueabihf-nm
-rwxr-xr-x. 2 ruby ruby  1116680 11월 21  2020 arm-none-linux-gnueabihf-objcopy
-rwxr-xr-x. 2 ruby ruby  1638800 11월 21  2020 arm-none-linux-gnueabihf-objdump
-rwxr-xr-x. 2 ruby ruby   994600 11월 21  2020 arm-none-linux-gnueabihf-ranlib
-rwxr-xr-x. 2 ruby ruby   792696 11월 21  2020 arm-none-linux-gnueabihf-readelf
-rwxr-xr-x. 1 ruby ruby   965184 11월 21  2020 arm-none-linux-gnueabihf-size
-rwxr-xr-x. 1 ruby ruby   964864 11월 21  2020 arm-none-linux-gnueabihf-strings
-rwxr-xr-x. 2 ruby ruby  1116680 11월 21  2020 arm-none-linux-gnueabihf-strip

사실 arm-linux-gnueabihf-가 우리가 원하던 것이지만 arm-none-linux-gnueabihf-도 딱히 상관은 없다.

저 파일을 수정하기보단, 빌드 명령어를 수정하는 게 더 안전하지 싶다.

일단 PATH에 추가부터 하자.

PATH=$PATH:"~/rpi_kernel_src/gcc-arm-10.2-2020.11-x86_64-arm-none-linux-gnueabihf/bin"

빌드 해보기

공식 가이드와는 다르게 빌드한다. arm-linux-gnueabihf-arm-none-linux-gnueabihf로 수정해서 진행하자.

makeARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- bcm2711_defconfig

빌드 설정하기.

make -j8 O=$OUTPUT ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabihf- zImage modules dtbs

빌드 진행하기.

이렇게 하면 RHEL에서도 라즈베리 파이 커널을 빌드할 수 있다.

post-custom-banner

0개의 댓글