Skip to main content

Command Palette

Search for a command to run...

Flatpak을 이해하기 위한 배경 지식

Published
5 min read

배포판, 라이브러리 충돌, 그리고 OSTree까지

리눅스 데스크톱에서 Flatpak이 표준처럼 자리 잡은 데에는 분명한 이유가 있다.
그 이유를 이해하려면 단순히 “Flatpak은 패키징 시스템이다”를 넘어서,
리눅스 배포판 구조, 라이브러리 버전 충돌, OSTree라는 기술까지 함께 이해해야 한다.

이 글에서는 다음 질문에 답해본다.

  • 리눅스에서 말하는 배포판이란 무엇인가?

  • 라이브러리 버전 충돌은 왜 발생하는가?

  • Flatpak은 이 문제를 어떻게 해결하는가?

  • 그 핵심에 있는 OSTree는 무엇인가?


1. 리눅스 배포판이란 무엇인가?

많은 사람들이 “리눅스”를 하나의 운영체제로 생각하지만,
엄밀히 말하면 리눅스는 커널(kernel) 에 불과하다.

우리가 실제로 사용하는 것은 커널 위에 여러 구성 요소를 얹어 만든
리눅스 배포판(Linux Distribution) 이다.

배포판에 포함되는 것들

  • 리눅스 커널

  • 시스템 라이브러리 (glibc 등)

  • 기본 명령어 도구 (GNU coreutils)

  • 패키지 관리자

  • 기본 설정과 정책

  • (선택적으로) 데스크톱 환경

이 모든 것을 하나로 묶어 제공하는 것이 배포판이다.

대표적인 배포판들

  • Ubuntu, Debian

  • Fedora, RHEL, CentOS

  • Arch Linux

  • openSUSE

각 배포판은 서로 다른 철학과 정책을 가진다.


2. 배포판마다 다른 패키지 시스템

배포판이 다르다는 것은 단순히 이름만 다른 게 아니다.

패키지 포맷의 차이

배포판 계열패키지 포맷
Debian / Ubuntu.deb
Fedora / RHEL.rpm
Arch.pkg.tar.zst

패키지 관리자도 다르다

# Ubuntu
apt install nginx

# Fedora
dnf install nginx

# Arch
pacman -S nginx

이 차이 때문에,
같은 프로그램이라도 배포판마다 따로 패키징해야 한다.


3. 라이브러리 버전 충돌은 왜 발생할까?

핵심 원인: 시스템 전역 라이브러리 공유

전통적인 리눅스 시스템은 라이브러리를 전역(shared) 으로 사용한다.

/usr/lib/libssl.so
/usr/lib/libcurl.so

여러 프로그램이 같은 라이브러리 파일을 함께 쓴다.

이 방식은 효율적이지만, 치명적인 문제가 있다.


라이브러리는 계속 변한다

라이브러리는 시간이 지나면서:

  • 함수 추가/제거

  • 함수 시그니처 변경

  • 동작 방식 변경

  • ABI(Application Binary Interface) 변경

ABI가 깨지면 기존 바이너리는 실행조차 되지 않는다.


충돌이 발생하는 전형적인 상황

프로그램요구 라이브러리
앱 Alibfoo 1.x
앱 Blibfoo 2.x

하지만 시스템에는 libfoo 한 버전만 설치 가능하다.

👉 하나를 만족시키면 다른 하나가 깨진다.

이게 바로 Dependency Hell이다.


배포판 정책이 문제를 더 키운다

  • Ubuntu LTS

    • 안정성 우선

    • 라이브러리 버전 고정

  • Fedora / Arch

    • 최신성 우선

    • 잦은 라이브러리 업데이트

👉 최신 앱은 LTS에서 안 돌고
👉 기존 앱은 최신 배포판에서 깨진다


4. Flatpak이 등장한 이유

Flatpak은 이 문제를 정면으로 포기한다.

“시스템 라이브러리를 공유하지 말자.”

Flatpak의 접근 방식

  • 앱을 시스템과 분리

  • 앱별로 필요한 라이브러리 포함

  • 공통 라이브러리는 Runtime으로 묶어 공유

  • 샌드박스 실행

