オレオレ Debian アーカイブの作成

最終ゴール

オレオレ apt リポジトリにオレオレ deb パッケージを置いて,特定少人数に対して配布する.

今回のお題

標準インストールされている apt-ftparchive コマンドと,dupload パッケージを用いてオレオレ apt アーカイブを作成する方法を紹介する.

準備

Chapter 2. Debian Package Management を参考に作成する.以下を仮定する.

アーカイブ用の公開鍵暗号鍵の生成

$ ssh foo@www.example.com
$ gpg --gen-key
Please select what kind of key you want: DSA and Elgamal
What keysize do you want? (2048) 
Key is valid for? (0)
Real name: foo
Email address:
Comment: Debian Archive Key

パスフレーズは空にしておく.空にしていないと後で dupload でアップロードしたときにパスフレーズをリモートからでは入力できなくて失敗する.

この鍵の ID を取得しておく.

$ gpg -k
pub   1024D/6789ABCD 2010-04-07
uid                  foo (Debian Archive Key)

ここでは 6789ABCD が ID である.

アーカイブツリーの作成

Origin (アーカイブの作成者/管理者) が foo で Label (アーカイブの名称) が foo のアーカイブツリーを作成する.Origin, Label については http://www.isotton.com/software/debian/docs/repository-howto/repository-howto.html#release を参照.

$ cd /srv/www/example/debian
$ mkdir -p pool/main
$ mkdir -p dists/unstable/main/binary-i386
$ mkdir -p dists/unstable/main/source
$ vi dists/unstable/main/binary-i386/Release
Archive: unstable
Version: 4.0
Component: main
Origin: foo
Label: foo
Architecture: i386
$ vi dists/unstable/main/source/Release
Archive: unstable
Version: 4.0
Component: main
Origin: foo
Label: foo
Architecture: source
$ vi aptftp.conf
APT::FTPArchive::Release {
  Origin "foo";
  Label "foo";
  Suite "unstable";
  Codename "sid";
  Architectures "i386";
  Components "main";
  Description "Private archive for foo";
};
$ vi aptgenerate.conf
Dir::ArchiveDir ".";
Dir::CacheDir ".";
TreeDefault::Directory "pool/";
TreeDefault::SrcDirectory "pool/";
Default::Packages::Extensions ".deb";
Default::Packages::Compress ". gzip bzip2";
Default::Sources::Compress ". gzip bzip2";
Default::Contents::Compress "gzip bzip2";

BinDirectory "dists/unstable/main/binary-i386" {
  Packages "dists/unstable/main/binary-i386/Packages";
  Contents "dists/unstable/Contents-i386";
  SrcPackages "dists/unstable/main/source/Sources";
};

Tree "dists/unstable" {
  Sections "main";
  Architectures "i386 source";
};

なお,元記事では

Default::Sources::Compress "gzip bzip2";

となっていたが,これでは /etc/apt/sources.list に deb-src を指定したときに apt-get update でエラーになってしまうので上のように修正した.

アップロードの設定

手元のマシンでアップロードの設定を行う.

$ sudo aptitude install dupload
$ vi ~/.dupload.conf
package config;

$cfg{'foo'} = {
  fqdn => "www.example.com",
  method => "scpb",
  incoming => "/srv/www/example/debian/pool/main",
  # The dinstall on ftp-master sends emails itself
  dinstall_runs => 1,
};

$cfg{'foo'}{postupload}{'changes'} = "
  echo 'cd /srv/www/example/debian;
        apt-ftparchive generate -c=aptftp.conf aptgenerate.conf;
        apt-ftparchive release -c=aptftp.conf dists/unstable > dists/unstable/Release;
        rm -f dists/unstable/Release.gpg;
        gpg -u 6789ABCD -bao dists/unstable/Release.gpg dists/unstable/Release' |
  ssh foo@www.example.com  2>/dev/null;
  echo 'Package archive created!'";

アップロード

*.changes ファイルがあるディレクトリで下のようにする.

$ dupload --to foo .

apt

インストールするマシンの apt を設定する.リポジトリの公開鍵をインストールするマシンの鍵束に加える.

$ ssh foo@www.example.com gpg --export -a 6789ABCD | sudo apt-key add -

これで通常の操作をすればよい.

$ sudo aptitude update

問題点

このやりかただと,パッケージをバージョンアップしてアップロードすると,前のバージョンがそのままアーカイブに残るという問題点がある.この場合でもインストール時には最新バージョンがインストールされるが,apt-cache search や apt-cache show で複数のバージョンが表示されてしまい気持ち悪い.以下の記事を参照して新しい方法を試してみる方がいいかもしれない.