メモ:Debianレポジトリのフォーマット

これが公式ドキュメントっぽい。

RepositoryFormat - Debian Wiki

sources.listに指定するフォーマットと実際のURL

sources.listには以下のようなフォーマットで指定します。

deb uri distribution [component1] [component2] [...]

具体的には、たとえばUbuntu 16.04用のRのレポジトリだと、

deb https://cran.rstudio.com/bin/linux/ubuntu xenial/

のようになります(参考:UBUNTU PACKAGES FOR R

ここで、https://cran.rstudio.com/bin/linux/ubuntuはレポジトリのルートを示しています。それに続く部分は、レポジトリのルート/dists以下を示しています。

…って書いてあったから信じてたら、 https://cran.rstudio.com/bin/linux/ubuntu/dists なんていうディレクトリは存在しません。

???

ソースを読む

仕方ないからソースを読みます。

// IndexCopy::ConvertToSourceList - Convert a Path to a sourcelist   /*{{{*/
// ---------------------------------------------------------------------
/* We look for things in dists/ notation and convert them to 
   <dist> <component> form otherwise it is left alone. This also strips
   the CD path. 
 
   This implements a regex sort of like: 
    (.*)/dists/([^/]*)/(.*)/binary-* 
     ^          ^      ^- Component
     |          |-------- Distribution
     |------------------- Path
   
   It was deciced to use only a single word for dist (rather than say
   unstable/non-us) to increase the chance that each CD gets a single
   line in sources.list.
 */

(apt/indexcopy.cc at 349c5c89454ff344e4cf693492e7cb62ff549886 · Debian/apt · GitHub)

曰く、URIに続いて指定されるのが1つか2つ以上かによって実際のURLへの変換の仕方が違っていて、

deb http://example.com ubuntu main

http://example.com/dists/ubuntu/mainになるけど、

deb http://ubuntu.example.com main

http://ubuntu.example.com/dists/mainじゃなくてhttp://ubuntu.example.com/mainになる(distsを挟まない)ということです。分かりにくすぎる...

Flat Repository Format

とか言ってたら実はちゃんと下の方に載ってました。Flat Repository Formatというらしいです。

A flat repository does not use the dists hierarchy of directories, and instead places meta index and indices directly into the archive root (or some part below it) In sources.list syntax, a flat repository is specified like this:

deb uri directory/

奥が深い。

Release

Release/InReleaseはインデックスファイルの一覧です。aptコマンドはまずReleaseInReleaseをダウンロードします。

2つの違いは署名を含むか含まないかです。Releaseは署名を含まずRelease.gpgという別のファイルとセットになっています。InReleaseは署名を含んでいます。

たとえばこんな感じです。

Architectures: i386 amd64 all source
Codename: trusty
Components: main
Date: Fri, 10 Jun 2016 02:05:25 UTC
Description: R packages for Ubuntu Trusy Tahr 14.04
Label: CRAN
Origin: CRAN
Suite: trusty
Version: 14.04
MD5Sum:
 eb561ec6e89a989519fc418b67e6747a           984776 Packages
 d5297132500fdee185fc8cf2d36f8113           110749 Packages.bz2
 36ad5613ef84b83f397b4b48844b6a5f           174209 Packages.gz
 5ea40a65cc0683b8728e855f4ac0d2de           103935 Packages.lzma
 d41d8cd98f00b204e9800998ecf8427e                0 Release
 d6482e48d4cd6d84ac0a14f8f3d1fc45           310575 Sources
 dd3b2f7e789517eb446cbfe72443ae18            84525 Sources.bz2
 7414c84593a81c562cebb1ce32507249           100407 Sources.gz
 f3ab96df9a7e5e90c1ccadc23245b1a3            81775 Sources.lzma
SHA256:
(...snip...)

(https://cran.rstudio.com/bin/linux/ubuntu/trusty/Release)

ハッシュは、このレポジトリだとMD5SumSHA256SHA512の3種類があります。フォーマットはそれぞれ

ハッシュ値   サイズ   Releaseからの相対パス

となっています。

Packages/Sources

Packagesバイナリパッケージのリストです。こんな感じです。ここで注意するのはFilenameはさっきと違って、レポジトリのルートからの相対パスである点です。ややこしい。

Package: r-cran-matrix
Priority: optional
Section: gnu-r
Installed-Size: 4978
Maintainer: Dirk Eddelbuettel <...>
Architecture: i386
Source: rmatrix
Version: 1.2-0-1trusty0
Depends: libblas3 | libblas.so.3, libc6 (>= 2.7), liblapack3 | liblapack.so.3, r-base-core (>= 3.1.3-1trusty), r-cran-lattice (>= 0.12-11.1)
Filename: trusty/r-cran-matrix_1.2-0-1trusty0_i386.deb
Size: 2993940
MD5sum: 9a25ef9be0feb9310c255227a5de8f7e
SHA1: f3170a0e5fbd0ce8f6727721c03487c85ff5bc4c
SHA256: cfcbcc52bdff0c186e1eac4f750d5b9340f34b77f81f42160c176afe02364f36
SHA512: 7e28cc626aa13333940929bc9562a7ff51af2f756f71b98687e26f368b35a182c4e83000d140d9a78b396158e8bbce7050c7c047d58c1a764bc92f650d66d205
Description: GNU R package of classes for dense and sparse matrices
 This CRAN package provides S4 classes and methods for numerical
 linear algebra using dense or sparse matrices.  The sparse matrix
 implementation uses code from the LDL sparse matrix package and
 code from the Metis package of partitioning algorithms.

Package: r-cran-rjags
Priority: optional
Section: gnu-r
Installed-Size: 190
(...snip...)

(https://cloud.r-project.org/bin/linux/ubuntu/trusty/Packages)

Source

Sourceはソースパッケージのリストです。さっきと似たような雰囲気なんですが、とりあえずファイルパスが違います。レポジトリのルートからなのはそうなんですが、Directory + Filesという2つのフィールドに分かれています。

(...snip...)
Directory: trusty
Files:
 903faf98ccd4b6cbcce3bb2d600e918b 1546 ess_15.03-1-2trusty1.dsc
 adff0c94ee7d16c8e0afaba45f12c1c7 2116995 ess_15.03-1.orig.tar.gz
 5b0c3a7ad1400971eafbbcf0c68bf258 9348 ess_15.03-1-2trusty1.diff.gz
(...snip...)

Contents

Contentsは、どのファイルがどのパッケージに含まれるかを示すものらしいです。こんな感じでした。

(...snip...)
FILE                                                    LOCATION
bin/arc_summary.py                                      contrib/admin/zfsutils-linux
bin/arcstat.py                                          contrib/admin/zfsutils-linux
bin/dbufstat.py                                         contrib/admin/zfsutils-linux
etc/X11/Xsession.d/98vboxadd-xclient                    contrib/x11/virtualbox-guest-x11
etc/apparmor.d/torbrowser.Browser.firefox               contrib/python/torbrowser-launcher
(...snip...)

(http://ftp.cz.debian.org/debian/dists/testing/contrib/Contents-amd64.gz)

Translation

Translationは各ロケールでのパッケージの説明を記したファイルです。

Translation-(ロケール名)のようになっていて、例えばUbuntuTranslation-jaはこんな感じです。Translationなんだから英語を素のまま使ってたらいらないでしょ、と思ったらそんなことはなくてTranslation-enがダウンロードされます。(Acquire::Languages "none";を指定しておけば大丈夫らしいですけど)

Package: acct
Description-md5: b24f45ef7d67937aa65ecb8e36a7e5a1
Description-ja: アカウントの処理およびログイン用 GNU アカウントユーティリティ
 GNU Acconting ユーティリティはユーザ接続時間やプロセス実行統計に関するデータの 報告および集計を行うユーティリティ集です。
 .
 "Login acconting" は接続時間に基づくシステムリソース利用量を集計し、 "process accounting"
 はシステム上で実行されたコマンドに基づく集計を行います。
 .
 'last' コマンドは sysvinit パッケージにより提供されるため、本パッケージには 含まれません。

(...snip...)

(http://archive.ubuntu.com/ubuntu/dists/xenial/main/i18n/Translation-ja)

圧縮形式

Unless a compression is indicated by the filename of the indices below, and index may be compressed in one or multiple of the following formats:

  • No compression (no extension)
  • Gzip (.gz extension)
  • Bzip2 (.bz2 extension)

Some clients may also support other compression formats, such as:

  • LZMA (.lzma extension)
  • XZ (.xz extension)
  • LZIP (.lz extension)

Servers should have at least one of uncompressed, gzipped or bzip2ed indices and clients should support at least .gz, .bz2 and .xz.

ややこしいですが、

  • サーバ側: 最低でも、無圧縮、Gzip、Bzip2のうち一つはサポート
  • クライアント: 最低でも、Gzip、Bzip、XYはサポート

ということみたいです。

.diff

っていうのがあるらしいです。力尽きたのでこれ以上はメモりません。

感想

けっきょくこれが公式ドキュメントなのかよく分からなかった…。もっとちゃんとプロトコルを定めてほしいです。