AEGLOSLAB Arduino UNO Q 완전 가이드

제5부 운영체제 다루기

5.4 eMMC·파일시스템과 저장 공간 관리

UNO Q는 SD 카드가 아니라 보드에 납땜된 eMMC에 Debian을 담아 부팅한다. 용량은 램 구성에 따라 2GB 램 모델은 16GB eMMC, 4GB 램 모델은 32GB eMMC다. 임베디드 보드 특성상 이 공간은 PC보다 훨씬 부족하게 느껴질 수 있어, 파티션 구조를 이해하고 정리하는 법을 알아 두는 것이 실전에서 자주 필요하다.

5.4.1 eMMC 파티션 구조

App Lab이 플래시하는 기본 이미지는 eMMC를 하나로 쓰지 않고 역할별로 나눈다. 핵심은 시스템 파티션(root)과 사용자 데이터 파티션(/home/arduino)을 분리해 둔다는 점이다 — 이렇게 해 두면 보드를 재플래시(공장 초기화, OS 버전 전환 등)해도 사용자 데이터는 별도로 보존할 수 있다. 공식 보안 가이드도 "arduino 사용자의 데이터는 시스템 데이터와 별도 파티션에 저장되며, 이는 재포맷 시 개인 파일이 지워지지 않도록 보호하기 위함"이라고 명시한다.

eMMC (16GB 또는 32GB) /boot/efi 부트로더 파티션 약 488MB / (root) 시스템 파티션 재플래시 시 초기화됨 /home/arduino 사용자 데이터 파티션 --preserve-user로 보존 가능

5.4.1.1 실측 예시와 기본값 변화 — 정직하게 밝히기

32GB(4GB 램) 보드를 실제로 df -h로 확인한 커뮤니티 사례(포럼 실측, 2026년 5월)는 다음과 비슷한 모습을 보였다.

Filesystem       Size  Used Avail Use% Mounted on
/dev/mmcblk0p68  9.8G  9.2G   43M 100% /
/dev/mmcblk0p69   18G  1.2G   16G   7% /home/arduino
/dev/mmcblk0p67  488M  119M  369M  25% /boot/efi

즉 당시 기본값은 32GB 보드에서 root(시스템) 파티션이 약 10GB, /home/arduino가 약 18GB였다. 문제는 root 쪽이 빠르게 소진된다는 것 — 위 예시처럼 Docker나 여러 패키지를 설치하면 root가 100%에 도달해 apt install 자체가 "No space left on device"로 실패하는 사례가 실제로 보고됐다.

Arduino 개발팀은 이 문제를 인지하고 있었고, Arduino Flasher CLI v0.5.3(2026년 8월 릴리스, 이 책 집필 시점 기준 최신)부터 32GB 보드의 기본 root 파티션 크기를 10GB→20GB로 확대했다. 즉 최신 이미지로 플래시하면 위와 같은 극단적인 공간 부족은 완화된다. 다만 보드에 이미 설치돼 있는 이미지가 언제 만들어졌는지에 따라 실제 기본값은 다를 수 있으므로, 아래 5.4.2의 명령으로 항상 직접 확인하는 것이 정확하다. 정확한 파티션 번호(mmcblk0pNN)도 이미지 버전에 따라 달라질 수 있다는 점을 함께 감안한다.

5.4.2 파티션·용량 확인 명령

가장 먼저 익힐 세 명령이다.

df -h        # 마운트된 파일시스템별 전체/사용/가용 용량 (사람이 읽기 쉬운 단위)
lsblk        # 블록 장치와 파티션 트리 (eMMC, USB 등)
du -sh *     # 현재 위치의 각 파일/폴더가 차지하는 용량

df -h는 "지금 얼마나 찼는가"를, du -sh *는 "무엇이 그 공간을 차지하는가"를 답해 준다 — 정리할 때는 이 둘을 같이 쓴다.

cd /home/arduino
du -sh *

메모리(RAM)와 혼동하지 않도록 주의한다. RAM 사용량은 free -h로 별도 확인한다(5.1 참고).

5.4.3 공간 부족 시 정리 전략

