Buildroot 빌드시스템을 이용하여 root filesystem (initramfs 형태)로 생성 후 이를 커널 컴파일에 응용하는 방법에 대해 기술한다. 그리고 최종적으로 컴파일된 커널 이미지를 qemu를 이용하여 테스트한다.
기존 블로그에서 설명한 방법은 ARM64 버전이 아니라 x86_64 버전으로 커널 컴파일한 것을 확인하는 것이었는데, 본 페이지에 링크되어 있는 블로그를 참고하면 ARM64 (aarch64) 전용으로 최신 커널을 기준으로 편하게 테스트해 볼 수 있다.
Buildroot
다운로드 및 빌드 → initramfsqemu
이용하여 커널 테스트예전에는 크로스 컴파일러를 먼저 구성하고 buildroot 빌드시스템을 이용했었는데 직접 테스트해보니 별도로 환경 구성할 필요 없이 자동으로 크로스 컴파일 환경까지 구성해주는 것으로 확인했다. 빌드시스템이 계속 업데이트되면서 정말 간편해졌다. 아래의 config 옵션을 확인한 후 make qemu_aarch64_virt_defconfig && make
를 해준다.
BR2_TARGET_ROOTFS_CPIO=y
BR2_TARGET_GENERIC_GETTY=y
BR2_TARGET_GENERIC_GETTY_PORT=”ttyAMA0″
이제 커널을 컴파일해준다. 커널 다운로드를 위해 아래의 공식 저장소에서 다운로드한다.
git clone <https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git>
커널 컴파일 전에 중요한 몇 가지 설정 옵션들에 대해서만 아래와 같이 설정해준다.
CONFIG_CMDLINE=”console=ttyAMA0″
CONFIG_INITRAMFS_SOURCE=”<BUILDROOT BUILD DIRECTORY/output/images/rootfs.cpio
initramfs
를 이용하므로 임시로 사용할 rootfs
를 설정해야 한다. 위와 같이 buildroot
빌드시스템을 이용하여 얻어낸 cpio
파일의 경로로 지정해준다. 커널 컴파일이 완료되면 아래 명령어로 qemu
를 실행해서 테스트해보자.
udhcpc: sending discover
udhcpc: sending select for 10.0.2.15
udhcpc: lease of 10.0.2.15 obtained, lease time 86400
deleting routers
[ 2.071088] random: mktemp: uninitialized urandom read (6 bytes read)
adding dns 10.0.2.3
OK
Welcome to IAMROOT
iamroot17th login:
Welcome to IAMROOT
iamroot17th login: root
# ls
README test test.c
#
추가적으로, 위와 같이 루트 디렉토리에 대한 overlay를 위해서는 buildroot
에서 BR2_ROOTFS_OVERLAY
를 설정해줘야 한다. 디렉토리를 하나 만든 다음에 아래와 같이 설정해준 후, 테스트 프로그램을 크로스 컴파일하여 넣어주자.
BR2_ROOTFS_OVERLAY="~/Workspaces/buildroot/overlay"
이제 overlay 디렉토리 구조를 만들어주고 크로스 컴파일을 한다.
overlay git:master ❯ tree ✭
.
└── root
├── README
├── test
└── test.c
1 directory, 3 files
root git:master ❯ ../../output/host/bin/aarch64-linux-gcc -o test test.c