결과적으로:

  • 배포판에 상관없이 실행 가능

  • 의존성 충돌 제거

  • 보안성 향상


5. Flatpak의 핵심 기술, OSTree

Flatpak이 가능한 이유는 내부적으로 OSTree를 사용하기 때문이다.

OSTree란?

리눅스 파일시스템을 Git처럼 관리하는 시스템

OSTree는 패키지가 아니라,
파일시스템 전체를 커밋(commit) 단위로 관리한다.


OSTree의 핵심 특징

1. 커밋 기반 파일시스템

  • 모든 상태는 immutable한 커밋

  • 해시로 식별

  • Git commit과 유사

2. 콘텐츠 주소 기반 저장

  • 내용이 같으면 한 번만 저장

  • 여러 앱과 런타임이 라이브러리 공유 가능

3. 델타 업데이트

  • 변경된 부분만 다운로드

  • 빠른 업데이트

4. 원자적 업데이트 + 롤백

  • 업데이트 실패 없음

  • 이전 버전으로 즉시 복구 가능


6. Flatpak에서 OSTree는 어떻게 쓰일까?

Flatpak의 앱, 런타임, SDK는 모두 OSTree 저장소에 저장된다.

/var/lib/flatpak/repo
 ├─ objects/
 ├─ refs/
 └─ commits/

업데이트 시:

  1. 새 커밋 다운로드

  2. 완전히 준비되면

  3. 심볼릭 링크 교체

👉 실행 중 깨질 가능성이 없다.


7. Runtime을 나눴다면, 이제 어떻게 바꿀 것인가?

앞에서 본 것처럼:

  • runtime은 공통 라이브러리 묶음이고

  • ABI 안정성이 매우 중요하며

  • 여러 앱이 동시에 의존한다

여기서 자연스럽게 질문이 생긴다.

“그럼 runtime은 어떻게 업그레이드해야 할까?”

이 질문에 대한 답이
Flatpak runtime 업그레이드 전략이다.


8. Flatpak Runtime 버전 업그레이드 전략

Runtime은 “자주 바뀌지 않는 기반”이다

Flatpak의 핵심 전제는 다음과 같다.

Runtime은 안정적인 기반이고,
앱은 그 위에서 빠르게 변화한다.

runtime을 자주 바꾸는 순간,
runtime이라는 개념 자체가 무너진다.


Runtime은 항상 명시적인 버전을 가진다

org.freedesktop.Platform//23.08
org.gnome.Platform//45

이 버전은 단순한 숫자가 아니라:

  • 라이브러리 조합의 경계

  • ABI 호환성 범위

  • 지원 수명 단위

를 의미한다.

앱은 이 runtime 버전에 강하게 고정(pinning) 된다.


왜 runtime은 자동 업그레이드되지 않을까?

runtime이 자동으로 올라간다면:

  • 전역 라이브러리 업데이트와 다를 바 없고

  • runtime 위의 모든 앱이 동시에 영향을 받는다

👉 Flatpak이 해결하려던 문제가 다시 발생한다.

그래서 Flatpak은:

  • runtime 자동 전환 ❌

  • runtime 명시적 선택 ⭕

을 선택했다.


실제 runtime 업그레이드 흐름

1️⃣ 여러 runtime은 공존한다

  • org.gnome.Platform//44

  • org.gnome.Platform//45

이 둘이 동시에 설치되는 것은 정상이다.
OSTree 덕분에 중복 파일은 최소화된다.


2️⃣ 새 runtime은 “추가”된다

새 runtime이 나와도 기존 것은 교체되지 않는다.

  • 기존 앱 → 그대로 실행

  • 새 앱 / 업데이트된 앱 → 새 runtime 선택

runtime 업그레이드는 교체가 아니라 확장이다.


3️⃣ runtime 전환은 앱 개발자의 결정이다

runtime: org.gnome.Platform
runtime-version: "46"

이 한 줄은:

  • 이 앱이 어떤 플랫폼 위에서

  • 어떤 ABI 범위를 신뢰하는지

를 명확히 선언한다.

runtime 업그레이드는 앱 단위 계약이다.


EOL: 유일한 강제 조건