root 파티션이 꽉 차면 패키지 설치·업데이트(5.3)가 실패하고 시스템이 불안정해질 수 있다. 우선순위대로 정리한다.

  1. 더 이상 안 쓰는 App 이미지 정리 — App Lab이 빌드할 때마다 남기는 이전 빌드 산출물을 지운다.
   arduino-app-cli system cleanup
  1. apt 캐시·불필요한 의존성 정리.
   sudo apt clean          # 다운로드한 .deb 캐시 삭제
   sudo apt autoremove     # 더 이상 필요 없는 의존 패키지 제거
  1. 저널 로그 축소(5.1.4.1에서 다룬 내용).
   sudo journalctl --vacuum-size=200M
  1. 큰 폴더를 사용자 데이터 파티션으로 옮기기 — 커뮤니티 방법(비공식). root가 계속 부족하다면, Docker 같은 대용량 데이터 디렉터리를 /home/arduino 쪽으로 옮기는 방법이 커뮤니티에서 공유된 바 있다. 예를 들어 Docker의 data-root를 재지정한다.
   sudo systemctl stop docker.service docker.socket containerd.service
   sudo mkdir -p /home/arduino/.root/var/lib
   sudo cp -av --preserve=all /var/lib/docker /home/arduino/.root/var/lib/docker
   sudo mv /var/lib/docker /var/lib/docker.backup   # 문제 생기면 되돌리기용
   sudoedit /etc/docker/daemon.json
   # { "data-root": "/home/arduino/.root/var/lib/docker" }
   sudo systemctl start docker.socket docker.service
   docker info | grep "Docker Root Dir"   # 정상 반영 확인
   sudo rm -rf /var/lib/docker.backup     # 확인 후 백업 삭제

⚠️ 이 방법의 트레이드오프를 정직하게 밝혀야 한다. UNO Q는 사실상 단일 사용자(arduino) 임베디드 환경을 전제로 설계됐으므로 이런 재배치가 실용적이지만, 만약 여러 Linux 사용자 계정을 운용하는 구성이라면 /home/arduino 아래로 옮긴 디렉터리는 arduino 계정 소유가 되어 다른 사용자가 접근하기 어려워진다는 부작용이 있다. 단일 사용자 전제가 아니라면 신중히 적용한다.

  1. 그래도 부족하면 재플래시로 파티션 크기 자체를 조정한다 — 다음 절.

5.4.4 루트 파티션 크기를 처음부터 다시 나누기

정리로도 부족하거나, 애초에 root/home 비율을 다르게 설정하고 싶다면 재플래시 시점에 파티션 크기를 지정할 수 있다. 이 방법은 시스템 파티션을 새로 플래시하는 것이므로 기본적으로 데이터가 초기화된다 — 사용자 데이터를 지키려면 --preserve-user를 함께 쓴다(단, 아래처럼 --root-size와는 동시에 쓸 수 없다).

App Lab GUI(대화형 마법사): arduino-flasher-cli flash를 인자 없이 실행하면 대화형 마법사가 실행된다 — 보드 종류(16GB/32GB) 선택, 이미지 버전 선택, 사용자 파티션 보존 여부, 그리고 root/home 비율을 퍼센트로 지정하면 실제 파티션 크기가 실시간으로 미리보기된다.

CLI로 직접 지정:

arduino-flasher-cli flash latest --root-size 12GB

--root-size는 사람이 읽는 단위(예: 12GB)를 받고, 최소 10GB 이상이어야 한다. --preserve-user를 함께 쓰면 보드에 이미 있는 root 크기를 그대로 읽어와 일관되게 유지하므로, 두 옵션은 서로 배타적이다.

# 사용자 데이터는 보존하되, 파티션 비율은 새로 정하지 않는 경우
arduino-flasher-cli flash latest --preserve-user

5.4.4.1 App Lab이 보드를 못 찾을 때 — EDL 모드로 직접 복구

App Lab이 보드를 전혀 인식하지 못하는 최악의 경우(부팅 실패, 네트워크 미인식 등)에는 EDL(Emergency Download Mode)로 강제 진입시켜 Arduino Flasher CLI로 복구한다.

  1. 보드를 컴퓨터에서 분리한다.
  2. 보드 위의 EDL 핀 2개를 점퍼 케이블(또는 얇은 금속 클립)로 단락시킨다. 반드시 USB-C 연결 전에 먼저 단락해야 한다 — 순서가 바뀌면 Flasher 도구가 "Waiting for EDL device" 상태로 멈춘다.
  3. 점퍼를 유지한 채로 USB-C 케이블을 컴퓨터에 연결한다. 연결 후에는 점퍼를 제거해도 된다 — 재부팅하기 전까지는 EDL 상태가 유지된다.
  4. Flasher CLI를 실행한다.
   ./arduino-flasher-cli flash latest --preserve-user
  1. 완료되면 케이블을 분리하고, EDL 핀 단락이 남아 있다면 제거한 뒤 다시 연결해 새 이미지로 부팅시킨다.

