카테고리 없음

Buildroot로 ARM64 Linux 이미지 만들기

bearmetal 2026. 9. 25. 22:01

macOS에서 UTM으로 실행하는 Debian ARM64 가상머신을 빌드 환경으로 사용했다. VM에는 CPU 4개, RAM 4 GiB, 가상 디스크 약 54 GB를 할당했다. 이번 목표는 Buildroot의 기본 설정으로 커널과 루트 파일시스템 이미지를 만들고, 두 결과물을 확인하는 것이었다. 아직 새 시스템을 부팅하지는 않았다.


Debian에는 build-essential, git, rsync, file, bc, unzip, patch, bzip2를 설치했다. cpio와 wget은 이미 있었다. Buildroot 공식 배포처에서 buildroot-2026.08.tar.xz를 받아 ~/os-lab에 풀었다. 아래에 환경 재현에 필요한 명령을 적어 두었다.

# 관리자 권한으로 실행
apt update
apt install build-essential git rsync file bc unzip patch bzip2 cpio wget
# 일반 사용자로 실행
mkdir -p ~/os-lab
cd ~/os-lab
wget https://buildroot.org/downloads/buildroot-2026.08.tar.xz
tar -xf buildroot-2026.08.tar.xz

짧은 설정 파일이 전체 설정이 되기까지

Buildroot 2026.08의 configs/qemu_aarch64_virt_defconfig를 읽었다. 18줄짜리 설정에서 ARM64, Linux 커널 6.18.7, ext4 루트 파일시스템, 호스트용 QEMU 빌드 등을 선택한 것을 확인했다. 이어서 설정을 적용했다.

cd ~/os-lab/buildroot-2026.08
make qemu_aarch64_virt_defconfig
wc -l configs/qemu_aarch64_virt_defconfig .config
grep -E '^(BR2_PACKAGE_BUSYBOX|BR2_INIT_BUSYBOX|BR2_TOOLCHAIN_BUILDROOT)=' .config

wc 결과는 각각 18줄과 5,306줄이었다. 생성된 .config에는 기본값과 꺼진 선택지까지 기록돼 있었다.


Buildroot는 설정에 따라 소스를 내려받고, 새 Linux 시스템에 필요한 도구 모음·커널·사용자 프로그램·파일시스템 이미지를 빌드한다. defconfig는 그 선택을 짧게 기록한 파일이고, .config는 기본값까지 펼친 빌드 설정이다.


세 설정은 모두 y로 표시됐다.


BR2_TOOLCHAIN_BUILDROOT는 Buildroot가 새 시스템용 컴파일러 등을 빌드한다는 뜻이다. BR2_PACKAGE_BUSYBOX는 새 시스템의 파일시스템에 BusyBox를 넣는다. BR2_INIT_BUSYBOX는 그 BusyBox의 init을 첫 사용자 공간 프로세스로 쓰도록 파일시스템을 구성한다.


BusyBox는 ls, sh, init 같은 여러 사용자 공간 기능을 하나의 작은 실행 파일로 제공한다. init은 커널이 파일시스템을 사용할 수 있게 된 뒤 실행하는 첫 사용자 공간 프로세스(PID 1)로, 시작 스크립트와 콘솔 프로그램 등을 띄운다. 이번 빌드에서 BusyBox는 임시 도구가 아니라 새 시스템의 구성 요소다.

Debian에서 부팅 이후의 상태 관찰하기

먼저 지금 사용 중인 Debian의 첫 프로세스와 ls의 출처를 확인했다.

ps -p 1 -o pid,comm,args
type -a ls
dpkg -S "$(type -P ls)"
findmnt -no SOURCE,FSTYPE,TARGET /
lsblk -o NAME,TYPE,FSTYPE,MOUNTPOINTS

PID 1은 systemd였고, 실행 경로는 /sbin/init으로 표시됐다. /usr/bin/ls는 coreutils 패키지에서 왔다. ls에 셸 별칭이 설정돼 있어 type -P ls로 실행 파일 경로를 확인했다.


findmnt는 /dev/vda3 ext4 /를 출력했다. lsblk에서도 가상 디스크 vda의 세 번째 파티션 vda3가 /에 연결된 것을 확인했다.


vda는 UTM이 Debian VM에 보여주는 가상 디스크다. 설치 프로그램이 디스크에 기록한 파티션 테이블을 커널이 읽어 vda1부터 vda4까지 구분한다. vda3의 ext4 파일시스템에는 디렉터리 이름, 파일의 위치 등을 찾을 수 있는 정보가 기록돼 있다. ext4의 주요 설명 정보인 superblock은 파티션 시작점에서 1,024바이트 떨어진 곳에 놓인다.


마운트는 파일시스템을 / 같은 경로에 연결하는 작업이다. 단순한 부팅 경로에서는 커널이 부팅 인자로 지정된 루트 장치의 파일시스템을 마운트한다. 초기 RAM 파일시스템을 사용하는 부팅은 그 안의 프로그램이 실제 루트 장치를 찾아 연결하는 단계가 추가된다. 이번 관찰만으로 Debian이 어느 경로를 거쳤는지는 확인하지 않았다.


루트 파일시스템에 접근할 수 있게 되면 커널은 /sbin/init을 찾아 사용자 공간 프로세스로 실행한다. 디스크에 있는 실행 파일의 필요한 부분을 프로세스의 메모리에 배치해 시작한다. 루트 파일시스템 이미지는 파일을 담은 저장 공간이고, 프로세스는 그 안의 실행 파일을 바탕으로 동작한다.


관찰한 /dev/vda3는 Debian VM의 파티션이다. Buildroot가 만든 rootfs.ext4는 앞으로 QEMU에서 사용할 새 시스템의 파일시스템 이미지다.

첫 빌드의 결과물

Debian VM에서 다음 명령으로 빌드를 진행했다. BR2_JLEVEL=2로 패키지별 동시 빌드 작업 수를 제한했다.

make BR2_JLEVEL=2
ls -lh output/images/

생성된 파일 목록을 아래에 옮겼다.

total 22M
-rw-r--r-- 1 ... 13M Sep 25 21:23 Image
-rw-r--r-- 1 ... 60M Sep 25 21:23 rootfs.ext2
lrwxrwxrwx 1 ...   11 Sep 25 21:23 rootfs.ext4 -> rootfs.ext2
-rwxr-xr-x 1 ... 839 Sep 25 21:23 start-qemu.sh

Image는 커널 이미지다. rootfs.ext2는 루트 파일시스템 이미지 파일이며, rootfs.ext4는 그 파일을 가리키는 심볼릭 링크다. start-qemu.sh는 생성된 시스템을 QEMU에서 실행하기 위한 스크립트다.

재개 지점

~/os-lab/buildroot-2026.08에서 qemu_aarch64_virt_defconfig를 적용했다. output/images/에 커널 이미지, 루트 파일시스템 이미지, QEMU 실행 스크립트가 생긴 것을 확인했다. 새 시스템의 부팅과 BusyBox의 PID 1 동작은 아직 검증하지 않았다.


다음에는 파일 형식과 실행 스크립트를 확인한 뒤 새 시스템을 부팅할 예정이다.


참고