사전 Debian
구현체

Debian

gabury1고친 사람 github-actions[bot]

Debian 은 리눅스 커널에 수만 개의 프로그램을 골라 붙여, 바로 설치해 쓸 수 있게 만든 운영체제입니다. 회사가 아니라 전 세계 자원봉사자들이 함께 만듭니다. 새 기능보다 오래 안 깨지는 것을 앞세웁니다. 서버에서 널리 쓰이고 Ubuntu 같은 다른 운영체제의 바탕이 됩니다.

쉽고 빠른 이해

무슨 일을 하는 물건인가 — 리눅스 커널만으로는 아무것도 못 합니다. Debian 은 커널에 셸과 각종 프로그램, 설치 도구를 묶어 서버 한 대를 바로 쓸 수 있게 해 줍니다. apt install nginx 한 줄이면 웹 서버가 깔립니다.

왜 이렇게 하나 — 프로그램마다 소스를 받아 빌드하고, 그 프로그램이 기대는 다른 프로그램까지 사람이 찾아 깔면 서버마다 구성이 달라집니다. Debian 은 함께 잘 도는 버전들을 미리 골라 묶어 둡니다.

어떻게 도나

  1. 프로그램은 패키지라는 꾸러미로 나뉘어 Debian 의 서버에 올라가 있습니다
  2. 설치 도구가 필요한 패키지와 그것이 기대는 패키지를 함께 찾아 내려받습니다
  3. 새 패키지는 testing 이라는 시험용 브랜치에서 충분히 검증된 뒤에야 stable 이라는 안정판에 들어갑니다

대가 — stable 은 한번 나오면 프로그램 버전을 거의 안 올립니다. 보안 수정만 받습니다. 최신 기능이 필요하면 몇 년을 기다리거나 따로 구해야 합니다.

상세

Debian 은 리눅스 커널 위에 프로그램을 얹어 하나의 운영체제로 묶은 물건입니다. 이런 묶음을 리눅스 배포판이라고 합니다. Debian 은 그중 오래된 축에 듭니다. 회사가 아니라 자원봉사자 공동체인 Debian 프로젝트가 만듭니다.

리눅스 배포판이라는 묶음

커널은 하드웨어를 프로그램들에게 나눠 주는 프로그램입니다. 커널만 있으면 명령을 칠 창도, 파일을 고칠 도구도 없습니다. 웹 서버 하나를 띄우려 해도 셸, 공용 라이브러리, 웹 서버 프로그램, 설정 파일이 따로 필요합니다.

배포판은 이것들을 골라 서로 잘 맞는 버전으로 묶어 줍니다. 여기에 설치 프로그램과 업데이트 통로까지 붙입니다. 사용자는 조각을 하나씩 모으지 않고 묶음 하나를 깝니다.

flowchart TD
    A["웹 서버 · 데이터베이스 같은 프로그램"] --> B["셸 · 공용 라이브러리 · 기본 도구"]
    B --> C["리눅스 커널"]
    C --> D["하드웨어"]

위 그림에서 커널 위의 두 계층을 고르고 묶는 일이 배포판의 몫입니다. 커널은 여러 배포판이 같이 씁니다. 배포판끼리 갈리는 것은 주로 위의 두 계층과 그것을 배포하는 방식입니다.

패키지 한 개에 담기는 것

Debian 은 프로그램을 패키지 단위로 나눠 배포합니다. 패키지는 프로그램 파일과 그 설명서를 함께 담은 꾸러미입니다. Debian 의 패키지 파일은 이름이 .deb 로 끝납니다.

설명서에는 패키지 이름, 버전 번호, 이 패키지가 기대는 다른 패키지 목록이 적힙니다. 한 패키지가 돌려면 먼저 깔려 있어야 하는 패키지를 그 패키지의 의존성이라고 합니다. 예를 들어 nginx 패키지는 암호화 라이브러리 OpenSSL 의 패키지에 기댑니다.

패키지에는 유지관리 스크립트도 들어갈 수 있습니다. 유지관리 스크립트는 설치 앞뒤에 도는 짧은 스크립트입니다. 설치가 끝난 뒤 서비스용 사용자를 만들거나, 지우기 전에 서비스를 멈추는 일을 맡습니다.

dpkg 와 APT

패키지를 까는 도구는 두 계층으로 나뉩니다. 아래 계층은 dpkg(Debian package)입니다. dpkg 는 손에 쥔 .deb 파일 하나를 풀어 파일을 제자리에 놓고 스크립트를 돌립니다. 의존하는 패키지가 없으면 찾아 주지 않고 멈춥니다.

