Linux/Kernel Driver

Embedded Linux에서 Root Filesystem 생성하기

임베디드 친구 2025. 3. 15. 11:14
728x90
반응형

Embedded Linux에서 Root Filesystem 생성하기

임베디드 시스템에서 Linux Kernel을 구동하려면 Root Filesystem(이하 Rootfs)이 반드시 필요합니다. Rootfs는 커널이 부팅한 후 시스템 동작에 필요한 기본 파일, 라이브러리, 그리고 실행 파일 등을 포함합니다. 이 글에서는 Rootfs 생성 방법과 최적화, 커스터마이징 방법을 Rockchip RK3399 플랫폼을 기준으로 설명합니다.


1. Root Filesystem의 개념

Rootfs는 다음과 같은 요소들로 구성됩니다:

  • 기본 디렉토리 구조: /bin, /lib, /etc, /dev, /usr, /var 등.
  • 필수 파일 및 라이브러리: init 파일, C 표준 라이브러리 등.
  • 필수 디바이스 파일: /dev 디렉토리 내의 파일들.
  • 응용 프로그램: 시스템 동작을 위해 필요한 실행 파일들.

2. Rootfs 생성 방법

2.1 BusyBox를 사용한 Rootfs 생성

BusyBox는 다양한 유닉스 명령어와 기능을 하나의 바이너리에 통합한 경량화된 도구입니다.

BusyBox 설치 및 컴파일

  1. BusyBox 소스 코드 다운로드:
wget https://busybox.net/downloads/busybox-<버전>.tar.bz2
tar -xvjf busybox-<버전>.tar.bz2
cd busybox-<버전>
  1. 컴파일 설정:
make menuconfig
  • Build Options에서 Build Static Binary 활성화.
  • Installation Options에서 설치 경로 설정.
  1. 컴파일 및 설치:
make -j$(nproc)
make install
  1. Rootfs 디렉토리 생성:
mkdir -p rootfs/{bin,sbin,etc,proc,sys,usr/{bin,sbin},dev}
cp -r _install/* rootfs/
  1. 디바이스 파일 생성:
sudo mknod rootfs/dev/console c 5 1
sudo mknod rootfs/dev/null c 1 3
  1. Rootfs 압축:
cd rootfs
tar -czf ../rootfs-busybox.tar.gz .

2.2 Buildroot를 사용한 Rootfs 생성

Buildroot는 임베디드 Linux 시스템을 구성하는 도구입니다.

Buildroot 설치 및 컴파일

  1. Buildroot 다운로드:
git clone https://github.com/buildroot/buildroot.git
cd buildroot
  1. 기본 설정:
make menuconfig
  • Target options에서 타겟 아키텍처를 aarch64로 설정.
  • Filesystem images에서 Rootfs 이미지 형식(ext4, tar) 선택.
  1. 컴파일:
make -j$(nproc)
  1. 생성된 Rootfs 확인:
ls output/images/
  1. Rootfs 압축:
cp output/images/rootfs.tar.gz ./rootfs-buildroot.tar.gz

2.3 Yocto를 사용한 Rootfs 생성

Yocto는 고도로 커스터마이징 가능한 빌드 시스템입니다.

Yocto 설치 및 환경 설정

  1. Yocto 다운로드:
git clone git://git.yoctoproject.org/poky.git
cd poky
git checkout <버전>
source oe-init-build-env
  1. 머신 설정:

conf/local.conf 파일에서 머신을 RK3399로 설정:

MACHINE = "rockchip-rk3399"
  1. Rootfs 빌드:
bitbake core-image-minimal
  1. 생성된 Rootfs 확인:
ls tmp/deploy/images/rockchip-rk3399/

3. Rootfs 최적화 및 커스터마이징

3.1 필요하지 않은 파일 제거

  • 기본적으로 포함된 디렉토리와 파일 중 사용하지 않는 항목을 제거합니다.
rm -rf rootfs/usr/share/{man,doc,info}

3.2 경량화된 라이브러리 사용

  • glibc 대신 musl 또는 uClibc와 같은 경량화된 라이브러리를 사용하여 크기를 줄입니다.

3.3 필수 응용 프로그램 추가

  • 추가로 필요한 도구나 애플리케이션을 Rootfs에 포함합니다.
cp /path/to/app rootfs/usr/bin/

3.4 초기화 스크립트 작성

  • Rootfs의 /etc/init.d/rcS 파일에 초기화 스크립트를 작성합니다.
#!/bin/sh
mount -t proc none /proc
mount -t sysfs none /sys
mdev -s

4. 테스트 및 배포

  1. QEMU를 사용한 테스트:
qemu-system-aarch64 -M virt -cpu cortex-a53 -m 512M -kernel Image \
-initrd rootfs-busybox.tar.gz -nographic
  1. 실제 RK3399 시스템에 Rootfs 배포:
  • SD 카드에 Rootfs 복사:
sudo dd if=rootfs.tar.gz of=/dev/sdX bs=4M

결론

이 글에서는 BusyBox, Buildroot, Yocto를 사용하여 Rootfs를 생성하는 방법과 이를 최적화 및 커스터마이징하는 방법을 소개했습니다. Rootfs를 성공적으로 생성하면, 시스템에 적합한 애플리케이션과 설정을 추가하여 원하는 기능을 구현할 수 있습니다. RK3399와 같은 플랫폼에서도 이러한 방법을 활용하여 효율적인 Rootfs를 구축할 수 있습니다.

반응형