Debian 저장소

이 안내서에서는 다음을 설명합니다.

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

데비안 패키지 기본 사항

데비안 패키지에는 바이너리 및 소스 두 가지 유형이 있습니다.

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

패키지는 apt로 가져와서 dpkg로 설치됩니다. apt를 사용하면 종속성도 가져와서 설치합니다.

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

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

.changes 파일은 데비안 저장소에게 패키지 업데이트를 처리하는 방법을 알려줍니다. 이 파일에는 아키텍처, 배포 및 버전과 같은 패키지에 대한 다양한 메타데이터가 포함되어 있습니다. 또한 메타데이터 외에도 sha1, sha256, 및 md5Files 섹션에 포함합니다. 이 파일이 어떻게 구조화되어 있는지 예시를 보려면 sample_1.2.3~alpha2_amd64.changes를 참조하십시오.

사람들은 어떻게 데비안 패키지를 얻을까요?

.deb 파일을 다운로드하여 dpkg로 설치할 수 있지만, 대부분의 사용자는 apt-get을 사용하여 apt를 통해 데비안 패키지를 소비합니다. aptdpkg를 포함하여 종속성 관리와 컴파일을 추가합니다.

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

작업 중인 데비안 저장소의 유형에 따라 패키지를 게시하기 위해 curl을 사용하는 것은 흔한 일이 아닙니다. 그러나 .changes 파일을 기반으로 관련 파일을 업로드하는 최상의 도구는 dput-ng를 사용하는 것이 가장 좋습니다.

이런 배포(distribution) 일이 뭔가요?

데비안의 경우, 패키지는 독자적으로 존재하지 않습니다. 이들은 _배포(distribution)_에 속합니다. 이것은 여러 가지를 의미할 수 있지만, 주목해야 할 주요한 점은 사용자가 배포를 지정하는 것에 익숙하다는 것입니다.

데비안 저장소는 어떻게 보이나요?

  • 데비안 저장소는 여러 릴리즈로 이루어져 있습니다.
  • 각 릴리스에는 안정한 코드명이 지정됩니다. 공개 데비안 저장소의 경우 “bullseye” 및 “jessie”와 같은 이름이 지정됩니다.
    • 스위트라는 개념도 있으며, 이들은 기본적으로 “stable” 및 “edge”와 같은 릴리스 채널과 유사한 별칭입니다. 시간이 지남에 따라 변화하며 다른 _코드명_을 가리킵니다.
  • 각 릴리스에는 여러 컴포넌트가 있습니다. 공개 저장소의 경우 “main”, “contrib”, “non-free”가 있습니다.
  • 각 릴리스에는 “amd64”, “arm64”, 또는 “i386”와 같은 많은 아키텍처가 있습니다.
  • 각 릴리스에는 서명된 릴리스 파일이 있습니다(아래 GPG 키에 대해 설명 참조)

표준 디렉토리 기반 데비안 저장소는 다음과 같이 구성됩니다:

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

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

