[Linux] Aarch64 리눅스 커널 크로스 컴파일 방법

pikamon·2022년 8월 22일
1

Linux Kernel

목록 보기
1/3

본 글의 목적은 아래와 같다.

  1. aarch64용 리눅스 커널
  2. x64 우분투 가상 머신에서
  3. 크로스 컴파일하는 것

리눅스 커널 빌드 명령어가 글쓴이마다 다 달라서..
필자의 목적에 맞는 명령어들을 찾는 데 시간이 오래 걸렸다.


1. 빌드 환경 소개

아래 환경에서 빌드하였다.

  • 빌드 환경

    x86_64 Ubuntu 22.04 docker container

  • 타겟 머신

    aarch64 cross compile

2. 빌드 방법

1. 프로젝트 내려받기

Linux 소스를 가져오는 여러 방법이 있는데, 필자는 Github에서 Clone하였다.

apt update
apt install -y git
git clone https://github.com/torvalds/linux.git
cd linux

프로젝트 땡겨오는 데에 시간이 꽤 걸리니 다른 일을 하고 있자.

2. 커널 버전 설정

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

3. 빌드 툴 설치

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 공식 홈페이지에서 받으면 된다.

4. 커널 빌드

본격적으로 커널을 빌드해보자.
명령어를 하나씩 따라서 입력한다.

1. make mrproper

기존에 설정된 모든 의존 관계를 제거할 때 사용하는 명령어이다.

make mrproper

Linux 프로젝트를 처음 내려받았다면 문제가 없지만, configuration을 한 번이라도 수행하였다면 의존성 꼬여서 빌드에 실패하는 일을 방지하기 위해 먼저 꼭 입력하는 것을 권장한다.

입력하면 아래와 같이 출력된다.

  CLEAN   scripts/basic
  CLEAN   scripts/kconfig
  CLEAN   include/config include/generated .config

2. make defconfig

타겟 보드에 맞게 사전에 기본 설정을 미리 해둘 때 사용하는 명령어이다.
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'.

3. make menuconfig

커널에 추가/제거할 기능이나 모듈을 세부적으로 설정할 때 사용하는 명령어이다.

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'.

4. make

모든 설정을 완료하고 실제 커널을 빌드하는 명령어이다.
커널 뿐만 아니라 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/ 밑에 커널 버전명으로 디렉토리가 생성되어서 그 안에 들어간다고 함.

5. 빌드 산출물 확인

빌드가 완료되면 linux 디렉토리 안에 vmlinux가 들어있는 것을 볼 수 있다.

ls

그리고 arch/arm64/boot 안에 Image가 들어있는 것을 볼 수 있다.

cd arch/arm64/boot
ls

여기까지 성공했다면 진심으로 추카추카..!


아래는 시행착오 모음..

  1. make qemu_aarch64_virt_defconfig를 입력해봤는데, 그런거 없다고 나옴.
    위에 적었지만, aarch64는 defconfig 앞에 prefix가 필요 없음.
*** 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
  1. make dep이란 것도 있다고 해서 입력해봤는데, 그런 거 없다고 나옴.
    그래서 본문에선 삭제했음.
make: *** No rule to make target 'dep'.  Stop.
  1. linux 프로젝트에 브랜치가 master 하나만 있는 걸 보고 깜짝 놀랬다.
profile
개발자입니당 *^^* 깃허브 https://github.com/pikamonvvs

0개의 댓글