흔한 함정: Linux 호스트에서 Flasher 도구가 계속 "Waiting for EDL device"에 멈춰 있다면, EDL 모드의 Qualcomm USB 벤더 ID(05c6)에 대한 udev 규칙이 없는 경우가 대부분이다 — 이 경우 관련 udev 규칙과 사용자 권한(그룹) 설정이 먼저 필요하다. 또한 플래싱 과정 자체가 임시로 약 8GB의 디스크 공간을 요구하므로, 컴퓨터의 임시 폴더 공간이 부족하면 --temp-dir로 다른 경로를 지정한다.

./arduino-flasher-cli flash latest --temp-dir /path/to/larger/disk

5.4.5 외부 저장장치(USB) 마운트

USB 드라이브를 데이터 보관이나 백업 용도로 연결하는 경우가 많다.

5.4.5.1 SBC 모드(그래픽 데스크톱)에서

USB-C 동글로 USB 드라이브를 연결하면 데스크톱 환경이 자동으로 /media/arduino/ 아래 마운트하고 파일 관리자에서 바로 보여준다.

5.4.5.2 헤드리스·SSH에서 — 수동 마운트

명령줄이나 헤드리스 상태에서는 직접 마운트해야 한다.

lsblk                        # 장치 확인 (예: /dev/sdb1)
sudo mkdir -p /mnt/usb
sudo mount /dev/sdb1 /mnt/usb

작업이 끝나면 물리적으로 분리하기 전에 반드시 언마운트한다(데이터 손상 방지).

sudo umount /mnt/usb

5.4.5.3 재부팅 후에도 자동 마운트하기

매번 수동 마운트가 번거롭다면 /etc/fstab에 등록해 부팅 시 자동 마운트하게 만들 수 있다. 이는 UNO Q 고유 기능이 아니라 표준 Linux 관행이며, 장치 파일명(/dev/sdb1)이 USB 포트 순서에 따라 바뀔 수 있으므로 UUID를 쓰는 것이 안전하다.

blkid /dev/sdb1              # UUID 확인
sudo nano /etc/fstab
# 예: UUID=xxxx-xxxx  /mnt/usb  ext4  defaults,nofail  0  2

nofail 옵션을 꼭 넣는다 — 이것이 없으면 부팅 시 해당 USB 장치가 연결되어 있지 않을 때 부팅 자체가 지연되거나 실패할 수 있다.

5.4.6 엣지케이스

  • root가 100%로 꽉 찼을 때: apt install은 물론 로그 기록, 심지어 SSH 로그인 자체도 이상해질 수 있다(임시 파일을 못 써서). 이 상태에서는 du -sh /* 2>/dev/null | sort -rh | head -10처럼 root 전체를 탐색해 큰 디렉터리부터 찾아 지우거나 옮긴다.
  • ADB로 백업할 때 .cache 폴더의 깨진 심볼릭 링크: App 디렉터리 전체를 adb pull로 백업하면 .cache/ 아래 심볼릭 링크(Docker 컨테이너 안의 Python 인터프리터를 가리킴)가 "stat failed" 경고와 함께 제대로 복사되지 않는다. 이는 실제로는 문제가 아니다 — .cache는 App 실행 시 자동으로 재생성되므로, 백업본에서 .cache 폴더 자체를 지우고 옮기는 편이 확실하다.
  • 재플래시 후 SSH 접속 거부: 파티션을 새로 구웠으니 호스트 키도 바뀐다 — 5.2.3.2의 ssh-keygen -R 절차를 잊지 않는다.

5.4.7 다음으로

저장 공간을 아무리 잘 관리해도 보드 자체가 발열로 성능이 떨어지거나 불필요하게 전력을 소모하면 무인 운영에 지장이 생긴다 — 다음 5.5에서 CPU 성능·전력 관리를 다룬다. 하드웨어 차원의 전원 설계(레일·PMIC)는 이미 2.4에서 다뤘다.