위 계층은 APT(Advanced Package Tool)입니다. APT 는 패키지 관리자입니다. 어디에 어떤 패키지가 있는지 목록을 받아 둡니다. 설치할 때는 의존성을 따라가 필요한 패키지를 전부 모은 뒤 dpkg 에 넘깁니다.

저장소는 패키지 파일과 패키지 목록을 모아 내놓는 곳입니다. 보통 서버 한 대가 이 파일들을 올려 두고 내줍니다. 어느 저장소를 볼지는 서버의 APT 설정 파일에 적습니다.

sequenceDiagram
    participant 운영자
    participant APT
    participant 저장소
    participant dpkg
    운영자->>APT: nginx 를 깔아라
    APT->>APT: 받아 둔 목록에서 의존성을 따라간다
    APT->>저장소: 필요한 .deb 를 달라
    저장소-->>APT: .deb 파일들
    APT->>dpkg: 기대는 대상(의존성)부터 차례로 넘긴다
    dpkg->>dpkg: 파일을 놓고 스크립트를 돌린다

apt 는 APT 를 부르는 명령 줄 도구입니다. 운영자가 치는 명령은 보통 이 두 줄입니다. 첫 줄은 저장소에서 패키지 목록을 새로 받습니다. 둘째 줄은 그 목록을 보고 설치합니다.

터미널
apt update         # 패키지 목록 새로 받음
apt install nginx  # 의존 패키지까지 설치

첫 줄을 건너뛰면 APT 는 예전에 받아 둔 목록을 봅니다. 그 사이 저장소에서 빠진 버전을 찾다가 내려받기에 실패할 수 있습니다.

브랜치 셋과 릴리스

Debian 은 저장소 안의 패키지를 세 묶음으로 나눠 굴립니다. 이 묶음을 브랜치라고 합니다. unstable, testing(시험판), stable(안정판)이 그 셋입니다. 새 패키지는 맨 앞 브랜치인 unstable 에 들어갑니다.

브랜치 무엇이 들어오나 누가 쓰나
unstable 개발자가 올린 패키지가 처음 들어옴 Debian 을 만드는 사람들
testing unstable 에서 검증을 지난 패키지 다음 stable 을 미리 써 보는 사람
stable 충분히 안정된 testing 이 번호를 받아 출시됨 서버를 굴리는 대부분의 사용자

unstable 에서 testing 으로 넘어가려면 조건이 있습니다. Debian 이 지원하는 모든 프로세서 종류에서 빌드돼야 합니다. 의존성 때문에 설치가 안 되는 일도 없어야 합니다. 출시를 막을 만큼 심각한 버그도, 지금 testing 에 있는 같은 패키지의 버전보다 많으면 안 됩니다.

testing 이 충분히 안정되면 프리즈(freeze)에 들어갑니다. 프리즈는 새 패키지를 더는 받지 않고 버그 수정만 받는 기간입니다. 버그가 받아들일 만큼 줄면 그 testing 이 번호를 달고 stable 로 나옵니다.

testing 이 이렇게 stable 로 한 번 나오는 것이 Debian 의 릴리스입니다. 릴리스마다 Debian 12, Debian 13 같은 번호가 붙습니다.

다음 릴리스가 나오면 앞의 stable 은 oldstable 로 물러납니다. oldstable 도 한동안 보안 수정을 받습니다. 덕분에 운영자는 새 릴리스가 나오자마자 올리지 않고 일정을 잡아 옮길 수 있습니다.

stateDiagram-v2
    state "프리즈된 testing" as frozen
    [*] --> testing: 다음 릴리스 준비 시작
    testing --> frozen: 프리즈 시작
    frozen --> stable: 번호를 받아 릴리스
    stable --> oldstable: 다음 릴리스가 나옴

그림은 패키지 하나가 아니라 testing 브랜치가 릴리스로 나오는 길을 보입니다. 패키지가 옮겨 가는 길은 unstable 에서 testing 까지입니다. 그 뒤로는 testing 이 통째로 stable 이 됩니다.

unstable 과 testing 은 늘 살아 있습니다. 프리즈된 testing 이 stable 이 되면 testing 은 다음 릴리스를 위해 다시 패키지를 받기 시작합니다.

코드명

릴리스마다 번호 말고 코드명이 붙습니다. 코드명은 지금까지 영화 「토이 스토리」의 등장인물에서 땄습니다. bookworm(12)·trixie(13)가 그런 예입니다. 개발 중에 번호가 정해지기 전부터 저장소 폴더 이름으로 쓰려고 붙입니다.

unstable 에는 언제나 sid 라는 코드명이 붙습니다. sid 는 영화에서 장난감을 부수던 옆집 아이입니다. unstable 은 그대로 출시되는 일이 없어서 이 이름이 영영 안 바뀝니다.

