AEGLOSLAB Arduino UNO Q 완전 가이드

제3부 소프트웨어 스택

3.1 Debian Linux — MPU 측 운영체제

제3부 소프트웨어 스택 · 첫 장. UNO Q의 "두 브레인" 중 MPU(Qualcomm QRB2210) 쪽이 무엇을 구동하는지부터 본다. MCU(STM32U585) 쪽 Zephyr 기반 Arduino Core는 3.2, 둘을 잇는 App Lab·Bridge는 3.3·3.4. Debian을 실제로 운영(부팅·서비스·SSH·OTA·저장공간·전력)하는 법은 제5부(5.1~5.5)에서 훨씬 깊게 다룬다 — 이 장은 "무엇이 왜 거기 있는가"를 파악하는 소프트웨어 스택 개관이다.

3.1.1 왜 MPU에 풀(full) Linux인가

UNO Q는 하나의 보드에 서로 다른 성격의 프로세서 둘을 탑재했다(2.1). Qualcomm QRB2210은 2.0 GHz 쿼드코어 Arm Cortex-A53에 Adreno 702 GPU를 곁들인, 사실상 스마트폰·태블릿급 SoC다. 이런 칩에 클래식 아두이노처럼 "스케치 하나만 실행되는 베어메탈 펌웨어"를 탑재하는 것은 하드웨어 낭비에 가깝다 — Wi-Fi 스택, 카메라 ISP 드라이버, GPU 가속, 멀티프로세스 스케줄링 같은 것들은 이미 리눅스 커널과 그 위 생태계가 수십 년째 잘 풀어놓은 문제다.

그래서 Arduino는 MPU 쪽에 Debian Linux를 탑재했다. 공식 문서는 이렇게 설명한다.

"The Arduino UNO Q runs a full Debian Linux operating system on its Qualcomm® QRB2210 microprocessor (MPU), providing a complete computing environment alongside the Arduino microcontroller (MCU)." — Debian Linux Basics for UNO Q

"full Debian"이라는 표현이 핵심이다. 임베디드 리눅스 흔히 쓰는 축소·커스텀 배포판이 아니라, 표준 apt 저장소를 그대로 쓰는 일반 Debian이라는 뜻이다. 실제로 UNO Q User Manual도 "a full Debian Linux OS with upstream support"라고 못박는다 — 업스트림(공식 Debian 프로젝트) 저장소를 그대로 따라간다는 뜻이다.

역할 분담은 명확하다. MPU(Debian)는 Wi-Fi·Bluetooth 관리, Python 스크립트·리눅스 애플리케이션 실행, 시스템 자원·주변기기 제어를 맡고, MCU(STM32U585, Zephyr — 3.2)는 실시간 연산과 GPIO·하드웨어 인터페이스를 맡는다. 둘은 Bridge라는 메커니즘으로 이어진다(3.4에서 내부를 분석한다).

전원 인가 부트로더 (SPL·U-Boot) Linux 커널 부팅 systemd 초기화 arduino-router 서비스 (3.4) Arduino App Lab (SBC 모드 시 자동 실행) 네트워크 서비스 SSH· NetworkManager

3.1.2 버전 — 자료마다 다른 표기를 정직하게 정리한다

UNO Q는 2025년 하반기 출시된 신제품이라, Debian 버전 표기가 자료마다 다르다. 이 책의 정직성 원칙(BK-04)에 따라 실제로 확인한 내용을 그대로 적는다.

확인된 것: 공식 문서 Debian Linux Basics for UNO Q의 "패키지 목록 갱신" 절에 실린 sudo apt update 실행 예시 출력에는 다음과 같이 저장소가 나열된다.

Hit:1 http://deb.debian.org/debian trixie-backports InRelease
Hit:2 http://deb.debian.org/debian trixie InRelease
Hit:3 http://deb.debian.org/debian trixie-updates InRelease
Hit:4 http://deb.debian.org/debian-security trixie-security InRelease
Hit:5 https://apt-repo.arduino.cc stable InRelease

trixie는 Debian 13의 코드네임이다. 즉 공식 문서가 실제로 보여주는 실행 결과 기준으로는 Debian 13 (Trixie)가 맞다. 다섯 번째 줄의 apt-repo.arduino.cc는 Debian 표준 저장소에 추가된 Arduino 자체 저장소로, arduino-app-cli·arduino-router 같은 보드 전용 패키지를 공급한다.

