Debian Repository

이 안내서에서는 다음과 같은 내용에 대해 설명합니다.

  1. Debian 패키지의 기본 구조 개요
  2. Debian 패키지를 관리하는 데 사용되는 패키지 관리자, 클라이언트 및 도구
  3. GitLab Debian 저장소의 작동 방식

Debian 패키지 기본 사항

Debian 패키지에는 이진 및 소스 두 가지 유형이 있습니다.

  • 이진 - 이것들은 보통 .deb 파일이며 실행 파일, 구성 파일 및 기타 데이터를 포함합니다. 이진 패키지는 이미 컴파일되어 있기 때문에 OS나 아키텍처와 일치해야 합니다. 이러한 패키지는 보통 dpkg를 사용하여 설치됩니다. 이진 패키지를 설치할 때 시스템에 종속성이 이미 존재해야 합니다.
  • 소스 - 이러한 패키지는 보통 .dsc 파일과 압축된 .tar 파일로 구성됩니다. 소스 패키지는 시스템에서 컴파일될 수 있습니다.

패키지는 apt를 사용하여 가져오고 dpkg를 사용하여 설치합니다. apt를 사용하면 종속성이 함께 가져와 설치됩니다.

.deb 파일은 <패키지 이름>_<버전 번호>-<데비안 리비전 번호>_<데비안 아키텍처>.deb의 명명 규칙을 따릅니다.

이에는 패키지에 대한 메타데이터를 포함하는 control 파일이 포함되어 있습니다. dpkg --info <deb_파일> 명령을 사용하여 제어 파일을 볼 수 있습니다.

.changes 파일은 데비안 저장소에게 패키지의 업데이트 처리 방법을 알려줍니다. 이 파일에는 아키텍처, 배포 및 버전을 포함하여 패키지에 대한 다양한 메타데이터가 포함되어 있습니다. 또한 해당 메타데이터에는 sha1, sha256md5의 세 가지 체크섬 목록이 Files 섹션에 포함되어 있습니다. 이러한 파일이 구조화된 예시를 확인하려면 sample_1.2.3~alpha2_amd64.changes를 참조하십시오.

사람들은 어떻게 Debian 패키지를 얻나요?

.deb 파일을 다운로드하여 dpkg를 사용하여 설치할 수 있지만, 대부분의 사용자는 apt-get을 사용하여 apt를 통해 Debian 패키지를 소비합니다. apt는 의존성 관리 및 컴파일을 추가하여 dpkg를 래핑합니다.

사람들은 어떻게 Debian 패키지를 게시하나요?

Debian 저장소 유형에 따라 패키지를 게시하기 위해 curl을 사용하는 것은 흔하지 않지만, 해당 유형에 따라 게시하기 위해 dput-ng을 사용하는 것이 가장 좋습니다. 이는 .changes 파일을 기반으로 관련 파일을 업로드합니다.

모든 이 배포 관련 사항은 무엇인가요?

Debian의 경우 패키지는 독자적으로 존재하지 않습니다. 그것들은 배포에 속합니다. 이는 여러 가지를 의미할 수 있지만, 주목할 주요 사항은 사용자가 배포를 지정하는 데 익숙하다는 것입니다.

Debian Repository는 어떻게 생겼나요?

  • Debian 저장소는 많은 릴리스로 구성됩니다.
  • 각 릴리스에는 안정한 코드명이 지정됩니다. 공개 Debian 저장소의 경우 “bullseye” 및 “jessie”와 같은 이름을 가집니다.
    • 이외에도 수트의 개념이 있습니다. 이것은 “stable” 및 “edge”와 같은 릴리스 채널에 대한 동의어인 코드명과 관련이 있습니다. 시간이 지남에 따라 이것들은 변경되어 서로 다른 _코드명_을 가리키게 됩니다.
  • 각 릴리스에는 여러 컴포넌트가 있습니다. 공개 저장소의 경우 “main”, “contrib”, “non-free”를 포함합니다.
  • 각 릴리스에는 “amd64”, “arm64”, 또는 “i386”와 같은 여러 아키텍처가 있습니다.
  • 각 릴리스에는 서명된 릴리스 파일이 있습니다(아래의 GPG 키는 무엇이며 서명된 릴리스는 무엇인가요?에 대한 내용 참조).

표준 디렉토리 기반 Debian 저장소는 다음과 같이 구성됩니다.

dists\
      |--jessie/
      |--bullseye\
                  |Changelog
                  |Release
                  |InRelease
                  |Release.gpg
                  |--main\
                          |--amd64\
                          |--arm64\
                  |--contrib\
                  |--non-free\
pool\
     |--모든 릴리스의 .deb 파일이 있는 위치

공개 Debian 저장소에서 전체 디렉토리 구조, 릴리스 파일, GPG 키 및 기타 파일은 Debian Archive Kit 또는 dak이라고 불리는 일련의 스크립트에 의해 생성됩니다.

