markdown # Debian 리포지터리

이 가이드에서는 다음을 설명합니다:

  1. Debian 패키지 구조의 기본 개요
  2. Debian 패키지 관리에 사용되는 패키지 관리자, 클라이언트 및 도구
  3. GitLab Debian 리포지터리의 작동 방식

Debian 패키지 기본 사항

Debian 패키지에는 바이너리와 소스 두 가지 유형이 있습니다.

  • 바이너리 - 일반적으로 .deb 파일이며 실행 파일, 구성 파일 및 기타 데이터를 포함합니다. 바이너리 패키지는 이미 컴파일되어 있기 때문에 해당 OS 또는 아키텍처와 일치해야 합니다. 이러한 패키지는 일반적으로 dpkg를 사용하여 설치됩니다. 바이너리 패키지를 설치할 때 시스템에 의존성이 이미 있어야 합니다.
  • 소스 - 일반적으로 .dsc 파일 및 압축된 .tar 파일로 구성됩니다. 소스 패키지는 시스템에서 컴파일될 수 있습니다.

패키지는 apt를 사용하여 가져오고 dpkg를 사용하여 설치됩니다. apt를 사용하면 의존성도 가져와서 설치합니다.

.deb 파일은 <PackageName>_<VersionNumber>-<DebianRevisionNumber>_<DebianArchitecture>.deb와 같은 명명 규칙을 따릅니다.

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

.changes 파일은 패키지의 업데이트를 처리하는 방법을 Debian 리포지터리에 알려주는 데 사용됩니다. 패키지에 대한 아키텍처, 배포 및 버전을 포함하여 다양한 메타데이터가 포함되어 있습니다. 또한 sha1, sha256, md5의 세 가지 체크섬 디렉터리이 Files 섹션에 포함되어 있습니다. 이러한 파일이 어떻게 구성되는지에 대한 예시는 sample_1.2.3~alpha2_amd64.changes를 참조하십시오.

Debian 패키지를 다운로드하는 방법

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

Debian 패키지를 게시하는 방법

작업 중인 Debian 리포지터리 유형에 따라 패키지를 게시하는 데 curl을 사용하는 것이 일반적이지만, 관련 파일을 .changes 파일을 기반으로 업로드하는 데 가장 좋은 도구는 dput-ng입니다.

이 분산 업무는 무엇입니까?

Debian의 경우 패키지는 그 자체만으로 존재하지 않습니다. 이들은 _분산_에 속합니다. 이것은 많은 것을 의미할 수 있지만, 주목할 주요 사항은 사용자가 분산을 명시해야 한다는 것입니다.

Debian Repository가 어떻게 생겼습니까?

  • Debian 리포지터리는 많은 릴리스로 구성됩니다.
  • 각 릴리스에는 안정적인 코드명이 지정됩니다. 공개 Debian 리포지터리의 경우 “bullseye” 및 “jessie”와 같은 이름입니다.
    • 스위트이라는 개념도 있으며, 이것은 “stable” 및 “edge”와 같은 릴리스 채널의 동의어인 _코드명_입니다. 시간이 지남에 따라 변화하며 다른 _코드명_을 가리킵니다.
  • 각 릴리스에는 “main”, “contrib”, “non-free”와 같은 많은 컴포넌트가 있습니다. 공개 리포지터리에서는 “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 리포지터리의 역할

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

GPG 키 및 서명된 릴리스란 무엇입니까?

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

우리는 Debian 패키지의 릴리스 파일에 서명하기 위해 GPG를 사용합니다. 릴리스 파일은 특정 분산 내의 모든 패키지와 해당하는 다이제스트에 대한 인덱스입니다.

GitLab Debian 레지스트리에서는 사용자가 Debian 리포지터리에 새 패키지를 게시할 때 마다 새 릴리스 파일이 생성됩니다. 각 분산에 대해 새 GPG 키가 생성됩니다. 사용자는 해당 분산에 대한 릴리스와 해당 공개 GPG 키를 요청하여 해당 릴리스 파일의 신뢰성을 확인할 수 있습니다.

GitLab 리포지터리 내부

파일 업로드가 발생하면:

  1. 새 “incoming” 패키지 레코드가 찾아지거나 생성됩니다. 모든 새 파일은 “incoming” 패키지에 할당됩니다. 이것은 실제로 어떤 패키지에 파일이 연관되는지 아직 모르기 때문에 사용하는 보유 영역입니다.
  2. 새 “unknown” 파일이 저장됩니다. 이 파일은 해당 파일이 기존 패키지에 속하는지 아닌지 아직 모르기 때문에 “unknown” 상태입니다.

파일이 어떤 패키지에 속하는지 알게 되면 해당 파일이 해당 패키지와 연결되며 더 이상 파일이 남지 않으면 “incoming” 패키지가 제거됩니다. 파일의 “unknown” 상태가 올바른 파일 유형으로 업데이트됩니다.

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

  1. .changes 파일이 구문 분석되고 해당되는 파일이 업데이트됩니다. 모든 업로드된 .changes 파일이 올바른 분산 및 패키지와 연결됩니다.
  2. ::Packages::Debian::GenerateDistributionWorker 및 이에 준하는 ::Packages::Debian::GenerateDistributionService가 실행됩니다.
    1. 컴포넌트 파일이 생성 또는 업데이트됩니다. .changes 파일에 나열된 패키지 파일을 방금 업데이트했으므로 변경된 체크섬 값을 기반으로 컴포넌트/아키텍처 파일을 확인합니다.
    2. 새 릴리스가 생성됩니다:
      1. 분산에 대해 새 GPG 키가 생성됩니다(분산에 대해 이미 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: 메타데이터 파일 파싱 완료 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 백그라운드 작업:

```mermaid sequenceDiagram autonumber GenerateDistributionWorker-»+GenerateDistributionService: 분산 생성 GenerateDistributionService-»+GenerateDistributionService:

배포

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