본 글의 목적은 아래와 같다.
- aarch64용 리눅스 커널을
- x64 우분투 가상 머신에서
- 크로스 컴파일하는 것
리눅스 커널 빌드 명령어가 글쓴이마다 다 달라서..
필자의 목적에 맞는 명령어들을 찾는 데 시간이 오래 걸렸다.
아래 환경에서 빌드하였다.
빌드 환경
x86_64 Ubuntu 22.04 docker container
타겟 머신
aarch64 cross compile
Linux 소스를 가져오는 여러 방법이 있는데, 필자는 Github에서 Clone하였다.
apt update
apt install -y git
git clone https://github.com/torvalds/linux.git
cd linux
프로젝트 땡겨오는 데에 시간이 꽤 걸리니 다른 일을 하고 있자.
Linux 커널은 릴리즈할 버전 별로 태그를 따는데, 이를 git tag 명령어를 통해 볼 수 있다.
git tag --sort=-creatordate | head -10
입력하면 아래와 같이 상위 10개 버전의 태그를 확인할 수 있다.
v6.0-rc2
v6.0-rc1
v5.19
v5.19-rc8
v5.19-rc7
v5.19-rc6
v5.19-rc5
v5.19-rc4
v5.19-rc3
v5.19-rc2
2022년 8월 22일 기준으로 v6.0-rc2까지 나온 것을 볼 수 있다.
원하는 버전을 찾은 후 git reset을 입력한다.
예) v5.19
> git reset --hard v5.19
Linux 커널 빌드에 필요한 프로그램들을 설치한다.
대략 아래 정도면 빌드하는 데에 문제 없었다.
apt install -y gcc-aarch64-linux-gnu g++-aarch64-linux-gnu \
cscope libssl-dev libncurses-dev\
autoconf automake autotools-dev curl libmpc-dev libmpfr-dev \
libgmp-dev gawk build-essential bison flex texinfo \
gperf libtool patchutils bc zlib1g-dev libexpat-dev
자세한 사항은 공식 홈페이지를 참고하자.
https://www.kernel.org/doc/html/latest/process/changes.html
혹시 arm64 최신 크로스 컴파일러를 받고 싶다면 arm 공식 홈페이지에서 받으면 된다.
본격적으로 커널을 빌드해보자.
명령어를 하나씩 따라서 입력한다.
기존에 설정된 모든 의존 관계를 제거할 때 사용하는 명령어이다.
make mrproper
Linux 프로젝트를 처음 내려받았다면 문제가 없지만, configuration을 한 번이라도 수행하였다면 의존성 꼬여서 빌드에 실패하는 일을 방지하기 위해 먼저 꼭 입력하는 것을 권장한다.
입력하면 아래와 같이 출력된다.
CLEAN scripts/basic
CLEAN scripts/kconfig
CLEAN include/config include/generated .config
타겟 보드에 맞게 사전에 기본 설정을 미리 해둘 때 사용하는 명령어이다.
defconfig를 통해 비슷한 환경의 머신으로 configuration을 먼저 수행한 뒤 menuconfig를 이용해 세부 수정을 하는 구조라고 한다.
보통은 bcm2711_defconfig 처럼 _defconfig 앞에 타겟 보드의 이름이 붙지만, ARM64의 경우는 defconfig만 입력하여도 모든 타겟에 대해 커버된다고 한다.
(출처: https://linux-kernel-labs.github.io/refs/heads/master/labs/arm_kernel_development.html#compiling-the-linux-kernel-on-arm)
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- defconfig
입력하면 아래와 같이 출력된다.
UPD scripts/kconfig/mconf-cfg
HOSTCC scripts/kconfig/mconf.o
HOSTCC scripts/kconfig/lxdialog/checklist.o
HOSTCC scripts/kconfig/lxdialog/inputbox.o
HOSTCC scripts/kconfig/lxdialog/menubox.o
HOSTCC scripts/kconfig/lxdialog/textbox.o
HOSTCC scripts/kconfig/lxdialog/util.o
HOSTCC scripts/kconfig/lxdialog/yesno.o
HOSTLD scripts/kconfig/mconf
*** End of the configuration.
*** Execute 'make' to start the build or try 'make help'.
커널에 추가/제거할 기능이나 모듈을 세부적으로 설정할 때 사용하는 명령어이다.
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- menuconfig
입력하면 대화형 dialog가 출력되며, exit 시 아래와 같이 출력된다.
UPD scripts/kconfig/mconf-cfg
HOSTCC scripts/kconfig/mconf.o
HOSTCC scripts/kconfig/lxdialog/checklist.o
HOSTCC scripts/kconfig/lxdialog/inputbox.o
HOSTCC scripts/kconfig/lxdialog/menubox.o
HOSTCC scripts/kconfig/lxdialog/textbox.o
HOSTCC scripts/kconfig/lxdialog/util.o
HOSTCC scripts/kconfig/lxdialog/yesno.o
HOSTLD scripts/kconfig/mconf
*** End of the configuration.
*** Execute 'make' to start the build or try 'make help'.
모든 설정을 완료하고 실제 커널을 빌드하는 명령어이다.
커널 뿐만 아니라 dtb나 module 등도 같이 빌드된다.
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j$(nproc)
빌드 환경에 따라 천차만별이지만, 필자는 i7-7700HQ를 사용하는 노트북으로 약 30분 정도 소요되었다.
용도에 따라 원하는 산출물만 빌드하는 것이 가능하니, 아래 인자들을 참고하면 될 것 같다.
make zImage
: 압축된 커널 이미지를 빌드할 때 사용함.
make bzImage
: 압축된 bz 커널 이미지를 빌드할 때 사용함.
make modules
: 커널 모듈을 빌드할 때 사용함.
make dtbs
: 디바이스 트리 블롭을 빌드할 때 사용함.
make modules_install
: 빌드된 커널 모듈을 현재 머신에 설치할 때 사용함.
: /lib/modules/ 밑에 커널 버전명으로 디렉토리가 생성되어서 그 안에 들어간다고 함.
빌드가 완료되면 linux 디렉토리 안에 vmlinux가 들어있는 것을 볼 수 있다.
ls
그리고 arch/arm64/boot 안에 Image가 들어있는 것을 볼 수 있다.
cd arch/arm64/boot
ls
여기까지 성공했다면 진심으로 추카추카..!
아래는 시행착오 모음..
*** Can't find default configuration "arch/arm64/configs/qemu_aarch64_virt_defconfig"!
***
make[1]: *** [scripts/kconfig/Makefile:94: qemu_aarch64_virt_defconfig] Error 1
make: *** [Makefile:629: qemu_aarch64_virt_defconfig] Error 2
make: *** No rule to make target 'dep'. Stop.