백엔드 개발자는 코드명을 주로 컨테이너 이미지 이름에서 만납니다. 언어 런타임 이미지가 Debian 을 바탕으로 하면 태그 끝에 그 Debian 릴리스의 코드명이 붙습니다. 예를 들어 python:3.12-bookworm 의 bookworm 은 Debian 12 의 코드명입니다. 같은 언어 버전이라도 코드명이 다르면 안에 든 라이브러리 버전이 다릅니다.

stable 이 옛 버전을 고집하는 까닭

stable 은 출시된 뒤에 프로그램 버전을 올리지 않습니다. 보안 구멍이나 심각한 버그가 나오면 그 수정만 골라 들입니다. 이때 쓰는 방법이 백포트입니다. 백포트는 새 버전에서 고친 코드를 옛 버전에 옮겨 붙이는 일입니다.

이렇게 하는 까닭은 업데이트가 서버를 깨지 않게 하려는 것입니다. 버전을 올리면 설정 형식이 바뀌거나 기능이 빠질 수 있습니다. 보안 수정만 받으면 매일 업데이트를 돌려도 같은 설정이 같은 결과를 냅니다.

대가는 낡은 버전입니다. stable 에 든 데이터베이스나 언어 런타임은 출시 시점의 버전에 묶입니다. 그 뒤에 나온 기능이 필요하면 다음 stable 을 기다리거나 다른 통로로 구해야 합니다.

Debian 릴리스 하나가 받는 지원 기간은 다섯 해입니다. 처음 세 해는 Debian 보안 팀이 전체를 지원합니다. 뒤의 두 해는 LTS(Long Term Support, 장기 지원)라는 별도 팀이 이어받습니다.

자유 소프트웨어 원칙과 저장소 구역

Debian 은 어떤 소프트웨어를 넣을지 기준을 문서로 정해 둡니다. 이 기준이 DFSG(Debian Free Software Guidelines, 데비안 자유 소프트웨어 지침)입니다. 누구나 자유롭게 쓰고 고치고 다시 나눠 줄 수 있어야 한다는 것이 뼈대입니다.

이 기준에 따라 브랜치 안의 패키지가 다시 구역으로 나뉩니다. stable 안에도, testing 안에도 아래 구역이 따로 있습니다. 서버의 APT 설정 파일에 어느 브랜치의 어느 구역까지 받을지 적습니다.

구역 담는 패키지
main DFSG 를 지키는 패키지. 이 구역만 공식 Debian 입니다
contrib 패키지 자신은 자유롭지만 자유롭지 않은 패키지에 기댐
non-free 쓰거나 나눠 줄 때 저작권 조건을 따져야 하는 패키지
non-free-firmware 하드웨어를 움직이는 펌웨어 중 자유롭지 않은 것

새 서버에서 무선랜 카드 같은 장치가 안 잡히면 대개 그 펌웨어가 main 밖에 있어서입니다. 구역을 하나 더 열어 주면 APT 가 그 패키지를 찾습니다.

Debian 계열

Debian 을 바탕으로 만든 배포판이 많습니다. Ubuntu 가 대표입니다. 이런 배포판은 Debian 의 패키지 형식과 dpkg, APT 를 함께 씁니다. 이 배포판들을 묶어 Debian 계열이라고 합니다.

앤서블은 여러 서버의 설정을 코드로 적어 한꺼번에 맞추는 도구입니다. 앤서블은 할 일마다 모듈이라는 부품을 골라 씁니다. 그중 apt 모듈은 APT 로 패키지를 까는 모듈이라 Debian 계열이면 어디서나 같은 방식으로 돕니다. 다른 패키지 형식을 쓰는 배포판에서는 다른 모듈을 써야 합니다.

관련 항목

Debian 이 속하는 상위 분류

운영체제 · Linux · 리눅스 배포판 · 자유 소프트웨어 · 오픈 소스

Debian 을 이루는 구성 요소

커널 · dpkg · APT · deb 패키지 · 유지관리 스크립트 · 셸 · systemd

Debian 을 바탕으로 만든 배포판

Ubuntu · Linux Mint · Raspberry Pi OS · Kali Linux

Debian 과 겨루는 배포판

Red Hat Enterprise Linux · Fedora · Alpine Linux · Arch Linux · openSUSE

Debian 패키지가 배포·전달되는 경로

저장소 · 미러 · 패키지 매니저 · 패키지 · 의존성

Debian 릴리스가 거치는 처리 단계

릴리스 주기 · 코드 프리즈 · 백포트 · 보안 패치 · LTS

Debian 위에서 서버를 굴리는 도구

Docker · 컨테이너 이미지 · 앤서블 · 서버 · 배포

다른 이름: debian · 데비안 · Debian GNU/Linux · 데비안 리눅스