갈리는 지점: 사용자가 미리 알려준 대로, 커뮤니티 포럼에는 "Bookworm(Debian 12) 이미지를 달라"는 요청 글이 있었고, 일부 자료는 App Lab 호환성 문서에서 "Trixie 64bit"를 언급한다. 초기 리뷰·베타 이미지 시절에는 Bookworm 기반이었을 가능성이 있고(초기 QRB2210 BSP가 Bookworm 계열에서 출발했다는 정황), 이후 정식 출시 이미지가 Trixie로 갱신됐을 수 있다 — 이 전환 시점과 경위는 확인하지 못했다. 펌웨어·OS 이미지는 App Lab의 "Flash a Linux Image" 기능으로 계속 갱신되므로, 집필 시점(2026-08-24) 이후에도 버전이 또 바뀔 수 있다.

실전 확인 방법 — 어떤 자료를 읽었든, 보유한 보드에서 직접 확인하는 것이 가장 정확하다.

cat /etc/os-release

uname -a로 커널 버전·아키텍처(aarch64)도 함께 확인할 수 있다.

uname -a

App Lab을 쓴다면 Settings → Operating system 섹션에서도 Linux Distribution·Kernel Version·Build Version·Release date를 GUI로 볼 수 있다 — CLI에 익숙하지 않다면 이쪽이 더 빠르다.

⚠️ 이 장 이후 본문에서 "Debian"이라고만 쓰고 버전을 명시하지 않는 곳은, 위 확인 방법으로 각자 보드에서 재확인하라는 뜻으로 읽어달라.

3.1.3 셸 환경

