안녕하세요
좋은 질문입니다.
그냥 제 개인적인 의견을 한번 공유 드리자면, 셋은 서로를 완전히 대체할 수 없고, 서로 상호 보완적으로 쓰이면 된다고 저는 생각합니다.
데비안 패키지
데비안 패키지(*.deb) 의 경우, 데비안을 기반으로 하는 우분투의 근간을 이루고 있다고 봐도 틀리지 않을 것 같습니다. 우분투를 설치하면 시스템을 구성하는 대다수의 소프트웨어가 모두 데비안 패키지 형태로 설치 되어 있고, 이에 따라 시스템 업데이트 또한 APT를 통해 데비안 패키지를 업데이트 하는 형태로 제공 됩니다.
데비안 패키지의 경우, 패키지 하나가 다른 여러 패키지에 의존하는 경우가 자주 있습니다. 예를 들면, 동영상 플레이어 패키지가 동영상 재생을 위한 코덱 패키지 등에 의존하는 형태 이고, 한국어 IME 패키지 같은것을 설치하면 이에 필요한 한글 입력 처리 라이브러리 패키지와 IME 엔진 패키지 등에 의존하는 형태라고 이해하면 되겠습니다.
이러한 데비안 패키지는, 배포판 릴리즈별로 따로 버전이 제공 됩니다. 패키지가 제공하는 소프트웨어가 새로운 메이저 업데이트가 나왔다고 하여, 해당 패키지 버전을 올려서 배포하면 다른 의존성 패키지도 업데이트 해야 배포해야 하는데, 의존성 패키지는 다른 패키지에서도 사용하는 경우가 많아서 호환성이 깨질 수 있기 때문입니다.
예를 들어 어떤 동영상 플레이어 패키지가 새로운 메이저 업데이트가 나왔다고 가정해 봅시다, 이 새 업데이트는 기존에 의존하던 동영상 코덱 패키지도 메이저 업데이트가 필요합니다. 그런데, 해당 코덱 패키지는 동영상 플레이어 뿐만 아니라, 웹 브라우저에서 의존 하기도 하고, 동영상 편집기 패키지에서도 의존 하는데 새로운 버전이 아닌 기존 버전의 코덱 패키지에 의존 합니다. 이런 경우 동영상 플레이어와 동영상 코덱을 메이저 업데이트 된 것으로 패키징 해서 배포하면, 동영상 코덱에 의존하던 다른 패키지와는 호환성이 깨지는 문제가 발생하게 됩니다.
그래서 우분투 뿐만 아니라, 데비안 개열의 배포판이나 안정성과 예측 가능성을 중요시 하는 배포판 이라면, 보통 배포판 릴리즈 별로 패키지를 따로 관리하여 제공하고 있습니다. 새로운 릴리즈가 나올 때, 제공할는 패키지에 메이저 업데이트를 포함하는 방식 입니다.
Snap
스냅(Snap) 은 말씀하신 대로, 마치 OCI 컨테이너와 유사한 형태로 되어 있습니다. 스냅 패키지가 제공하는 소프트웨어를 구동하기 위한 의존성이 같이 번들링 되어서 SquashFS 파일 시스템 하나에 모두 포함되어 압축 되어 있는 형태이고, 설치 및 실행 할 때는 AppArmor 등에 의해 격리된 환경에서 실행이 됩니다. 그러면서도, 마치 시스템의 일부처럼 작동을 합니다. 예를 들어 Python 을 OCI 컨테이너로 구동하면, 컨테이너를 먼저 띄우고 그 안에 Python 을 실행하는 형태이지만, 스냅으로 설치하면 똑같이 격리 되어 있지만 그냥 해당 스냅을 설치한 시스템에서 Python 을 터미널에서 바로 실행할 수 있습니다. 호스트의 Systemd 로 스냅에서 제공하는 소프트웨어를 데몬 형태로 관리도 가능합니다.
이런 스냅이 데비안 패키지와 또 다른 점은, 우분투 릴리즈 주기와 별도로 배포되는 것이 특징이라 할 수 있겠습니다. 이미 패키지 안에 필요한 의존성이 모두 번들링 되어 있고, 실행 할 때 격리된 환경에서 실행되기 때문에, 데비안 패키지와 달리 스냅 패키지를 배포하는 사람이 원하면 언제든지 최신 업데이트를 패키징 하여 제공할 수 있습니다. 또 이러한 특성 덕에 우분투 이외에 다른 배포판에서도 snapd가 설치되어 있다면 그대로 사용할 수 있다는 특징도 있습니다.
스냅의 경우 생각보다 광범위하게 사용이 되는데, 일반적인 앱 패키징에도 쓰이지만, 시스템 유틸리티 패키징에도 사용하고, 임베디드 소프트웨어 패키징하여 장비에 배포 하거나, OpenStack과 Kubernetes 같은 큰 규모의 서버용 소프트웨어도 하나로 패키징 해서 쉽게 설치할 수 있는 용도로 쓰이기도 합니다.
스냅의 경우, 의존성을 모두 번들링 하는 형태여서 이것이 장점이자 단점이 되기도 합니다. 특히 배포판 패키지 메인테이너가 직접 패키징 하며 시스템에 맞춰 최적으로 만들어진 데비안 패키지와 달리, 스냅은 소프트웨어를 개발 한 사람이 이를 직접 스냅으로 패키징 하는 경우가 많습니다. 그러면서 Best practice 를 나름 잘 적용하여, 꼭 필요한 의존성만 넣고 압축 알고리즘 등도 잘 설정하여 최신 소프트웨어를 쾌적하게 사용할 수 있도록 잘 만들어진 스냅도 있지만, 불필요한 의존성 까지 다 넣고 패키지가 무거워져서 제공하는 소프트웨어 마저 느리게 작동하는 경우도 자주 있습니다. 또한 앞서 스냅은 SquashFS 이미지에 다 번들링 되어 있다 하였는데, 실행 할 때 이 파일시스템을 호스트에 마운트 해야 하고 압축된 이미지라면 압축 해제도 해야 해서 이로 인해 생각보다 느리게 작동하는 경우도 있습니다. 이는 Snap을 개발하는 분들도 인지하고 있어, 이를 개선하기 위한 기능이 계속 추가되고 있습니다. (예를 들면 더 빠르고 성능 좋은 압축 알고리즘 적용, Snap 업데이트 시 바뀐 부분만 받는 기능(Delta) 등등)
Flatpak
Flatpak 또한 스냅처럼 의존성을 번들링 하고, 격리된 환경에서 실행하는 형태이지만 그 형태와 방식이 다릅니다. 스냅의 경우 Ubuntu Core 이미지를 기반으로 여기에 제공할 프로그램과 실행에 필요한 의존성 패키지를 모두 포함하는 형식 입니다. 반면 Flatpak 은 제가 많이 사용하지 않아서 잘은 모르지만, 한번 문서를 확인 해 보니 “런타임” 개념을 사용합니다. 런타임은 애플리케이션(주로 GUI)앱을 실행하기 위한 공통적이고 기본적인 의존성을 모아 둔 것 이라고 하네요. 그리고 여기에 Flatpak 으로 패키징 하는 사람이 필요에 따라서, 런타임에 없는, 다른 버전의 혹은 변형된 라이브러리 정도만 추가로 더 번들링 하는 형태라고 합니다. 또한 실제로 설치 및 실행 할 때는 OSTree나 OCI 컨테이너 형식을 이용합니다. 격리 된 환경에서 실행하도록 하는 기능에는 bubblewrap 을 활용합니다.
덕분에 의존성이 번들링 되어 있고, 격리된 환경에서 돌아가면서도, 스냅에 비해서 가볍게 구동이 된다는 특징이 있겠습니다. 또한 더 많은 배포판에서 더 잘 작동하기도 합니다. 하지만 제한되는 점도 있는데, Flatpak 패키징을 위해 지원되는 런타임이 Freedesktop, GNOME, KDE 등 데스크톱 GUI 앱 실행에 사용되는 것으로 한정된다는 것입니다. 따라서 GUI 앱을 패키징 해서 배포하기는 좋지만, 다른 유형의 소프트웨어를 배포 하는 것은 제한된다고 볼 수 있습니다.
Flatpak 또한 우분투 릴리즈 주기와 어쩌면 당연하게도 별개로 배포가 됩니다. 패키징을 하는 사람이 배포판 릴리즈와 상관 없이 원하면 언제든 새로운 업데이트를 배포할 수 있습니다.
비교
비교 해 보면 아래 표와 같습니다.
| - |
데비안 패키지 |
Snap |
Flatpak |
| 업데이트 주기 |
우분투 릴리즈 주기 및 정책을 따름 |
패키징 하는 사람이 원하면 언제든 |
패키징 하는 사람이 원하면 언제든 |
| 격리 |
- |
AppArmor, Seccomp, Namespaces, Cgroup 등 |
Bubblewrap(Namespace, Seccomp 등 사용) |
| 의존성 |
별도 패키지 설치 |
최소한의 OS 시스템 라이브러리는 Base Snap 이미지로 등으로 공유(core22, core 24 등), 나머지는 SquashFS 이미지에 모두 다 번들링 |
런타임 개념으로 기본적인 라이브러리는 공유, 런타임에 없는 것을 추가적으로 번들링 |
| 사용 가능한 프로그램 |
패키지로 제공되는 어떤 것이든 |
대부분의 프로그램 및 설치 복잡한 것을 스냅 하나로 패키징한 솔루션(OpenStack, k8s 등등) |
GUI 앱 |
| 주요 용도 |
시스템 소프트웨어 관리 및 부가적인 것 설치 등 (앱 포함) |
최신 GUI 앱, IoT/서버/클라우드 배포 및 구성, CLI 도구 등등 |
데스크톱 GUI 앱 |
| 호환성 |
지정된 우분투 릴리즈 에서만 사용 |
많은 리눅스 배포판에서 사용 가능하지만, AppArmor 및 Systemd 지원 없는 환경에서 사용 불가 |
더 많은 대부분의 리눅스 배포판에서 사용(AppArmor 요구 안함) |
답변
그러면 질문 주신 것을 답변 해 보겠습니다.
Snap 이 데비안 패키지 대체 가능한가
불가합니다. 애초에 Snap 패키징을 할 때 의존성으로 데비안 패키지를 거의 대부분 활용합니다. Base Snap 또한 우분투에서 제공되는 데비안 패키지로 만든 것입니다. 물론 사용자 입장에서 Snap 만 사용하는 것은 가능합니다. Ubuntu Core 라는 IoT 특화된 배포판이 있는데, 모든 시스템이 Snap 으로 구성되어 있고, Snap 만으로 패키지 설치와 업데이트 등을 관리 합니다. 물론 여기에 포함된 Snap을 빌드할 때 데비안 패키지를 여전히 사용 할 것입니다.
Flatpak 이 데비안 패키지와 스냅 대체 가능한가
스냅은 대체 가능 하겠습니다. Flatpak 사용시, GUI 앱 위주로 사용하고 나머지는 데비안 패키지를 활용한다는 가정을 하면 그렇습니다. 하지만 Flatpak 이 리눅스 배포판의 시스템 구성을 할 용도로 쓰이지는 않습니다. 때문에 데비안 패키지를 대체할 수는 없겠습니다. 사용자가 원하는 GUI앱 최신 버전을 설치해 활용하는 용도 정도로 쓰일 수 있겠습니다.
데비안 패키지만 사용하면?
사실 데비안 패키지만 사용해도 지장은 없겠지만, 배포판 릴리즈가 데비안 패키지로 제공하는 버전의 소프트웨어가 아닌 다른 버전의 소프트웨어가 필요하면, 데비안 패키지 만으론 부족할 수는 있습니다. 데비안 패키지는 제3자 제공 패키지 설치가 어려운 것은 아니지만, 비교적 복잡 하기도 합니다. (PPA 설정, 외부 저장소 추가 설정 등등) 또한 이렇게 직접 추가 설치한 데비안 패키지는 기존에 배포판에서 제공하는 것과 충돌 될 수도 있어 주의가 필요하겠습니다.
결론
데비안 패키지, Snap, Flatpak 셋 다 필요에 따라 상황에 따라 조합하여 상호 보완하는 형태로 사용하면 되겠습니다.
참고자료
설명이 길었는데요, 사실 잊을 만 하면 한번씩 올라오는 질문이기도 하고, Ubuntu Discourse 에서도 올라오면 뜨거운 토론(?)이 벌어지는 주제여서 한번 쭉 정리하면 어떨까 하여 정리 해 보았습니다.