Ubuntu 26.04 강좌 / Snap 설치·권한·업데이트 이해하기
Ubuntu Server의 Snap은 명령행에서 설치본·제공자·채널·연결 권한·갱신 상태를 확인해 관리합니다. APT의 Deb 패키지와 별도로 설치되므로 같은 프로그램 이름을 쓰더라도 실행 경로·설치 형식·데이터 위치를 구분해야 합니다.
앱 형식과 제공자부터 확인하기
snap info 앱이름으로 제공자·설명·채널을 읽고 snap list로 설치된 이름·버전·추적 채널을 대조합니다. 실행 경로는 command -v 명령으로 확인합니다. 이름이 같다고 유지관리자·업데이트 경로·설정 위치까지 같다고 판단하지 않습니다.
Ubuntu Server의 패키지 관리 문서에서 APT와 Snap의 설치·관리 경로를 확인할 수 있습니다.
snap list
snap changes
snap refresh --time
snap list의 실제 설치 이름·버전·추적 채널을 기록합니다. snap changes는 설치·갱신 등 작업 이력을 보여 줍니다. apt에서 업데이트가 없다고 모든 Snap 앱까지 최신 상태라고 결론 내리지 않습니다.
작은 앱으로 설치와 실행 확인하기
snap info hello-world
sudo snap install hello-world
hello-world
실습 전 hello-world가 이미 설치되어 있었는지 확인하고 기존 설치라면 임의로 제거하거나 채널을 바꾸지 않습니다. 설치 제안과 제공자를 읽은 뒤 실행 결과를 봅니다. 실행 파일이 PATH에서 보이지 않으면 새 로그인 세션과 /snap/bin 경로를 확인합니다.
채널과 격리 수준 이해하기
채널은 트랙·위험도·브랜치로 버전 흐름을 지정할 수 있으며 stable·candidate·beta·edge가 항상 같은 안정성을 뜻하지 않습니다. 일반 사용은 제공자가 권장한 안정 채널을 우선하고, 채널 전환 전에 현재 채널과 데이터 백업을 기록합니다.
strict·classic·devmode는 격리 조건이 다릅니다. classic 설치가 요구되면 왜 일반 격리로 제공되지 않는지 확인합니다. 설치 오류를 없애려고 --classic이나 --devmode를 임의로 덧붙이지 않습니다.
연결 권한과 실패 원인 확인하기
권한을 조사할 실제 앱 이름을 snap list에서 고르고 snap connections 앱이름으로 연결된 인터페이스를 봅니다. 예를 들어 외장 매체 접근 문제는 앱의 연결 권한과 실제 마운트·파일 권한을 함께 확인해야 합니다. 모든 인터페이스를 한꺼번에 연결하지 않습니다.
snap info 앱이름, snap connections 앱이름과 제공자 문서에서 필요한 인터페이스를 확인한 뒤 최소한만 연결하고 새 접근을 시험합니다. 문제 해결 후에는 이번에 추가한 연결만 해제할 수 있도록 원래 상태를 기록합니다. 인터페이스 연결만으로 호스트의 파일 권한이 바뀌는 것은 아닙니다.
선언된 인터페이스를 확인하고 새 연결만 복원하기
이미 설치된 서버용 Snap에서 실제로 필요한 인터페이스를 제공자 문서로 확인합니다. snap connections 앱이름의 Plug·Slot 열과 snap interface 인터페이스이름의 출력을 대조합니다. 아래 스크립트에는 그 출력의 정확한 SNAP:PLUG와 SLOT만 전달합니다. 선언된 플러그가 없으면 연습을 위해 새 권한을 추측해서 연결하지 않습니다.
전체를 ~/test-snap-interface.sh로 저장해 bash ~/test-snap-interface.sh 실제SNAP:PLUG 실제SLOT으로 실행합니다. 기존 연결은 건드리지 않으며 새 연결만 별도 터미널에서 문서화된 기능으로 시험한 뒤 Enter로 해제합니다. 민감한 시스템 접근을 허용하는 인터페이스는 운영 서버에서 단순 연습용으로 연결하지 않습니다.
set -eu
if [ "$#" -ne 2 ]; then
printf 'Usage: bash test-snap-interface.sh SNAP:PLUG SLOT\n' >&2; exit 2
fi
plug=$1
slot=$2
app=${plug%%:*}
case "$plug" in *:*) ;; *) printf 'Use the exact Plug from snap connections.\n' >&2; exit 2 ;; esac
case "$slot" in *:*) ;; *) printf 'Use the exact Slot from snap connections.\n' >&2; exit 2 ;; esac
snap list "$app"
connections=$(LC_ALL=C snap connections "$app")
printf '%s\n' "$connections"
previous_slot=$(printf '%s\n' "$connections" | awk -v p="$plug" '$2 == p {print $3}')
case "$previous_slot" in
-) ;;
'') printf 'Declared plug not found; stop.\n' >&2; exit 1 ;;
*) printf 'Already connected to %s; preserve it.\n' "$previous_slot"; exit 0 ;;
esac
restore() {
original_status=$?
trap - EXIT HUP INT TERM
if ! connections=$(LC_ALL=C snap connections "$app"); then
printf 'Cannot inspect the connection; verify restoration manually.\n' >&2; exit 1
fi
current_slot=$(printf '%s\n' "$connections" | awk -v p="$plug" '$2 == p {print $3}')
case "$current_slot" in
"$previous_slot") ;;
"$slot")
if ! sudo snap disconnect "$plug" "$slot"; then
printf 'Restoration failed; inspect the connection.\n' >&2; exit 1
fi
;;
*) printf 'Unexpected connection state; inspect before disconnecting.\n' >&2; exit 1 ;;
esac
if ! connections=$(LC_ALL=C snap connections "$app"); then
printf 'Cannot verify restoration; inspect the connection.\n' >&2; exit 1
fi
printf '%s\n' "$connections"
restored_slot=$(printf '%s\n' "$connections" | awk -v p="$plug" '$2 == p {print $3}')
if [ "$restored_slot" != "$previous_slot" ]; then
printf 'Original connection state was not restored.\n' >&2; exit 1
fi
exit "$original_status"
}
trap restore EXIT
trap 'exit 129' HUP
trap 'exit 130' INT
trap 'exit 143' TERM
sudo snap connect "$plug" "$slot"
snap connections "$app"
read -r -p 'Run your documented app test in another terminal; press Enter to restore: ' answer
미연결 -가 실제 Slot으로 바뀌는지 확인하고 종료 뒤 snap connections 앱이름으로 원래 상태를 재확인합니다. 스크립트는 이번에 요청한 Slot만 해제하고 원래 미연결 상태로 돌아왔는지 다시 조회합니다. 해제·조회·상태 확인이 실패하면 0이 아닌 코드로 종료하며, 실습 자체가 실패했다면 그 종료 코드도 보존합니다. Ctrl+C·종료 신호에서도 복원을 시도하지만 전원 종료·강제 종료까지 보장하지 않으므로 작업 기록에 원래 Plug·Slot과 복원 명령을 남깁니다. 호스트 파일 권한과 서비스 접근 정책은 인터페이스 연결과 별도로 점검합니다.
Snap의 공식 사용 안내에서 연결·해제 명령을 확인할 수 있습니다.
갱신·복원·제거 후 데이터 확인하기
sudo snap refresh 앱이름으로 해당 앱의 갱신을 요청할 수 있지만 사용 중인 앱과 서비스 영향을 먼저 확인합니다. 이전 리비전으로 되돌리는 기능은 데이터 형식의 역호환까지 보장하지 않으므로 백업 없이 만능 복구로 사용하지 않습니다.
새로 설치한 연습 앱만 정리하려면 sudo snap remove hello-world를 사용합니다. 일반 제거 시 생성될 수 있는 자동 데이터 스냅샷은 snap saved로 확인하고 보존 정책을 따로 판단합니다. 앱 제거, 스냅샷 보관, 홈 디렉터리의 모든 파일 삭제는 같은 작업이 아닙니다.