보드에 로그인하면 표준 Unix 셸 환경이 제공된다. 공식 가이드의 모든 명령 예시는 bash 문법(코드펜스도 `bash )으로 제공되며, Debian 표준 설치가 새 사용자 로그인 셸로 bash를 기본 지정하는 관례를 따른다고 보는 것이 합리적이다. 다만 문서가 로그인 셸을 "bash"라고 명시적으로 못박은 문장은 찾지 못했다 — 확실히 하려면 보드에서 직접 확인한다.

echo $SHELL

기본 사용자 계정은 arduino다. SSH·ADB·SBC 모드 어느 경로로 접속해도 이 계정으로 로그인한다(5.2에서 SSH 자체를 깊게 다룬다).

ssh arduino@<보드이름>.local

프롬프트는 표준 Debian 스타일(arduino@<hostname>:~$)이고, 홈 디렉터리는 /home/arduino/다. Tab 자동완성, Ctrl+R 역방향 히스토리 검색, Ctrl+L 화면 클리어 등 흔한 bash 단축키가 모두 그대로 동작한다.

3.1.4 패키지 관리 — apt

패키지 관리는 표준 Debian APT(Advanced Package Tool)를 그대로 쓴다. 별도 경량 패키지 매니저를 얹지 않았다는 점이 "full Debian" 표현의 실체다.

sudo apt update          # 패키지 목록 갱신(설치는 안 함)
sudo apt upgrade         # 설치된 패키지를 보수적으로 갱신
sudo apt full-upgrade    # 의존성 변경까지 포함한 전체 갱신
sudo apt install <패키지명>
sudo apt search <키워드>
sudo apt remove <패키지명>   # 설정 파일은 남김
sudo apt purge <패키지명>    # 설정 파일까지 제거
sudo apt autoremove           # 불필요해진 의존 패키지 정리

저장소는 두 계층이다: ① Debian 표준 저장소(deb.debian.org, trixie/trixie-updates/trixie-security/trixie-backports), ② Arduino 자체 저장소(apt-repo.arduino.cc, stable). 후자가 arduino-app-cli·arduino-router 등 보드 전용 도구를 공급한다는 뜻이므로, 이 저장소 목록이 /etc/apt/sources.list.d/ 아래 어딘가에서 손상되면 App Lab 관련 도구 업데이트가 막힌다 — 이런 상황을 만났을 때 저장소 목록부터 의심해 볼 만하다.

메이저 업그레이드는 apt의 몫이 아니다. Debian 메이저 버전 자체를 업그레이드하거나(예: 향후 trixie → forky), 시스템을 공장 초기화하려면 apt full-upgrade가 아니라 App Lab의 Flash a Linux Image 기능(Settings 메뉴, 또는 보드가 응답하지 않을 때 Arduino Flasher CLI)을 쓴다. 5.3·5.4에서 더 다룬다.

3.1.5 기본 설치된 소프트웨어

공식 가이드 기준으로 확인되는, 보드에 기본 포함되는 것들은 다음과 같다.

범주구성 요소비고
텍스트 편집nano기본 CLI 편집기, 사전 설치 확인됨
셸 유틸리티ls·cp·mv·rm·find·grep·less·man 등표준 GNU coreutils
네트워크 관리NetworkManager(nmcli)Wi-Fi 스캔·연결·WPA2-Enterprise 설정까지 지원
시스템 서비스systemd(systemctl·journalctl)서비스 관리·로그, 5.1에서 심화
Arduino 전용 CLIarduino-app-cliApp Lab 앱을 GUI 없이 빌드·시작·정지
Arduino 전용 CLIarduino-cli표준 Arduino CLI, MCU 코어·라이브러리 관리
PythonPython 3 (python3-pip 등 apt로 설치 가능)MPU 측 공식 지원 언어(3.1.1)
파이썬-보드 연동arduino.app_utils 모듈(App·Bridge·Leds 등)App Lab 앱의 main.py가 임포트

카메라·시리얼 장치처럼 프로젝트에 따라 필요한 것들은 apt로 그때그때 설치한다(가이드가 예시로 든 것: sudo apt install cheese(USB 카메라 GUI 뷰어), sudo apt install python3-opencv(OpenCV), sudo apt install screen(시리얼 콘솔 접속용)).

APT 검색으로 존재 여부를 바로 확인할 수 있다.

apt search python3   # Python 3 관련 패키지 전체 조회
dpkg -l | grep arduino   # 이미 설치된 Arduino 관련 패키지 확인

3.1.6 파일시스템 구조

가이드가 명시하는 핵심 경로는 다음과 같다.

/                         # 루트
├── home/
│   └── arduino/          # 기본 사용자 홈 — 대부분의 작업이 여기서
│       └── ArduinoApps/  # App Lab이 만든 앱들, 앱마다 하위 디렉터리
├── tmp/                  # 임시 파일 — 재부팅 시 초기화
└── mnt/                  # USB 저장장치 등 마운트 지점

~/ArduinoApps/<앱이름>/ 아래에는 스케치 코드, Python 스크립트, app.yaml 설정 파일이 들어간다. 앱 실행 중 남기는 영속 데이터는 data/ 폴더에, Python 가상환경 같은 부가 파일은 .cache/ 폴더에 저장된다. 저장소는 eMMC(16 GB 또는 32 GB, 1.1 참조)이므로 df -h·du -sh *로 공간을 주기적으로 확인할 필요가 있다 — 특히 카메라·AI 모델 파일을 다루는 프로젝트(제9부)라면 더더욱.

3.1.7 접근 경로 — 개관만

Debian 셸에 닿는 방법은 네 가지다: USB-C(ADB), SSH(네트워크), SBC 모드(모니터·키보드·마우스 직결), 하드웨어 디버그 UART(1.8V, 부팅 초기 로그용). 이 장에서는 존재만 언급하고, 실제 설정·트러블슈팅은 5.2(SSH)에서 깊게 다룬다. 한 가지만 미리 알아둘 점: SSH·App Lab 네트워크 모드는 mDNS(.local 호스트명)에 의존하므로, 게스트 Wi-Fi·회사망·VPN 환경에서는 검색이 안 될 수 있다 — 그럴 땐 hostname -I로 확인한 IP로 직접 접속한다.

3.1.8 엣지케이스 — 종료 동작의 함정

Debian을 다루다 보면 클래식 아두이노와 다른 관행이 하나 필요하다. sudo shutdown now나 sudo poweroff를 실행해도 보드가 몇 초 뒤 자동으로 재부팅된다. 이것은 보드의 전원 관리 로직에 내장된 동작이다. 보관·이동 등으로 정말 전원을 끄고 싶다면 sudo halt를 써야 한다 — 이 경우 시스템은 정지 상태로 남고 자동 재시작하지 않는다(단, 일부 USB-C PD 허브·구버전 펌웨어 조합에서는 halt도 자동 재시작될 수 있다고 공식 문서가 밝힌다).

sudo halt       # 권장 — 정지 상태 유지, 전원 분리 안전
sudo reboot     # 재부팅
sudo shutdown now   # 종료 후 자동 재시작됨(주의)

또 하나: sudo 남용 함정이다. 홈 디렉터리에서 sudo nano myfile.txt처럼 불필요하게 sudo를 쓰면 파일 소유자가 root가 되어, 이후 일반 권한으로 편집할 수 없게 된다. 시스템 설정(/etc/ 아래)이나 패키지 설치가 아니라면 sudo 없이 작업하는 것이 기본이다.

3.1.9 이 장에서 다루지 않은 것

Debian을 "운영"하는 실전 — 부팅 프로세스와 systemd 서비스 상세(5.1), SSH 키·SCP 파일 전송(5.2), OTA 업데이트·원격 관리(5.3), eMMC 파티션·저장 공간 관리(5.4), 전력·성능 튜닝(5.5) — 는 제5부에서 각각 한 장씩 배정해 깊게 다룬다. 이 장은 그 앞에서 "MPU에 왜, 무엇이 있는가"를 세팅하는 역할이다. MCU 쪽 소프트웨어 스택은 다음 장(3.2), 둘을 잇는 다리는 3.3·3.4로 이어간다.