커널 포팅 (5. 고급 커널 포팅 및 최적화 / 5.2 루트 파일 시스템 설정)

2025. 3. 6. 19:45프로그래밍/시스템

5.2 루트 파일 시스템 설정

루트 파일 시스템(rootfs)은 커널이 부팅된 후 실행 환경을 제공하는 필수 요소입니다.
임베디드 시스템에서는 rootfs를 최소화하여 저장 공간을 절약하고 빠른 부팅을 목표로 합니다.
이 장에서는 rootfs 개념, BusyBox 기반 최소한의 루트 파일 시스템 제작, init 프로세스 및 systemd 활용, 크로스 컴파일 환경 설정, 읽기 전용(rootfs read-only) 구성 방법을 다룹니다.


🔹 1️⃣ 임베디드 시스템에서 rootfs 개념 이해

루트 파일 시스템(rootfs)은 커널이 부팅된 후 실행되는 기본 파일 시스템입니다.
임베디드 시스템에서는 rootfs를 최소화하여 저장 공간을 절약하고 빠른 부팅을 목표로 합니다.

rootfs의 주요 역할

  • init 프로세스를 실행하여 시스템을 초기화
  • 기본 시스템 명령어(/bin/sh, ls, cat 등) 제공
  • /dev, /proc, /sys 등의 가상 파일 시스템 지원

rootfs의 기본 디렉토리 구조

/
├── bin/        # 기본 유틸리티 (ls, cat 등)
├── dev/        # 장치 파일 (tty, null, mmcblk0 등)
├── etc/        # 시스템 설정 파일
├── lib/        # 공유 라이브러리
├── proc/       # 프로세스 정보 (가상 파일 시스템)
├── root/       # root 사용자 홈 디렉토리
├── sbin/       # 시스템 관리 명령어 (init 등)
├── sys/        # 커널 관련 정보 (가상 파일 시스템)
├── tmp/        # 임시 파일 저장소
├── usr/        # 추가적인 바이너리 및 라이브러리
└── var/        # 로그 및 가변 데이터 저장

🔹 2️⃣ BusyBox 기반 최소한의 루트 파일 시스템 제작

BusyBox는 임베디드 시스템에서 필수적인 명령어들을 하나의 바이너리로 제공하는 소프트웨어입니다.
bash, ls, cat, mount 등의 명령어를 포함하며, 경량화된 rootfs를 구성하는 데 최적입니다.

📌 1️⃣ BusyBox 최신 버전 확인 및 다운로드

BusyBox는 지속적으로 업데이트되므로 최신 안정 버전을 사용하는 것이 좋습니다.
다음 명령어를 실행하면 최신 안정 버전을 확인할 수 있습니다.

wget -qO- https://busybox.net/downloads/ | grep "busybox-" | tail -1

출력 예시:

<a href="busybox-1.36.1.tar.bz2">busybox-1.36.1.tar.bz2</a>

이제 최신 버전을 다운로드합니다.

wget https://busybox.net/downloads/busybox-1.36.1.tar.bz2
tar xvjf busybox-1.36.1.tar.bz2
cd busybox-1.36.1

📌 2️⃣ BusyBox 크로스 컴파일 환경 설정

임베디드 시스템에서는 PC에서 직접 실행할 수 없는 ARM 또는 RISC-V 등의 아키텍처용 바이너리를 빌드해야 합니다.
이를 위해 크로스 컴파일러를 사용해야 합니다.

크로스 컴파일러 설치 (예: ARM용)

sudo apt install gcc-arm-linux-gnueabi

환경 변수 설정

export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabi-

BusyBox 기본 설정 적용

make defconfig

BusyBox 설정 (menuconfig)

make menuconfig
  • Busybox Settings → Build Options → Build BusyBox as a static binary (no shared libs) (✔ 활성화)
  • Busybox Settings → Installation Options → Don't use /usr (✔ 활성화)

BusyBox 크로스 컴파일

make -j$(nproc) CROSS_COMPILE=arm-linux-gnueabi-
make install
  • install 후 ./_install 디렉토리에 BusyBox 파일 시스템이 생성됨

📌 3️⃣ 루트 파일 시스템 디렉토리 생성

BusyBox로 만든 _install 디렉토리를 기반으로 새로운 rootfs를 생성합니다.

mkdir -p rootfs/{bin,sbin,etc,proc,sys,dev,tmp,lib}
cp -a _install/* rootfs/

읽기 전용 rootfs 설정 (read-only rootfs)

touch rootfs/etc/mtab
ln -s /proc/mounts rootfs/etc/mtab

이를 통해 rootfs를 읽기 전용으로 유지할 수 있습니다.

init 프로세스 추가 파일: rootfs/init

#!/bin/sh
mount -t proc proc /proc
mount -t sysfs sys /sys
echo "Embedded Linux Booted!"
exec /bin/sh

실행 권한 부여:

chmod +x rootfs/init

루트 파일 시스템 압축

cd rootfs
find . | cpio -o --format=newc | gzip > ../rootfs.cpio.gz
cd ..

U-Boot에서 initramfs 부팅 테스트

setenv bootargs "console=ttyS0,115200 root=/dev/ram init=/init ro"
tftpboot 0x82000000 rootfs.cpio.gz
bootm 0x80000000 0x82000000

ro 옵션을 추가하면 rootfs가 읽기 전용 모드로 마운트됩니다.


🔹 3️⃣ systemd 사용 및 추가 라이브러리

임베디드 시스템에서 systemd를 사용하면 서비스 관리가 편리해집니다.
하지만 systemd는 추가적인 라이브러리를 필요로 합니다.

필요한 패키지 설치

sudo apt install systemd systemd-sysv libsystemd-dev

systemd 유닛 파일 생성 파일: rootfs/etc/systemd/system/custom.service

[Unit]
Description=My Custom Service
After=network.target

[Service]
ExecStart=/bin/sh -c "echo 'Systemd Started!' > /dev/console"

[Install]
WantedBy=multi-user.target

기본 타겟 설정

ln -s /etc/systemd/system/custom.service rootfs/etc/systemd/system/multi-user.target.wants/

커널 부팅 옵션에 systemd 추가

setenv bootargs "console=ttyS0,115200 root=/dev/mmcblk0p2 rw init=/lib/systemd/systemd"

부팅 후 systemd 서비스 확인

systemctl status custom.service

✅ 정리

  1. rootfs 개념
    • /bin, /sbin, /etc, /proc, /sys 등으로 구성됨
    • 임베디드 시스템에서는 최소화하여 빠른 부팅을 목표로 함
  2. BusyBox 기반 최소 rootfs 제작
    • 최신 버전 확인 (wget -qO- https://busybox.net/downloads/ | grep "busybox-" | tail -1)
    • 크로스 컴파일 환경 설정 (CROSS_COMPILE=arm-linux-gnueabi-)
    • rootfs.cpio.gz를 생성하여 U-Boot에서 initramfs로 부팅 가능
  3. 읽기 전용 rootfs 구성
    • /etc/mtab 및 /proc/mounts를 설정하여 ro 모드 지원
    • U-Boot에서 setenv bootargs "ro" 옵션 추가
  4. init 및 systemd 활용
    • BusyBox init은 간단한 inittab 기반으로 동작
    • systemd 사용 시 추가 라이브러리 (libsystemd-dev) 필요
    • systemctl을 통해 서비스 관리 가능

이제 읽기 전용 rootfs까지 구성하여 더욱 안정적인 임베디드 시스템을 만들 수 있습니다! 🚀