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
✅ 정리
- rootfs 개념
- /bin, /sbin, /etc, /proc, /sys 등으로 구성됨
- 임베디드 시스템에서는 최소화하여 빠른 부팅을 목표로 함
- BusyBox 기반 최소 rootfs 제작
- 최신 버전 확인 (wget -qO- https://busybox.net/downloads/ | grep "busybox-" | tail -1)
- 크로스 컴파일 환경 설정 (CROSS_COMPILE=arm-linux-gnueabi-)
- rootfs.cpio.gz를 생성하여 U-Boot에서 initramfs로 부팅 가능
- 읽기 전용 rootfs 구성
- /etc/mtab 및 /proc/mounts를 설정하여 ro 모드 지원
- U-Boot에서 setenv bootargs "ro" 옵션 추가
- init 및 systemd 활용
- BusyBox init은 간단한 inittab 기반으로 동작
- systemd 사용 시 추가 라이브러리 (libsystemd-dev) 필요
- systemctl을 통해 서비스 관리 가능
이제 읽기 전용 rootfs까지 구성하여 더욱 안정적인 임베디드 시스템을 만들 수 있습니다! 🚀
'프로그래밍 > 시스템' 카테고리의 다른 글
커널 포팅 (6. 실전 커널 포팅 프로젝트 / 6.1 라즈베리파이(Raspberry Pi) 커널 포팅 실습) (0) | 2025.03.06 |
---|---|
커널 포팅 (5. 고급 커널 포팅 및 최적화 / 5.3 커널 디버깅 및 프로파일링) (0) | 2025.03.06 |
커널 포팅 (5. 고급 커널 포팅 및 최적화 / 5.1 부트로더 커스터마이징) (0) | 2025.03.06 |
커널 포팅 (4. 드라이버 포팅 / 4.3 새로운 드라이버 추가하기) (0) | 2025.03.06 |
커널 포팅 (4. 드라이버 포팅 / 4.2 기존 드라이버 포팅) (0) | 2025.03.06 |