runtime은 영원히 유지되지 않는다.

  • 보안 패치 종료

  • 유지보수 종료

이 경우에만:

  • 개발자에게 업그레이드가 요구되고

  • 장기적으로 게시가 제한된다

👉 보안이 이유일 때만 최소한으로 강제


9. 왜 Flatpak은 데스크톱에 적합한가?

  • GUI 앱은 라이브러리 의존성이 복잡

  • 배포판별 차이가 큼

  • 사용자 시스템을 깨뜨리면 안 됨

Flatpak은:

  • 앱을 안전하게 격리

  • 배포판 차이를 제거

  • 업데이트 실패 리스크 최소화

그래서 리눅스 데스크톱 앱 배포의 표준이 되었다.


정리

  • 배포판: 커널 + 패키지 시스템 + 정책의 묶음

  • 라이브러리 충돌: 전역 공유 구조의 필연적 문제

  • Flatpak: 앱 중심, 배포판 독립적 패키징

  • OSTree: 이를 가능하게 하는 Git-like 파일시스템 배포 기술


한 문장 요약

Flatpak은 배포판과 라이브러리 충돌이라는 리눅스의 오래된 문제를, OSTree 기반의 앱 격리와 파일시스템 버전 관리로 해결한 데스크톱 중심 배포 방식이다.


🧾 작성 참고

이 글은 ChatGPT의 도움을 받아 내용을 정리하였습니다.

More from this blog

LLM은 어떻게 글을 읽고 쓰는가 — 입력부터 출력까지

대화형 AI에게 질문을 던지면, 마치 사람처럼 문장을 이해하고 답을 써 내려가는 것처럼 보인다.하지만 그 안에서 벌어지는 일은 생각보다 단순하고, 또 생각보다 기계적이다.이 글에서는 두 가지 질문에 답해 본다.LLM은 어떻게 글을 만들어내는가,그리고 우리가 입력한 프롬프트는 모델에 어떤 모습으로 들어가는가. 1부. LLM은 어떻게 글을 만들어내는가 핵심은

Jun 10, 20264 min read

useEffect 지옥이란 무엇이며, 어떻게 안전하게 사용하는가

React를 어느 정도 사용하다 보면 한 번쯤은“useEffect 지옥에 빠졌다”는 말을 듣거나 직접 느껴본 적이 있을 것이다. useEffect가 계속 늘어나고 의존성 배열은 점점 길어지고 왜 실행되는지 이해하기 어려워지며 eslint-disable-next-line 이 늘어나는 상태 하지만 많은 사람들이 오해한다.useEffect 지옥은 useEffect가 많아서 생기는 문제가 아니다. 이 글에서는 ‘useEffect 지옥’의 ...

Jan 12, 20263 min read

Zod란 무엇인가: TypeScript에서 런타임 검증과 타입 안정성을 동시에 해결하는 방법

TypeScript 프로젝트를 하다 보면 반드시 마주치는 문제가 있다.바로 “타입은 있는데, 데이터는 믿을 수 없다”는 것이다. TypeScript는 컴파일 타임에는 강력하지만,런타임에 들어오는 데이터에 대해서는 아무런 보장을 해주지 않는다. API 요청 데이터 사용자 입력(Form) 환경 변수 (process.env) 외부 JSON / 설정 파일 이 모든 것은 타입 시스템 바깥에서 들어온다. 이 문제를 해결하기 위해 등장한 라이브러...

Jan 10, 20263 min read

npm SemVer 실무 가이드

이 글은 npm의 Semantic Versioning(SemVer) 을 처음 접하는 개발자부터, 실무에서 이미 사용하고 있지만 헷갈리는 포인트가 많은 개발자까지를 대상으로 한다. 단순한 규칙 나열이 아니라, 실제 업무에서 어떻게 쓰이고, 어디서 사고가 나며, 어떤 관습이 굳어졌는지를 중심으로 정리했다. 1. SemVer란 무엇인가? SemVer(Semantic Versioning)는 버전 번호에 의미를 부여하는 규칙이다. 기본 형식은 다음과 ...

Jan 7, 20263 min read

Dev note

31 posts