Arch のパッケージのリポジトリを作る

Arch には公式のリポジトリとして core, extra, community, testing 等があるが、それ以外に非公式なものもいくつかある。 その中でも特に archlinuxfr は有名だと思う。linux-pae, linux-pf, repo-ck といったパッチをあてたカーネルのパッケージを提供しているリポジトリを利用している人もいるかもしれない。 そういった非公式リポジトリは wiki にまとまっている: Unofficial User Repositories - ArchWiki

自分も自分用に独自のリポジトリを作ってみたので、その手順を紹介する。 パッケージを作るための PKGBUILD は既に書いてあるとする。

ビルド環境の準備

まずビルド用のユーザ archbuild を作った。 ビルド用のツールは devtools というパッケージにまとまっているので、pacman -S devtools でインストールしておく。 archbuild は一部 root になる必要があるので、visudo で /usr/sbin/makechrootpkg を NOPASSWD で許可しておく。 必要に応じて /usr/bin/rsync も許可しておく。

パッケージを作るとき、パッケージを作っているマシンの環境に依存することは避けたい。 そのために、devtools の中に適当なディレクトリをルートとして Arch の環境を作ってそこに chroot してビルドするツールがある。 手順も wiki に書いてある: DeveloperWiki:Building in a Clean Chroot - ArchWiki

また、x86_64 な1台のマシンで i686 のパッケージも一緒に作りたい。 なので、自分は ~/chroot-x68_64 と ~/chroot-i686 の2つのディレクトリを用意し、それぞれに対して wiki の解説にあるように

sudo mkarchroot ~archbuild/chroot-x86_64/root base base-devel sudo
sudo setarch i686 mkarchroot ~archbuild/chroot-i686/root base base-devel sudo

とした。 そうしてから、それぞれの pacman.conf と makepkg.conf を編集した。 少なくとも makepkg.conf の PACKAGER は書いておくといいと思う。

ビルド

chroot してビルドするには makechrootpkg を使う。 ビルドの前に、chroot 環境のパッケージの状態を最新にするために

sudo arch-nspawn ~archbuild/chroot-x86_64/root pacman -Syu
sudo arch-nspawn ~archbuild/chroot-i686/root pacman -Syu

としておく。 そして PKGBUILD のあるディレクトリにいって

sudo makechrootpkg -c -u -r ~/chroot-x86_64/root
sudo setarch i686 makechrootpkg -c -u -r ~/chroot-i686/root

とすれば、カレントディレクトリに各アーキテクチャ用のパッケージができあがる。

公開

自分は HTTP サーバとして nginx を利用し、ディレクトリ構成は jaist のを真似た。 まず作ったパッケージはすべて ~/pool というディレクトリに置く。 そして、~/public/myrepo/os/{i686,x86_64} というディレクトリに、~/pool にあるパッケージへの symlink を置く。 nginx では root として ~/public を指定しておく。 最後に、repo-add を使ってパッケージをデータベースに登録する。 そうすると、利用者側は /etc/pacman.conf に

[myrepo]
Server = http://example.com/$repo/os/$arch

みたいに書けば利用できるようになる。

以上の公開手順をまとめて、以下のようなスクリプトを使っている。

PKG=$1
REPO=myrepo
POOL=$HOME/pool
PUBLIC_I686=$HOME/public/$REPO/os/i686
PUBLIC_X86_64=$HOME/public/$REPO/os/x86_64

i686() {
  ln -s $POOL/$1 $PUBLIC_I686
  repo-add $PUBLIC_I686/$REPO.db.tar.gz $POOL/$1
}

x86_64() {
  ln -s $POOL/$1 $PUBLIC_X86_64
  repo-add $PUBLIC_X86_64/$REPO.db.tar.gz $POOL/$1
}

cp $PKG $POOL
case $PKG in
  *-any.pkg.tar.xz)
    i686 $PKG
    x86_64 $PKG
    ;;
  *-i686.pkg.tar.xz)
    i686 $PKG
    ;;
  *-x86_64.pkg.tar.xz)
    x86_64 $PKG
    ;;
esac

補足

自分用にビルドするパッケージの中には、別の自分用にビルドしたパッケージに依存しているものもある。 なので、chroot 環境からもローカルリポジトリとして myrepo を参照したい。 HTTP で公開しているなら利用者側と同じように /etc/pacman.conf に追加してもいいし、 あるいはビルド前に

sudo rsync -avL ~/public/ ~/chroot-i686/root/extra/
sudo rsync -avL ~/public/ ~/chroot-x86_64/root/extra/

とかするようにして、~/chroot-{i686,x86_64}/root/etc/pacman.conf には

[myrepo]
Server = file:///extra/$repo/os/$arch

みたい書くようにしてもいいと思う。