GitLab Debian 저장소에서는 특정 파일 디렉터리를 다루지 않고, 코드 및 기본 PostgreSQL 데이터베이스를 사용하여 이러한 다양한 요소 간의 관계를 조직합니다.

Debian Repository는 무엇을 하는가요?

Debian 커뮤니티는 현재의 패키지 저장소 및 레지스트리 대부분이 어딘가의 서버 디렉터리일 뿐이며, 객체 저장소와 같은 것들이 존재하기 전에 FTP를 사용하여 원격 서버로 아티팩트를 업로드했던 때에 많은 패키지 저장소 시스템을 만들었습니다. 공식 Debian 배포판에 추가된 패키지는 일련의 오픈 소스 유지 관리자 그룹이 유지하는 중앙 공개 저장소에 존재합니다. 패키지 유지자들은 릴리스 파일을 생성하고 다른 유지 관리 작업을 수행하기 위해 Debian Archive Kit 또는 dak 스크립트를 사용합니다. 따라서 파일을 저장 및 제공하는 것뿐만 아니라, 완전한 Debian 저장소는 dak이 제공하는 동일한 동작을 수행해야 합니다. 이러한 동작은 GitLab Debian 레지스트리가 목표로 하는 것입니다.

GPG 키는 무엇이고, 무엇이 서명된 릴리스인가요?

GPG 키는 안전한 데이터 전송을 위한 공개/개인 키 쌍입니다. SSH 키와 유사하게, 개인 및 공개 키가 있습니다. 누구든지 _공개 키를 가지고 있으면 데이터를 암호화_할 수 있고, 누구든지 _개인 키를 가지고 있으면 공개 키를 사용하여 암호화된 데이터를 해독_할 수 있습니다. GPG 키는 데이터를 서명하는 데도 사용할 수 있습니다. 개인 키를 가지고 있는 사람은 데이터나 파일에 서명할 수 있고, 공개 키를 가지고 있는 사람은 해당 서명을 확인하고 해당 서명이 해당 개인 키를 가진 사람에 의해 생성되었음을 신뢰할 수 있습니다.

우리는 GPG를 사용하여 Debian 패키지의 릴리스 파일에 서명합니다. 릴리스 파일은 특정 배급판 내의 모든 패키지 및 해당 패키지의 다이제스트에 대한 색인입니다.

GitLab Debian 레지스트리에서는 사용자가 새로운 패키지를 Debian 저장소에 게시할 때마다 백그라운드 프로세스가 새로운 릴리스 파일을 생성합니다. 각 배포에 대해 새로운 GPG 키가 생성됩니다. 사용자가 해당 배포에 대한 릴리스를 요청하면 서명된 버전과 해당 릴리스 파일의 진위를 확인하기 위해 공개 GPG 키를 요청할 수 있습니다.

GitLab 저장소 내부

파일 업로드가 발생할 때:

  1. 새로운 “들어오는(incoming)” 패키지 레코드가 발견되거나 생성됩니다. 모든 새 파일은 “들어오는(incoming)” 패키지에 할당됩니다. 이것은 파일이 실제로 어떤 패키지와 관련이 있는지 알 때까지 사용되는 보류 영역입니다.
  2. 새로운 “알 수 없는(unknown)” 파일이 저장됩니다. 이 파일은 해당 파일이 기존 패키지에 속하는지 여부를 아직 알지 못하기 때문에 알 수 없는 상태입니다.

파일이 어떤 패키지에 속하는지 알게 되면 해당 패키지에 연결되고, “들어오는(incoming)” 패키지는 더 이상 파일이 남아 있지 않으면 제거됩니다. 파일의 “알 수 없음” 상태는 올바른 파일 유형으로 업데이트됩니다.

그 다음, 파일이 .changes 형식인 경우:

  1. .changes 파일이 구문 분석되고 그 안에 나열된 파일이 업데이트됩니다. .changes가 아닌 파일은 올바르게 다양한 배포 및 패키지에 연결됩니다.
  2. ::Packages::Debian::GenerateDistributionWorker 및 이에 따라 ::Packages::Debian::GenerateDistributionService가 실행됩니다.
    1. 구성 파일이 생성되거나 업데이트됩니다. .changes 파일에 나열된 패키지 파일을 방금 업데이트했으므로 변경된 체크섬 값을 기반으로 구성/아키텍처 파일을 확인합니다.
    2. 새 릴리스가 생성됩니다:
      1. 해당 배포를 위한 새 GPG 키가 생성됩니다. 이미 해당 배포를 위해 존재하지 않는 경우
      2. 릴리스 파일이 작성되고, GPG 키로 서명된 후 저장됩니다.
    3. 이전 구성 파일이 파기됩니다.

다음 세 가지 다이어그램은 Debian API에 파일을 업로드한 후에 따르는 경로를 보여줍니다:

sequenceDiagram autonumber actor Client Client->>+DebianProjectPackages: PUT projects/:id/packages/debian/:file_name Note over DebianProjectPackages: 만약 `.changes` 파일 또는 배포 파라미터가 있는 경우 DebianProjectPackages->>+CreateTemporaryPackageService: 임시 패키지 생성 Note over DebianProjectPackages: 그렇지 않다면 DebianProjectPackages->>+FindOrCreateIncomingService: "들어오는(incoming)" 패키지 생성 Note over DebianProjectPackages: 마지막으로 DebianProjectPackages->>+CreatePackageFileService: "알 수 없는(unknown)" 파일 생성 Note over CreatePackageFileService: `.changes` 파일 또는 배포 파라미터가 있는 경우 CreatePackageFileService->>+ProcessPackageFileWorker: 파일 처리를 위한 작업 예약 DebianProjectPackages->>+Client: 202 Created ProcessPackageFileWorker->>+ProcessPackageFileService: 서비스 시작

ProcessPackageFileWorker 백그라운드 작업:

sequenceDiagram autonumber ProcessPackageFileWorker->>+ProcessPackageFileService: 서비스 시작 ProcessPackageFileService->>+ExtractChangesMetadataService: 변경 내용 메타데이터 추출 ExtractChangesMetadataService->>+ExtractMetadataService: 파일 메타데이터 추출 ExtractMetadataService->>+ParseDebian822Service: `dpkg --field` 실행하여 제어 파일 가져오기 ExtractMetadataService->>+ExtractDebMetadataService: 만약 .deb, .udeb, 또는 ddeb인 경우 ExtractDebMetadataService->>+ParseDebian822Service: `dpkg --field` 실행하여 제어 파일 가져오기 ParseDebian822Service-->>-ExtractDebMetadataService: 문자열을 Debian RFC822 제어 데이터 형식으로 구문 분석 ExtractDebMetadataService-->>-ExtractMetadataService: 구문 분석된 제어 파일 반환 ExtractMetadataService->>+ParseDebian822Service: 만약 .dsc, .changes, 또는 buildinfo인 경우 ParseDebian822Service-->>-ExtractMetadataService: 문자열을 Debian RFC822 제어 데이터 형식으로 구문 분석 ExtractMetadataService-->>-ExtractChangesMetadataService: 메타데이터 파일 구문 분석 ExtractChangesMetadataService-->>-ProcessPackageFileService: .changes 파일에서 파일 및 해시 목록 반환 loop .changes에 나열된 파일 처리 ProcessPackageFileService->>+ExtractMetadataService: 파일 처리 ExtractMetadataService->>+ParseDebian822Service: `dpkg --field` 실행하여 제어 파일 가져오기 ExtractMetadataService->>+ExtractDebMetadataService: 만약 .deb, .udeb, 또는 ddeb인 경우 ExtractDebMetadataService->>+ParseDebian822Service: `dpkg --field` 실행하여 제어 파일 가져오기 ParseDebian822Service-->>-ExtractDebMetadataService: 문자열을 Debian RFC822 제어 데이터 형식으로 구문 분석 ExtractDebMetadataService-->>-ExtractMetadataService: 구문 분석된 제어 파일 반환 ExtractMetadataService->>+ParseDebian822Service: 만약 .dsc, .changes, 또는 buildinfo인 경우 ParseDebian822Service-->>-ExtractMetadataService: 문자열을 Debian RFC822 제어 데이터 형식으로 구문 분석 ExtractMetadataService-->>-ProcessPackageFileService: 구문 분석된 메타데이터를 사용하여 "알 수 없는(unknown)" (또는 알려진) 파일 업데이트 end ProcessPackageFileService->>+GenerateDistributionWorker: 배포 찾기 및 서비스 시작 GenerateDistributionWorker->>+GenerateDistributionService: 배포 생성

GenerateDistributionWorker 백그라운드 작업:

sequenceDiagram autonumber GenerateDistributionWorker->>+GenerateDistributionService: 배포 생성 GenerateDistributionService->>+GenerateDistributionService: `.changes`에서의 새로운 아키텍처에 기반한 구성 파일 생성 및 업데이트 GenerateDistributionService->>+GenerateDistributionKeyService: 배포용 GPG 키 생성 GenerateDistributionKeyService-->>-GenerateDistributionService: GPG 키 GenerateDistributionService-->>-GenerateDistributionService: 배포 파일 생성 GenerateDistributionService->>+SignDistributionService: GPG 키로 릴리스 파일 서명 SignDistributionService-->>-GenerateDistributionService: 서명된 릴리스 파일 저장 GenerateDistributionService->>+GenerateDistributionService: 더 이상 사용되지 않는 구성 파일 파기

배포

패키지를 게시하려면 먼저 해당 패키지를 배포해야 합니다. 프로젝트 또는 그룹 배포 API를 사용하여 배포를 생성하거나 업데이트할 때, 데이터베이스에 초기 백업 레코드를 만드는 것 외에도 위의 순서 다이어그램에 표시된 대로 GenerateDistributionService가 실행됩니다.