삽질

NVMe 마이그레이션부터 로컬 AI 채팅까지 — 삽질 2일차

베타버전 선생님 2026. 5. 19. 14:08

 

SD카드 32GB로는 아무것도 못 한다는 걸 뼈저리게 깨달은 날


들어가며

https://betateacher.tistory.com/1

 

Jetson Orin Nano 개봉기 — AI 서버 만들기 첫 걸음

AI 컴퓨터, 과연 교무실에서 살아남을 수 있을까?들어가며정보 교사로 일하다 보면 늘 이런 생각이 든다."교과서에서 AI를 가르치는데, 나는 AI를 제대로 써본 적이 있나?"그래서 질렀다. NVIDIA Jetso

betateacher.tistory.com

 

1편에서 JetPack 설치와 SSH 원격 접속까지 성공했다.
오늘 목표는 딱 하나였다. LLM 모델을 돌려서 한국어로 대화하는 것.

결론부터 말하면 됐다. 하지만 그 과정이 순탄하지 않았다.


1. 용량 문제 — 예상치 못한 벽

df -h 결과 — 100% 사용 중

 

의기양양하게 첫 모델을 받으려는 순간 이런 오류가 났다:

Error: no space left on device
df -h
# /dev/mmcblk0p1   28G   27G   0 100% /

32GB SD카드에 JetPack이 27GB를 잡아먹어버렸다.
남은 공간이 0바이트였다.

💡 : JetPack 6.x는 설치 후 약 25~27GB를 사용한다. 처음부터 128GB 이상 SD카드 또는 NVMe SSD를 사용할 것을 강력히 권장한다.


2. NVMe 마이그레이션 — 생각보다 험난했다

512GB NVMe SSD를 구매했다.

(중고로 20만원에 구입... 너무나 가격이 올랐다..)

Jetson Orin Nano M.2 슬롯에 꽂고 마이그레이션을 시도했다.

2-1. dd 명령어로 복사

sudo dd if=/dev/mmcblk0 of=/dev/nvme0n1 bs=4M status=progress

88MB/s 속도로 약 10분 소요

약 10분 후 복사 완료. 여기까지는 순탄했다.

2-2. 파티션 확장

sudo apt install cloud-guest-utils -y
sudo e2fsck -f /dev/nvme0n1p1
sudo growpart /dev/nvme0n1 1
sudo resize2fs /dev/nvme0n1p1

NVMe 파티션이 457GB로 확장됐다.

2-3. 부팅 순서 변경 — 여기서 진짜 삽질 시작

재부팅했는데 여전히 SD카드로 부팅되고 있었다.

efibootmgr, nvbootctrl, nv-l4t-bootloader-config.sh 등 여러 방법을 시도했고, 결국 핵심은 두 파일을 수정하는 것이었다.

1. /etc/nv_boot_control.conf 수정

sudo sed -i 's/TEGRA_BOOT_STORAGE mmcblk0/TEGRA_BOOT_STORAGE nvme0n1/' \
  /etc/nv_boot_control.conf

sudo /opt/nvidia/l4t-bootloader-config/nv-l4t-bootloader-config.sh

2. NVMe 안의 extlinux.conf 수정

sudo mount /dev/nvme0n1p1 /mnt
sudo sed -i 's/root=\/dev\/mmcblk0p1/root=\/dev\/nvme0n1p1/g' \
  /mnt/boot/extlinux/extlinux.conf
sudo umount /mnt
sudo reboot

재부팅 후 확인:

df -h
# /dev/nvme0n1p1   457G   26G   410G   6%   /

nvme0n1p1 457G — 드디어 성공

410GB 여유 공간 확보! 🎉

💡 핵심 포인트: Jetson Orin Nano는 extlinux.conf가 SD카드와 NVMe 두 곳에 있다. 둘 다 수정해야 NVMe 부팅이 된다.


3. Ollama + 모델 설치

NVMe로 전환하고 나니 모든 게 순탄해졌다.

# Ollama 설치 (이미 1편에서 완료)

