그 편한 Debian을 놔두고 굳이 RHEL로 하는 것 자체가 기행이다. 그래도 어제 힘들게 세팅 다 해놨는데 또 갈아엎기는 너무 아깝지 않은가.
https://www.raspberrypi.org/documentation/linux/kernel/building.md
위 가이드는 한 번 쯤 읽어보았을 것이다. apt
를 쓰기 때문에 Debian 기반 배포판이 아니면 패키지 설치 명령어가 아예 안먹힌다.
일단 할 수 있는 것이라도 해보자.
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
빌드에 필요한 패키지를 설치해본다. 분명 이것 말고도 몇 개 더 설치했었는데 기억이 안난다. 만약 끝까지 따라해보고 안되면 따로 찾아보자.
앞서 설치했던 패키지는 크로스 컴파일러(혹은 툴체인)이 포함되어있지 않다. 툴체인을 받자.
여기서 자신의 환경에 맞게 다운로드 받으면 된다. 나는 라즈베리 파이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에서도 라즈베리 파이 커널을 빌드할 수 있다.