GitLab 데비안 저장소에서는 특정 파일 디렉토리를 처리하지 않습니다. 대신 코드와 기본 PostgreSQL 데이터베이스를 사용하여 이러한 다양한 요소 간의 관계를 조직합니다(구조.md#debi-패키지 참조).

Debian Repository가 하는 일은 무엇인가요?

물체 저장소가 존재하기 전에 데비안 커뮤니티는 많은 소프트웨어 저장소 시스템을 만들었고, FTP를 사용하여 아티팩트를 원격 서버에 업로드했습니다. 현재의 대부분의 소프트웨어 저장소와 레지스트리는 단순히 서버 어딘가의 디렉토리일 뿐입니다. 공식 데비안 배포에 추가된 패키지는 오픈 소스 유지보수자 그룹이 관리하는 중앙 공개 저장소에 있습니다. 패키지 유지보수자들은 릴리즈 파일을 생성하고 기타 유지관리 작업을 수행하기 위해 데비안 아카이브 키트 또는 dak 스크립트를 사용합니다. 따라서 파일을 저장하고 제공하는 것 외에도 완전한 데비안 저장소는 dak이 제공하는 동일한 행동을 수행해야 합니다. 이러한 행동이 GitLab 데비안 레지스트리가 하고자 하는 것입니다.

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

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

우리는 데비안 패키지의 릴리즈 파일에 GPG로 서명하기 위해 GPG를 사용합니다. 릴리즈 파일은 주어진 배포 내의 모든 패키지와 각각의 다이제스트에 대한 색인입니다.

GitLab 데비안 레지스트리에서 사용자가 새로운 패키지를 게시할 때마다 백그라운드 프로세스가 새 릴리즈 파일을 생성합니다. 각 배포별로 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 키가 생성됩니다(해당 배포에 대해 아직 존재하지 않은 경우)
      2. 릴리즈 파일이 씌여진 후 GPG 키로 서명되고 저장됩니다.
    3. 이전 컴포넌트 파일은 삭제됩니다.

다음 세 가지 다이어그램은 데비안 API에 파일을 업로드한 후 경로를 보여줍니다:

sequenceDiagram autonumber actor 클라이언트 클라이언트->>+DebianProjectPackages: PUT projects/:id/packages/debian/:file_name 노트 DebianProjectPackages: `.changes` 파일 또는 배포 매개변수가 있는 경우 DebianProjectPackages->>+CreateTemporaryPackageService: 임시 패키지 생성 노트 DebianProjectPackages: 그렇지 않은 경우 DebianProjectPackages->>+FindOrCreateIncomingService: "incoming" 패키지 생성 노트 DebianProjectPackages: 마지막으로 DebianProjectPackages->>+CreatePackageFileService: "unknown" 파일 생성 노트 CreatePackageFileService: `.changes` 파일 또는 배포 매개변수가 있는 경우 CreatePackageFileService->>+ProcessPackageFileWorker: 파일 처리를 위한 워커 스케줄링 DebianProjectPackages->>+클라이언트: 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: 문자열을 데비안 RFC822 제어 데이터 형식으로 파싱 ExtractDebMetadataService-->>-ExtractMetadataService: 파싱된 제어 파일 반환 ExtractMetadataService->>+ParseDebian822Service: .dsc, .changes 또는 buildinfo 인 경우 ParseDebian822Service-->>-ExtractMetadataService: 데비안 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: 문자열을 데비안 RFC822 제어 데이터 형식으로 파싱 ExtractDebMetadataService-->>-ExtractMetadataService: 파싱된 제어 파일 반환 ExtractMetadataService->>+ParseDebian822Service: .dsc, .changes 또는 buildinfo 인 경우 ParseDebian822Service-->>-ExtractMetadataService: 데비안 RFC822 제어 데이터 형식으로 문자열 파싱 ExtractMetadataService-->>-ProcessPackageFileService: 파싱된 메타데이터를 사용하여 "unknown" (또는 알려진) 파일 업데이트 end ProcessPackageFileService->>+GenerateDistributionWorker: 배포 찾기 및 서비스 시작 GenerateDistributionWorker->>+GenerateDistributionService: 배포 생성

GenerateDistributionWorker 백그라운드 작업:

sequenceDiagram autonumber GenerateDistributionWorker->>+GenerateDistributionService: 배포 생성 GenerateDistributionService->>+GenerateDistributionService: 새 아키텍처에 기반하여 컴포넌트 파일 생성 또는 업데이트 GenerateDistributionService->>+GenerateDistributionKeyService: 해당 배포용 GPG 키 생성 GenerateDistributionKeyService-->>-GenerateDistributionService: GPG 키 GenerateDistributionService-->>-GenerateDistributionService: 배포 파일 생성 GenerateDistributionService->>+SignDistributionService: GPG 키로 서명된 릴리스 파일 SignDistributionService-->>-GenerateDistributionService: 서명된 릴리스 파일 저장 GenerateDistributionService->>+GenerateDistributionService: 더 이상 사용되지 않는 컴포넌트 파일 삭제

배포

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