# 모델 다운로드
ollama pull qwen2.5:7b   # 한국어 성능 우수, 4.7GB
ollama pull qwen3:8b     # 최신 버전, Thinking 모드 포함, 5.2GB

모델 선택 기준 (Jetson Orin Nano 8GB 기준)

모델 용량 특징

qwen2.5:7b 4.7GB 한국어 성능 우수, 안정적
qwen3:8b 5.2GB 최신, Thinking 모드, 약간 느림
qwen3:4b 2.5GB 빠른 응답, 성능 다소 낮음

터미널에서 바로 테스트:

ollama run qwen3:8b --think=false
>>> 안녕
안녕하세요! 😊 어떤 도움이 필요하신가요?

터미널에서 바로 한국어 대화 가능

 

--think=false 옵션을 붙이면 Thinking 과정 없이 바로 응답한다.


4. Open WebUI — 브라우저로 ChatGPT처럼

터미널 채팅만으로는 학생들한테 보여주기 어렵다.
브라우저에서 쓸 수 있는 Open WebUI를 Docker로 설치했다.

4-1. Docker 설치

curl -fsSL https://get.docker.com | sh
sudo usermod -aG docker $USER
newgrp docker

JetPack에 Docker가 이미 포함되어 있어서 업데이트 형태로 진행됐다.

4-2. Open WebUI 실행

docker run -d \
  --network=host \
  -e OLLAMA_BASE_URL=http://127.0.0.1:11434 \
  -v open-webui:/app/backend/data \
  --name open-webui \
  --restart always \
  ghcr.io/open-webui/open-webui:main

4-3. 메모리 부족 문제와 Swap

첫 시도에서 이런 오류가 났다:

cudaMalloc failed: out of memory

cudaMalloc failed: out of memory

 

OS + Docker + qwen3:8b를 동시에 올리니 8GB RAM이 부족했다.

해결책은 Swap(가상 메모리) 추가였다.

sudo fallocate -l 8G /var/swapfile
sudo chmod 600 /var/swapfile
sudo mkswap /var/swapfile
sudo swapon /var/swapfile

# 재부팅 후에도 유지
echo '/var/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

SSD 8GB를 RAM처럼 쓰는 방식이다. 속도는 느리지만 돌아는 간다.

free -h
# Mem:   7.4Gi   2.4Gi   4.6Gi
# Swap:  11Gi    1.2Gi   10Gi

RAM 7.4GB + Swap 11GB = 총 18GB 확보!

💡 교과서 연계: 이 Swap이 바로 중학교 정보 교과서 I단원 "기억 장치" 에서 배우는 가상 메모리 개념이다. 실제로 작동하는 걸 눈으로 보는 것이 교육 효과가 크다.

4-4. 성공!

http://192.168.10.76:8080 접속 후 계정 생성, qwen3:8b 선택.

브라우저에서 ChatGPT처럼 사용 가능

 

Thinking 모드를 끄면 응답 속도가 훨씬 빠르다.


현재까지 완료된 것

  • ✅ JetPack 6.2.1 설치 및 부팅
  • ✅ Ubuntu 초기 설정
  • ✅ SSH + Tailscale 원격 접속
  • ✅ NVMe 마이그레이션 (457GB)
  • ✅ Ollama + qwen3:8b 설치
  • ✅ Swap 8GB 추가
  • ✅ Open WebUI — 브라우저 AI 채팅
  • ⬜ YOLO 카메라 + QR 디스플레이 (다음 편)
  • ⬜ 교무실 전시 세팅

마치며

성능은 ChatGPT나 Claude에 비할 바가 못 된다.
응답도 느리고, 가상 메모리까지 써가며 겨우 돌아간다.

하지만 이 작은 보드가 인터넷 없이, 비용 없이, 데이터 한 줄 외부로 나가지 않고 한국어 AI를 돌리고 있다는 사실 자체가 의미 있다.

내일 학생들한테 보여줄 생각에 괜히 설렌다.


"수업도 장비도 늘 베타 중. 정보 교사의 기록 실험실."
정보쌤의 실험실 | 베타버전 선생님