Tag Archives: pkgng

[メモ][FreeBSD] 複数Jailのpkg upgradeを一気に済ませたい

Pocket

メモ。

jailのpkg操作は、いちいちそのjailの中に入らなくてもpkg -j <jail名 or jail ID> …というように-jオプションを付与すればできる。

しかしjailの指定は、個々に行う必要がある。
たとえばpkg -j * upgradeというように、ワイルドカードを使うようなことは、もってのほかのようである。
jailなんてどんどん増えていくのに、いちいち-jで指定していくのもなあ。
仕方ないんで、やっつけでパイプを繋いで実現。

jls -N|tail -n +2|cut -f2 -d" "|xargs -I{} sudo pkg -j {} upgrade

以上

[FreeBSD] pkg quarterlyとlatestレポジトリの共存

Pocket

ここでも触れたが、10.2-RELEASEから、pkgレポジトリのデフォルト参照先がlatestからquarterlyになった。
具体的には/etc/pkg/FreeBSD.confの内容が変わった。

だからして、引き続きlatestを参照したい場合には、/etc/pkg/FreeBSD.confを書き換えればいいや、と思っていたものの、どうもこのファイルは「なるべく触るな」ということのようである。

つまり、もしもの時にlatestを参照する場合には、quarterly(すなわちデフォルト)の他に、latest向けのレポジトリ設定ファイルを作る必要がある。

それぞれを、いちいちenable/disableするのも面倒なので、latest、quarterlyの双方を参照するよう、Multi-repositoryの設定をした。

本記事ではMulti-repositoryの設定方法について示す。
と同時に、普段はquarterlyを使い、特定のときだけlatestを使うための方法を示す。

まずデフォルトの/etc/pkg/FreeBSD.confについて

/etc/pkg/FreeBSD.confは触るな

/etc/pkg/FreeBSD.confの中身を見てみると、以下のような記載がある。

# To disable this repository, instead of modifying or removing this file,
# create a /usr/local/etc/pkg/repos/FreeBSD.conf file:
#
#   mkdir -p /usr/local/etc/pkg/repos
#   echo "FreeBSD: { enabled: no }" > /usr/local/etc/pkg/repos/FreeBSD.conf
#

すなわち、この設定を無効化したい場合には、/etc/pkg/FreeBSD.confは触らずに、/usr/local/etc/pkg/repos/FreeBSD.confを作ったうえで、無効化の宣言をしろ、ということである。

/etc/pkg/FreeBSD.confはデフォルト設定として扱いたい雰囲気丸出しであるが、そうならrc.confのデフォルト設定が/etc/defaultsの下にあるように、/etc/pkg/defaults/FreeBSD.conf的なものを作ってくれても良いのではないかと思った。

しかしそもそも、レポジトリの設定ファイルはどのように読み込まれるのであろうか。

レポジトリ設定ファイルの読み込まれる順番

/usr/local/etc/pkg.confで指定する。
上記ファイルの中に、REPOS_DIRがある。
pkgは、ここに記載された順番通りにレポジトリ設定ファイルを読み込む。
特に変更していないのであれば、内容は下記の通り。

REPOS_DIR [
    "/etc/pkg/",
    "/usr/local/etc/pkg/repos/",
]

仮に複数のディレクトリに、同じレポジトリに対する設定ファイルがあったならば、後から読み込まれたもので上書きされる。
同じディレクトリに複数のファイルがあったならば、ファイルはアルファベット順に読み込まれる。

以下、マニュアルからの引用

Repositories are processed in the order they are found on the REPOS_DIR search path, with individual repository configuration files in the same directory processed in alphabetical order. Settings from files later in the search path will override those from earlier ones.

だから、/etc/pkg/FreeBSD.confのコメントに書いてある通り、/usr/local/etc/pkg/repos/FreeBSD.confでFreeBSDレポジトリを無効にする宣言をすると、設定が上書きされ、めでたくFreeBSDレポジトリは無効になる。

ところで、同じディレクトリ内の読み込み順序はアルファベット順、というのがキモで、実はレポジトリの名前と設定ファイルの名前は別々でも構わない。
だから、読み込ませたい順番に応じて、ファイル名の頭に数字を入れてもよい。

latestレポジトリ向けの設定はどこに?またどうやって?

さて。
仕組みはわかった。
どうも/etc/pkg/は触ってほしくないようだから、/usr/local/etc/pkg/reposにlatest向けの設定ファイルを置けばよいのだろう。
しかしちょっと待て。
latestとquarterlyを両立させるにはどのようにしたら良いのであろうか。

レポジトリの優先度について

複数のレポジトリを参照する場合、どちらをどの程度優先するか。
レポジトリ設定ファイルにpriorityという設定項目があるので、それを使えば優先度の設定ができる、ようだが。

以下はマニュアル。

PRIORITY: integer    Set the priority of the repository.  Higher
                     values are preferred.  Default: 0

レポジトリ設定ファイルにPRIORITYで優先度を指定すればよい。
数値が高ければ高いほど、優先度が高い。

ふむふむ。
では、動作は?

優先度設定されたときの動作

WORKING WITH MULTIPLE REPOSITORIES
  Where several different repositories are configured pkg will search
  amongst them all in the order specified by the PRIORITY settings in the
  repo.conf files, unless directed to use a single repository by the -r
  flag (略)

「複数のレポジトリが与えられた場合、pkgは、-rで参照先レポジトリを明示されない限り、PRIORITYの順番で検索を行う。」

ほほう。なるほど。
続けて読む。

  Where several different versions of the same package are available, pkg
  will select the one with the highest version (略)

「異なるバージョンのpackageが見つかった場合、最も高いバージョンが選ばれる。」

アレ!? 話が思わぬ方向に向かってきたよ!
優先度の高いレポジトリからインストールしてくれるんじゃないの!?

  even if a lower numbered version can be found in a
  repository earlier in the list

「低いバージョンが優先度の高いレポジトリにあったとしてもこの動作は変わらない。」

Oh…。

  This applies even if an explicit version is stated on
  the command line.  Thus if packages example-1.0.0 and
  example-1.0.1 are available in configured repositories(後略)

「さらにさらに、仮にバージョンを指定してインストールを実行しても、
動作は変わらない。
高いバージョンが見つかったら問答無用で新しい方をインストールする。」

ぐぬぬ。

基本、quarterlyを使い、特定のときだけlatestを使うためには

上記の動作を踏まえ、基本、quarterlyを使い、特定のときだけlatestを使うためには、以下の方法がある。

A. 都度、レポジトリ設定ファイルを使い分ける。
B. マルチレポジトリにしつつ、インストール時に考慮をする。

ここでA.を選ぶと芸がないので、B.の方法を示す。
B.の方法と言っても、以下の通りでOK。

最初にquarterlyレポジトリからインストールする。
-rオプションで参照先レポジトリを明示すること。

pkgは、そのpackageをどこからインストールしたかを覚えている。
後に示す設定を変えない限り、アップグレードの際には同じレポジトリを参照してくれる。
だから、最初のインストールでquarterlyを選んでおけば、次回アップグレードのときにも、原則としてquarterlyが選ばれるというわけ。

これをコンサバティブアップグレード(conservative upgrade)といい、pkg.confでデフォルト有効になっている。

  CONSERVATIVE_UPGRADE: boolean
    Ensure in multi repository mode that the priority is given
    as much as possible to the repository where a package was
    first installed from.  Default: YES.

説明を読むと;

  To override this
  behaviour, on first installation of the package select the repository
  with the appropriate version:
     pkg install -r repo-a example-1.0.0
  and then to make updates to that package ``sticky'' to the same reposi-
  tory, set the value CONSERVATIVE_UPGRADE to true in pkg.conf.

「(常に高いバージョンを選ぶ)この動作を変更するには、最初のインストールで
-rオプションによりレポジトリを選ぶ。
その後のアップグレードで同じレポジトリを使うには、pkg.confの
CONSERVATIVE_UPGRADEでtrueを選べばよい。」

以上

[FreeBSD] 10.2-RELEASEから適用されるpkg quarterlyてなんだ。

Pocket

10.2-RELEASEから、pkgのデフォルト参照先レポジトリが”quartely”のものになる。

◎pkg.confの変更

-# $FreeBSD: releng/10.1/etc/pkg/FreeBSD.conf 263938 2014-03-30 15:29:54Z bdrewery $
+# $FreeBSD: releng/10.2/etc/pkg/FreeBSD.conf 285830 2015-07-23 23:31:40Z gjb $

 FreeBSD: {
-  url: "pkg+http://pkg.FreeBSD.org/${ABI}/latest",
+  url: "pkg+http://pkg.FreeBSD.org/${ABI}/quarterly",
}

ご覧のとおり、いままでは”latest”。
これは言わばpkgのheadのようなもので、最新のpkgは手に入るものの、うっかりインストールすると地雷を踏むことがが多かった。

quarterlyは上記の問題を解決するために設けられる。
中の人によれば「意図的に更新速度を控えめにすることで、問題の発生を抑える一方、セキュリティ更新は受け取れるようにする」とのこと。
もちろん、望ならば今まで通りlatestを参照することもできる。

“In general, the quarterly package set is less prone to having build failures, since the changes in the branch are (by intent) less intrusive, while still receiving security updates. “

latestからquarterlyに変更してバージョンチェックしてみると、すでにインストール済みのpackageからバージョンの下がるケースも見られた。

python27-2.7.10                    >   succeeds remote (remote has 2.7.9_1)

詳細は待て10.2-RELEASEのアナウンス。

“(This will be noted in the final 10.2-RELEASE announcement, as well as
the release notes, and will also include instructions on how to switch
to the ‘latest’ branch if that is what is desired.)”

中の人の発言は以下から引用。
https://lists.freebsd.org/pipermail/freebsd-stable/2015-July/082905.html

[FreeBSD][メモ] pkgngで複数レポジトリ使ってる奴は1.4.3に上げておけ

Pocket

pkgngが1.4.3に上がった。
これより前のpkgngでは、複数レポジトリをうまく扱えない。
したがって、レポジトリ参照先にpourdriere等による自前レポジトリと公式レポジトリを設定している諸氏は1.4.3に上げるのが得策。

具体的には以下。
ports-mgmt/pkg: pkg install uses the wrong repository for some packages
要するに、追加したレポジトリからpkgをインストールしても、pkgngが公式レポジトリからpkgをダウンロードしようとする。

1.4.3では複数レポジトリを扱うための仕組みが追加された。
端的に言えば、複数レポジトリに優先度設定ができる。
まずpkg.confでCONSERVATIVE_UPGRADEを有効にし、各レポジトリの設定でPRIORITYを整数値で指定すれば、複数レポジトリの優先度を決められる。

詳細はman pkg.confせよ。
CONSERVATIVE_UPGRADEはこちら。

CONSERVATIVE_UPGRADE: boolean
 Ensure in multi repository mode that the priority is given
 as much as possible to the repository where a package was
 first installed from.  Default: NO.

PRIORITYはこちら。

PRIORITY: integer    Set the priority of the repository the
                     higher is the prefered repository.
                     Default: 0

[FreeBSD][メモ] pkg 1.3.7による問答無用の全パッケージ再インストールを避けるには

Pocket

pkgを1.3.7にアップグレードすると、インストール済み全パッケージの再インストールが求められる。
この回避方法について示す。

そもそも、なんでそんな事になっているかというと。
端的に言って、パッケージシステムでのshared libraryの扱いに難があったため、1.3.7でキッチリ修正したのだと。
その影響で、何も知らずにパッケージをアップグレードしようとすると、「shared libraryに変更があったため」と全パッケージを再インストールしようとしてしまう。

もちろん、別に全部再インストールしたって問題ないわけだが、帯域も時間も電気ももったいないので、再インストールを必要最低限に止める方法が公儀から発表された次第である。

詳細は以下をご覧あれ。

http://lists.freebsd.org/pipermail/freebsd-ports-announce/2014-August/000086.html

手順1.なにはともあれpkgを1.3.7に

2014/8/28現在である。

$ sudo pkg update
Updating repository catalogue
Fetching meta.txz: 100% of 944 B
Fetching digests.txz: 100% of 2 MB
Fetching packagesite.txz: 100% of 5 MB
Removing expired entries: 100%
Adding new entries: 100%
Incremental update completed, 23466 packages processed:
23297 packages updated, 133 removed and 76 added.

$ pkg version -vRL=|grep pkg
pkg-1.3.6                          <   needs updating (remote has 1.3.7)

キター。
さっそくpkgをアップグレードする。

$ sudo pkg upgrade pkg
パスワード:
Updating repository catalogue
Fetching meta.txz: 100% of 944 B
Fetching digests.txz: 100% of 2 MB
Fetching packagesite.txz: 100% of 5 MB

Incremental update completed, 23466 packages processed:
0 packages updated, 0 removed and 0 added.

New version of pkg detected; it needs to be installed first.
The following 1 packages will be affected (of 0 checked):

Installed packages to be UPGRADED:
        pkg: 1.3.6 -> 1.3.7

The process will require 9 KB more space
2 MB to be downloaded

Proceed with this action [y/N]:y

Fetching pkg-1.3.7.txz: 100% of 2 MB
Checking integrity... done (0 conflicting)
[1/1] Upgrading pkg from 1.3.6 to 1.3.7: 100%
Updating repository catalogue
Fetching meta.txz: 100% of 944 B
Fetching digests.txz: 100% of 2 MB
Fetching packagesite.txz: 100% of 5 MB

Incremental update completed, 23466 packages processed:
0 packages updated, 0 removed and 0 added.

Checking integrity...
 done (0 conflicting)
Your packages are up to date
$

オゲ。

手順2.レポジトリカタログの強制更新とパッケージ解析

pkgをアップグレードした瞬間にレポジトリカタログの更新も走っている。
したがって、もう一回pkg updateする必要はないのだが、念のため手順に沿ってもう一回やる。

$ sudo pkg update -f
Updating FreeBSD repository catalogue...
Fetching meta.txz: 100%   944 B   0.9k/s    00:01
Fetching digests.txz: 100%    2 MB 291.4k/s    00:07
Fetching packagesite.txz: 100%    5 MB 294.8k/s    00:18
Processing new repository entries: 100%
FreeBSD repository update completed. 23466 packages processed:
  0 updated, 0 removed and 23466 added.
$

当たり前だがアップデートも削除もなし。
次。
手順によるとpkg check -Baせよと。
これは何かというと、下記の通りインストール済みshared librariesを解析するものだそうな。
つまりこの解析の結果、全ファイル再インストールという事態を避けられるわけですな?

以下、-B, -aのオプション説明をmanから抜粋。

     pkg check -B or pkg check --shlibs is used to reanalyse shared libraries
     of installed packages.

     -a, --all     Process all packages.

実行…するが、ひょっとすると時間がかかるかも。
仮想マシン、かつ750個くらいパッケージがある状態で1時間近くかかった。
しかし実マシン(hp microserver)、120個くらいで2分。
パッケージの数、装置スペックによって前後するだろうが覚悟のこと。

改めて実行。

$ sudo pkg check -Ba
Checking all packages:  37%
pkg: fstat() failed for(/usr/local/include/cdio++/enum.hpp): No such file or directory
pkg: fstat() failed for(/usr/local/include/cdio++/mmc.hpp): No such file or directory
pkg: fstat() failed for(/usr/local/include/cdio++/read.hpp): No such file or directory
pkg: fstat() failed for(/usr/local/include/cdio/udf_file.h): No such file or directory
pkg: fstat() failed for(/usr/local/lib/libcdio++.so): No such file or directory
pkg: fstat() failed for(/usr/local/lib/libcdio.so): No such file or directory
pkg: fstat() failed for(/usr/local/lib/libiso9660++.so): No such file or directory
pkg: fstat() failed for(/usr/local/lib/libiso9660.so): No such file or directory
pkg: fstat() failed for(/usr/local/lib/libudf.so): No such file or directory
Checking all packages: 100%
$

あとは通常通りpkg upgradeでよい。
理不尽な再インストールを求められることもありません。

[FreeBSD][pkgng][メモ] pkgを1.2から1.3に上げたらneed to re-create repo FreeBSD to upgrade schema version

Pocket

pkgを1.2から1.3.xに上げたら以下のようなメッセージが出てupgradeができない。

$ sudo pkg upgrade
Updating repository catalogue
FreeBSD repository is up-to-date
All repositories are up-to-date
pkg: Repo FreeBSD needs schema upgrade from 2006 to 2010 but it is opened readonly
pkg: need to re-create repo FreeBSD to upgrade schema version
Checking for upgrades: 100%
Checking integrity... done (0 conflicting)

need to re-create repo とか言いつつ、どうすればいいのか書いてないし。
調べたところ、pkg update -fすればいいとのこと。

$ sudo pkg update -f
Updating repository catalogue
Fetching meta.txz: 100% of 944 B
Fetching digests.txz: 100% of 1 MB
Fetching packagesite.txz: 100% of 5 MB

Adding new entries: 100%
Incremental update completed, 23313 packages processed:
0 packages updated, 0 removed and 23313 added.

incremental update completedとのこと。
この状態でpkg upgradeすると、確かに動いた。
表示も少し親切になっていますな。

$ sudo pkg upgrade
Updating repository catalogue
FreeBSD repository is up-to-date
All repositories are up-to-date
Checking for upgrades: 100%
The following 41 packages will be affected (of 0 checked):

New packages to be INSTALLED:
        libevent2: 2.0.21_2
        i386-wine-devel: 1.7.23,1
        p5-Mozilla-CA: 20130114

Installed packages to be UPGRADED:
        xproto: 7.0.25 -> 7.0.26

Installed packages to be REINSTALLED:
        tevent-0.9.21 (options changed)


The process will require 209 MB more space
78 MB to be downloaded

Proceed with this action [y/N]: y
Fetching xproto-7.0.26.txz: 100% of 60 KB
Fetching vim-lite-7.4.389.txz: 100% of 5 MB
(略)

しかもconflictsを検知してくれるみたい。

Checking integrity... done (1 conflicting)
Checking integrity... done (0 conflicting)
Conflicts with the existing packages have been found.
One more solver iteration is needed to resolve them.
The following 42 packages will be affected (of 0 checked):

Installed packages to be REMOVED:
        libevent-1.4.14b_3

New packages to be INSTALLED:
        p5-Mozilla-CA: 20130114
        libevent2: 2.0.21_2
        i386-wine-devel: 1.7.23,1

Installed packages to be UPGRADED:
        xproto: 7.0.25 -> 7.0.26

Installed packages to be REINSTALLED:
        libxcb-1.10_2 (options changed)

Proceed with this action [y/N]: y
[1/42] Upgrading python27 from 2.7.6_4 to 2.7.8_2: 100%
[2/42] Upgrading pcre from 8.34_1 to 8.34_2: 100%

以上。

[メモ] FreeBSD10にhadoopインストール

Pocket

素の状態のFreeBSD 10にpkgngでhadoopをインストールしたときのメモ。

2014/7/4時点でのpkgにはhadoop-1.2.1が入ってる。

pkgのインストール

pkgの初回インストールに成功した試しがない。
pkgのpackageをダウンロードしてインストール。
具体的には、pkg-staticを取り出し、pkg-staticでpkgのpackageをインストール。

$ fetch http://pkg0.isc.freebsd.org/freebsd:10:x86:64/latest/Latest/pkg.txz
pkg.txz                                       100% of 2013 kB  552 kBps 00m03s
$
$  tar xvzf ./pkg.txz --include "*pkg-static" --strip-components 4
x pkg-static
$
(rootになって)
# ./bin/pkg-static add ./pkg.txz
Installing pkg-1.2.7_3... done
If you are upgrading from the old package format, first run:

  # pkg2ng
root@hdmock:/home/doe # 

pkg update。

# pkg update
Updating repository catalogue
digests.txz                         100% 1112KB 556.1KB/s 192.2KB/s   00:02
packagesite.txz                     100% 5014KB 626.7KB/s 373.9KB/s   00:08
Incremental update completed, 23278 packages processed:
0 packages updated, 0 removed and 23278 added.
# 

シェルとか、sudoとか、必要なものがあればインストールする。

hadoopのインストール

$ pkg search hadoop
apache-hadoop-1.2.1_1
$ sudo pkg install hadoop
Updating repository catalogue
pkg: No packages matching 'hadoop' available in the repositories
[doe@hdmock ~]$ sudo pkg install apache-hadoop
Updating repository catalogue
The following 39 packages will be installed:
(中略)
[39/39] Installing apache-hadoop-1.2.1_1...===> Creating users and/or groups.
Creating group 'hadoop' with gid '955'.
Creating user 'hadoop' with uid '955'.
 done

OpenJDKのための設定

hadoopについてくるOpenJDKのためにfstabに設定を加える。
OpenJDKインストール時のメッセージに沿って進める。

======================================================================

This OpenJDK implementation requires fdescfs(5) mounted on /dev/fd and
procfs(5) mounted on /proc.

If you have not done it yet, please do the following:

        mount -t fdescfs fdesc /dev/fd
        mount -t procfs proc /proc

To make it permanent, you need the following lines in /etc/fstab:

        fdesc   /dev/fd         fdescfs         rw      0       0
        proc    /proc           procfs          rw      0       0

=====================================================================

fstabに以下に行を追加。区切りはtab。

fdesc           /dev/fd         fdescfs rw      0       0
proc            /proc           procfs  rw      0       0

mount。
mountと叩いてmountされていることを確認。

$ sudo mount -a
$ mount
/dev/ada0p2 on / (ufs, local, journaled soft-updates)
devfs on /dev (devfs, local, multilabel)
fdescfs on /dev/fd (fdescfs)
procfs on /proc (procfs, local)

以上。
続きはこちら

[FreeBSD] あるマシンのpkgをごっそり他のマシンに持っていくには

Pocket

インターネットに接続されていないなどの理由で、公式のpkgレポジトリからpkgをダウンロードできないマシンのpkgをどのように世話するか。

インターネットに接続できるマシンでpkgをインストールしておき、そのマシンからpkgを取得する。

手順

・ターゲットとなるマシン(以下、ターゲット)と同じ構成でVM(以下、コピーマシン)を作る。
・コピーマシンに必要なpkgをインストールする。
・コピーマシン上のどこかでインストール済みpkgを作る。
・同じ場所にrepoカタログを作成する。
・ターゲットと同じLANに繋ぎかえる。
・pkgのあるディレクトリをwebサーバで公開し、pkgをインストールする。

以下、詳細手順

ターゲットと同じ構成でVMを作る

RELEASEバージョンを合わせておけばよいでしょう。
割愛。

コピーマシンに必要なpkgをインストールする

タイトルの通り。
なにもわざわざインストールしなくても、という意見もあるだろうが、動作確認も必要だし。
割愛。

pkgを作る

適当な場所にディレクトリを掘り、以下のコマンドを叩く。

pkg create -a -f tgz -o ./ -n

-aは、インストール済みのすべてのpkgを指定、という意味。all。
-fは、圧縮フォーマットの指定。右から左へ移すだけだからtgzでよい。tbzだと時間がかかる。
-o ./は、作成したpkgを置く場所。
-nは、作成済みのpkgを作らない、という意味。付けると処理のスピードアップが望めるが、逆に更新のあったpkgを作り忘れる、という危険性もあるかも。
以下の例では-nを使っていない。

$ cd /usr/home/vanilla/pkgrepo/
$ sudo pkg create -f tgz -o ./ -a
Loading the package list...
Creating package for GentiumBasic-110_1
Creating package for ImageMagick-6.8.9.3,1
Creating package for ORBit2-2.14.19_1
(略)

repoカタログを作成する

pkg repoにディレクトリを指定すればよい。

$ cd /usr/home/vanilla/pkgrepo/
$ sudo pkg repo /usr/home/vanilla/pkgrepo/
Generating repository catalog in /usr/home/vanilla/pkgrepo/: done!
$

そうすると以下の二つのファイルができる。

digests.txz     packagesite.txz

つまり今回の例でいえば、/usr/home/vanilla/pkgrepo/に作成したpkgと二つのファイルが格納されているわけ。

以上でコピーマシンでの作業は完了。

ターゲットでの準備

ターゲットにpkg一式をコピーし、webサーバを立ち上げる。
そのまえに、ターゲットでレポジトリの設定ファイルを修正しておくこと。
具体的には、①公式のpkgレポジトリを無効にし、②自前のpkgレポジトリの設定を加えることである。

①公式pkgレポジトリの無効化

/etc/pkg/pkg/FreeBSD.confでenabledをnoにする。

# $FreeBSD: release/10.0.0/etc/pkg/FreeBSD.conf 258710 2013-11-28 14:24:26Z gjb
$
FreeBSD: {
  url: "pkg+http://pkg.FreeBSD.org/${ABI}/latest",
  mirror_type: "srv",
  signature_type: "fingerprints",
  fingerprints: "/usr/share/keys/pkg",
  enabled: no
}

②自前レポジトリの設定
/usr/local/etc/pkg/repos/localpkg.confとして以下のようなファイルを作る。
urlは、後ほど設定するwebサーバと合わせる事。

localpkg: {
  url: "http://localhost:8000/",
  mirror_type: "http",
  enabled: yes
}

pkg -vvとしてみる。
repo FreeBSDのenabledがno, repo localpkgのenabledがyesになっていることを確認。

Repositories:
  FreeBSD: {
    url             : "pkg+http://pkg.FreeBSD.org/freebsd:10:x86:32/latest",
    enabled         : no,
    mirror_type     : "SRV",
    signature_type  : "FINGERPRINTS",
    fingerprints    : "/usr/share/keys/pkg"
  }
  localpkg: {
    url             : "http://localhost:8000/",
    enabled         : yes,
    mirror_type     : "HTTP"
  }

 

webサーバでpkgを公開、インストールする。

rsyncでもなんでも使って、ターゲットにpkg一式をコピーする。
/home/vanilla/10.0/pkgにコピーしたとして、webサーバでこのディレクトリを公開すればよい。
ここでは手早くpythonで公開する。
以下のようにするとカレントディレクトリをルートとするwebサーバが立ちあがる。ポートは8000である。

$ cd /home/vanilla/10.0/pkg
$ python -m SimpleHTTPServer

同じくターゲットでpkg udpate。
pkg repoで作成したdigests.txz, packagesite.txzを参照できていることを確認したら、pkg upgradeすればよい。

$ sudo pkg update
Updating repository catalogue
digests.txz                         100%   29KB  29.3KB/s  29.3KB/s   00:00    
packagesite.txz                     100%  136KB 135.9KB/s 135.9KB/s   00:00    
Incremental update completed, 613 packages processed:
0 packages updated, 0 removed and 613 added.

以上です。

カスタムpkgをpoudriereで作ろう

Pocket

poudriereとは

中の人曰く:

primarily designed to test package production on FreeBSD. However, most people will find it useful to bulk build ports for FreeBSD.
「package生成のテストを主眼にデザインされたツールである。しかしながら、ほとんどの人はportsをまとめてコンパイルする点を有用と考えるだろう。」

とのこと。

ちなみにpoudriereとはフランス語であり、英語にするとgunpowder magazine、つまり弾薬庫のことだそうな。

物騒であるな。
あと、poudriereって綴りが覚えづらくて困る。

カスタムpackageのためのツール?

一方で、poudriereはカスタムpackageを欲する人にも勧められてたりする。
というのも。
現時点では、pkgでインストールするpackageのオプションは決め打ちされていて自由に選ぶことができない。
有名なところで例を挙げると、PHPのpackageにapacheモジュールが付属しない。
したがって、apacheモジュールが欲しければ自分でコンパイルするしかない。

コンパイルとくればportsである。
poudriereもコンパイルを行うが、こちらはpackageを作ることができる。
packageを作ってしまえば、pkgコマンドで手軽に管理できる。
おお。
これは便利なのか?

しかしながら準備段階でコンパイルが発生しているわけで、わざわざpkgコマンドなんて経由しないで、portsからコンパイルしてさっさと入れてしまったほうが効率的だろう。

それでもpoudriereが有用なケース①: 複数ホストが対象のとき

ずいぶんネガティブなことを書いたけれども、もしもカスタムpackageを複数ホストで使うのならば、poudriereの利点が活きてくる。
poudriereの優れているところは、公式のpackageレポジトリの構成とまったく同じものを作る点だ。
そのディレクトリをwebサーバで公開するだけで、自前のレポジトリができてしまう。
クライアントでは、pkgコマンドの見に行く場所を自前レポジトリに向けるだけでよい。

やってみると分かるけど、同じLANにあるレポジトリはめっぽう速くて気分がよい。速いのはあたりまえだけど。
こうしたことから、カスタムpackageを複数ホストにばら撒くならpoudriereはとても有用である。

それでもpoudriereが有用なケース②: オフラインマシン向け

もう一つ加えるとすれば、オフラインのマシンにpackageを展開する場合だろう。

pkgコマンドにはcreateというサブコマンドがあり、インストール済みのpakcageからpackageを再生成できる。
これを利用して、ネットに繋がるマシン(たいていはセキュリティポリシー上許可されたマシン(多くはWindows)の「上で」動く仮想マシン)でpackageをインストールしてpkg create、ネットに繋げないマシンにまるまる移すことができる。

また別の考え方をすると、テスト環境でpackageをインストールして検証し、問題のないことを確認したら、packageを本番環境に移す、ということもできるだろう。

ただこの方法には問題があって、現時点のpkgコマンドにはインストール済みのpackageをリプレイスする仕組みがないのである。

例えばターゲットとなるマシンのbashを更新したいとする。
通常であればpkg upgradeを使うところだが、このコマンドは手許にあるpackageを読んでくれないのである。
(もしできるのなら教えてください本当に)
どうしようもないので、いったんbashをアンインストールしてから再インストールするという、なんだかすごく頭の悪いことをする羽目になる。

bashなら悠長なこと言ってられるかもしれないが、これがサーバソフトウェアなら大変である。
またこれが1つ2つではなく、数百個になったらどうするのか。

ここで告白するが、私はとても面倒くさくなって、packageを根こそぎ削除して新規にまるまるインストールしようとした。
そしたら、pkgコマンドも削除されててリアルでorzとなった。
みんなは気をつけるように。

話を戻すと、こういうウッカリさんには、poudriereは便利、かもしれない。

注意点

仮想マシンでpoudriereを動かす人は以下の点に注意すべき。
端的に言って、firefox等のブラウザ、libreofficeなどの巨大packageを作る際には、膨大なメモリ、swapが必要である。メモリ、swapそれぞれ1GBでは失敗した。
メモリを用意できない場合には、出来合いのpackageを持ってくるしかないだろう。
なお、ブラウザに限って言えば、operaなら悠々とコンパイルできたことをお伝えしておく。

ながながと前置きをしたが、以下にpoudriereでカスタムpackageを作る方法を示す。

前提

便宜上、「インターネットに繋がっていない」ことを「オフライン」と表現する。
「オフラインマシン」であれば、「インターネットには繋がっていないマシン」とする。
ただしオフラインマシンであっても、LANには接続されている前提。

ネット接続可能で、poudriereのインストールされているマシンをオンラインマシンとする。

オンラインマシンでpackageを作り、「レポジトリをオフラインマシンにコピーしてから」、オフラインマシンにインストールするという手順にする。
つまりこれは複数のオフラインマシンを前提にしているというわけ。

事前準備

オンラインマシンにpoudriereの環境があること。
作り方は本記事の前編であるこちらをどうぞ。
オフラインマシンには、pkgコマンド、webサーバ(nginx, lighttpd, apacheのいずれか。Pythonでもよい。 Python? ええPythonです)、あとはまあ転送用に、rsyncがあると便利。なくてもよい。

オフラインマシンへのpkgインストールはこちらを。
オフラインマシンへのpackageインストールは、poudriereに関するこちらを。

全体の流れ

poudriereでカスタムpackageを作るときの流れは以下のようなものである。

1.おもむろにテキストファイルを開く
2.カスタマイズしたいpackageの一覧をズラズラと並べる。
3.このとき、origin付きで並べること。php5ならlang/php5というように。
4.poudirereのサブコマンドoptionsを使って一括でoption設定をする。
5.あとは同じファイルでbulkコンパイルすればよい。

では。

カスタマイズしたいpackage一覧の作成

一例として、以下のようなファイルを作る。
pkg.custom.txt

lang/php5
lang/php5-extensions

originの探し方はpkg search -o phpなどとすればよい。

optionの設定

以下のようにする。

poudriere options -n <package一覧> -j <jail name>

optionsサブコマンドにテキストファイルを与えると、書かれているpackageのoptionを根こそぎ聞いてくれる。

実態は、おそらく当該portsに移ってmake config-recursiveをしている。
それはともかく、素のままoptionsを実行すると、再帰的にmake configされるので大変である。
大量の依存を抱えているといつまで経ってもoption選択が終わらない。ウンザリする。
そもそもカスタマイズしたいpackageだけを書いているのにこんなことをされては迷惑である。
そこで-nオプションを与えて、option設定を一階層に限るというわけ。

packageの作成

あとは同じテキストファイルを、bulkコマンドに与えて上げればよい。
待つだけ。

リポジトリの展開

オンラインマシン(”オンラインマシン”の定義は「前提」章を参照のこと)からオフラインマシンに移す。
オンラインマシンでいきなりリポジトリを公開するケースはこちらを。

さて以下の場所にリポジトリができたとする。

/usr/local/poudriere/data/packages/92i386-default

それをオフラインマシンに転送。

rsyncを使った。
ないならtarでもなんでも固めて持っていけ。
ここでは192.168.200.100がオフラインマシン。
オフラインマシンにいる普通のユーザのディレクトリに置いているが、気にしない。

$ cd /usr/local/poudriere/data/
$ rsync -avz —-delete ./packages/ vanilla@192.168.200.100:/home/vanilla/poudriere/

その後、オフラインマシンに移って該当箇所をwebで公開。

pythonが入っていれば以下のコマンドですぐに公開できる(Python 2の例)。

$ cd /home/vanilla/poudriere
$ python -m SimpleHTTPServer
Serving HTTP on 0.0.0.0 port 8000 ...

 

オフラインマシンでの設定

以下のような設定を書けばOK。

/usr/local/etc/pkg/repos/localpkg.conf

localpkg: {
url: "http://192.168.200.100:8000/92i386-default",
mirror_type: "http",
enabled: yes
}

 

リポジトリの設定を変えたら必ずpkg -vvで確認。

pkg -vv

Repositories:
localpkg: {
url : "http://192.168.200.100:8000/92i386-default",
enabled : yes,
mirror_type : "HTTP"
}

 

あとはpkg updateしていつもの流れ。

$ sudo pkg update
Updating repository catalogue
digests.txz 100% 26KB 25.6KB/s 25.6KB/s 00:00
packagesite.txz 100% 114KB 114.0KB/s 114.0KB/s 00:00
Incremental update completed, 537 packages processed:
0 packages updated, 0 removed and 537 added.

 

以上。

poudriereでhomebrew(自前) pkgリポジトリを

Pocket

poudriereを使ったので経緯を記す。
poudriereは自前のpkgngレポジトリを作るツール。
自前のレポジトリを作るのは、自前のpackageを置きたいときや、オフラインマシンにpackageを提供したいとき、である。

poudriereの構築は、以下二つのサイトに沿えばできる。
ただ、簡潔にまとめられているので、本記事では補足も併せてまとめる。
http://blog.etoilebsd.net/post/Home_made_pkgng_repo
http://w.vmeta.jp/tdiary/?date=20130205

仕組み

poudriereがどのようにしてpackageを作るかというと。
OS/アーキテクチャごとにjailを作り、そこでportsからpackagesを作る。
つまりホストのOS|アーキテクチャと違っていても大丈夫だが、ホストは最新にしておいた方がよい。

packagesはあるディレクトリにまとめられる。
ディレクトリはそのままwebで公開できる形式になっている。
他のマシンから、pkgngでつなげば、自家製packagesを取得できる。

作成するpackagesは自分で選ぶことができる。
また、オプションも選ぶことができる。
オプションはまた別途。

必要なもの

zpoolを最低7GB用意しておくこと。

インストール

ports-mgmt/poudriereからportsでもpkgでもよいのでインストール。

設定ファイル

まず設定ファイルを作る。
/usr/local/etc/poudriere.conf.sampleをもとに。

/usr/local/etc/poudriere.conf

# 作成しておいたzpoolの名前をここで指定
ZPOOL=vault

# 上記のzpoolから切り出したzfsを、
# ここで示したディレクトリにマウントしておく。
ZROOTFS=/poudriere

# FreeBSDの部品の取得先。国内にしておこう。
FREEBSD_HOST=ftp://ftp2.jp.freebsd.org

# デフォルトのまま
RESOLV_CONF=/etc/resolv.conf

# デフォルトでいいでしょう。
BASEFS=/usr/local/poudriere

# デフォルトでいいでしょう。
USE_PORTLINT=no

# デフォルトでいいでしょう。
USE_TMPFS=yes

# デフォルトでいいでしょう。
DISTFILES_CACHE=/usr/ports/distfiles

# proxyの指定が必要であれば
export HTTP_PROXY="http://proxy:8080/"
export FTP_PROXY="http://proxy:8080/"

 

poudriere作業用zfsの準備

zpoolからzfsを切り出し、/poudriereにマウント。
poudriere.confを参照すると、最低でも7GBとある。

zfsの操作はよろしければこちらをどうぞ。
http://april.fool.jp/blogs/?p=1827

結果として以下のような環境。
20.0Gのzpoolをvaultとして作成している。

$ zpool list
NAME    SIZE  ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT
vault  19.9G   190K  19.9G     0%  1.00x  ONLINE  -
$ zpool status
  pool: vault
 state: ONLINE
  scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        vault       ONLINE       0     0     0
          ada1      ONLINE       0     0     0

errors: No known data errors

ここからpoudriereとして切り出し。

$ zfs list
NAME              USED  AVAIL  REFER  MOUNTPOINT
vault            45.7M  19.5G    31K  /vault
vault/poudriere  45.0M  19.5G  45.0M  /poudriere

それを/poudriereにマウント。

$ mount
/dev/ada0p2 on / (ufs, local, journaled soft-updates)
devfs on /dev (devfs, local, multilabel)
vault/poudriere on /poudriere (zfs, local, nfsv4acls)

再起動しても大丈夫なようにfstabに書き込み

$ cat fstab
# Device        Mountpoint      FStype  Options Dump    Pass#
/dev/ada0p2     /               ufs     rw      1       1
/dev/ada0p3     none            swap    sw      0       0
vault/poudriere /poudriere      zfs     rw      0       0

以降、本格的な作業に。

デフォルトのportstreeを作る。: poudriere ports

jailごとにportsディレクトリを持っていてはディスクがいくらあっても足らない。
そこでportsディレクトリは全jailsで共有する。
そのportsディレクトリ、portstreeを作る。

poudriere ports -cで作成。
場所は/poudriere/ports/defaultに作られる。

ちなみに、二回目からは-uで更新。
指定がなければportsnapが使われる。
svnとかが使いたければ-m svnなどと指定する。

作成例

$ sudo poudriere ports -c
====>> Creating default fs... done
====>> Extracting portstree "default"...
Looking up portsnap.FreeBSD.org mirrors... none found.
Fetching public key from portsnap.FreeBSD.org... done.
Fetching snapshot tag from portsnap.FreeBSD.org... done.
Fetching snapshot metadata... done.
Fetching snapshot generated at Fri Nov  1 21:00:43 JST 2013:
98c3a00130d24348ff5bcca8474e4c6cb777d838e8f5d2100% of   69 MB 3590 kBps 00m19s
Extracting snapshot... done.
Verifying snapshot integrity...
(略)

二回目以降の例
すでにportsがある状態で-cを指定すると怒られる。

$ sudo poudriere ports -c
====>> Error: The ports tree default already exists

$ sudo poudriere ports -u
====>> Updating portstree "default"
Looking up portsnap.FreeBSD.org mirrors... none found.
Fetching snapshot tag from portsnap.FreeBSD.org... done.
Fetching snapshot metadata... done.
Updating from Fri Nov  1 21:27:07 JST 2013 to Fri Jan 17 22:08:55 JST 2014.
Fetching 4 metadata patches... done.
Applying metadata patches... done.
Fetching 4 metadata files... done.
Fetching 11146 patches.....10
(略)

 

各システム向けのJailを作る: poudriere jail

いよいよ個別のjail。
pkgを提供したいシステムに合わせてjailを作る。

jailを作るにはpoudriere jailを使う。
poudriere jailでオプション一覧が表示される。

-jでjailname指定、-vでFreeBSDバージョン、-aでアーキテクチャ(i386かamd64)を指定。
-cで作成、-dで削除、-lで一覧、-sで開始、-kで停止、-uで更新。

後で見返した時に分からなくなるので、jail名にはシステム関連の情報を入れておくとよい。
たとえば9.2-RELEASE i386向けなら92i386というように。

実行例

$ sudo poudriere jail -c -j 92i386 -v 9.2-RELEASE -a i386
====>> Creating 92i386 fs... done
====>> Fetching base.txz for FreeBSD 9.2-RELEASE i386
/poudriere/jails/92i386/fromftp/base.txz      100% of   60 MB 6703 kBps 00m10s
====>> Extracting base.txz... done
====>> Fetching src.txz for FreeBSD 9.2-RELEASE i386
/poudriere/jails/92i386/fromftp/src.txz       100% of   95 MB 6049 kBps 00m16s
====>> Extracting src.txz... done
====>> Fetching games.txz for FreeBSD 9.2-RELEASE i386
/poudriere/jails/92i386/fromftp/games.txz     100% of  861 kB 4705 kBps 00m00s
====>> Extracting games.txz... done
====>> Cleaning up... done
====>> Jail 92i386 9.2-RELEASE i386 is ready to be used

一覧の例

$ sudo poudriere jail -l
JAILNAME             VERSION              ARCH    METHOD
92i386               9.2-RELEASE          i386    ftp

削除例

$ sudo poudriere jail -d -j 92i386
====>> Removing 92i386 jail... done
$
$ sudo poudriere jail -l
JAILNAME             VERSION              ARCH    METHOD
$

このときのmountの出力
えらいことに。

$ mount
/dev/ada0p2 on / (ufs, local, journaled soft-updates)
devfs on /dev (devfs, local, multilabel)
vault/poudriere on /poudriere (zfs, local, nfsv4acls)
vault/poudriere/data on /usr/local/poudriere/data (zfs, local, nfsv4acls)
vault/poudriere/ports on /poudriere/ports (zfs, local, nfsv4acls)
vault/poudriere/ports/default on /usr/local/poudriere/ports/default (zfs, local, nfsv4acls)
vault/poudriere/jails on /poudriere/jails (zfs, local, nfsv4acls)
vault/poudriere/jails/92i386 on /usr/local/poudriere/jails/92i386 (zfs, local, nfsv4acls)

 

jailの作成が失敗するとき

失敗しなかったらこの章は読み飛ばしてOK.
最初のCreatingで失敗するときは、以前に作った何かが邪魔しているはず。

$ sudo poudriere jail -c -j 92i386 -v 9.2-RELEASE -a i386
====>> Creating 92i386 fs... done
mkdir: /poudriere/jails/92i386: No such file or directory
====>> Fetching base.txz for FreeBSD 9.2-RELEASE i386
fetch: /poudriere/jails/92i386/fromftp/base.txz: open(): No such file or directory
fetch: /poudriere/jails/92i386/fromftp/base.txz: open(): No such file or directory
====>> Error: Failed to fetch from ftp://ftp2.jp.freebsd.org/pub/FreeBSD/releases/i386/i386/9.2-RELEASE/base.txz
====>> Error while creating jail, cleaning up.
====>> Removing 92i386 jail... done

zfs listすると同じ名前の残骸がある。

$ zfs list
NAME                            USED  AVAIL  REFER  MOUNTPOINT
vault                          2.06G  17.5G    31K  /vault
vault/poudriere                2.06G  17.5G   561M  /poudriere
vault/poudriere/data             32K  17.5G    32K  /usr/local/poudriere/data
vault/poudriere/jails          1000M  17.5G    32K  /poudriere/jails
vault/poudriere/jails/92i386   1000M  17.5G  1000M  /poudriere/jails/92i386
vault/poudriere/ports           545M  17.5G    31K  /poudriere/ports
vault/poudriere/ports/default   545M  17.5G   545M  /usr/local/poudriere/ports/default

削除。オプションなしではうまくいかないので-rで再トライ。

$ sudo zfs destroy vault/poudriere/jails/92i386
cannot destroy 'vault/poudriere/jails/92i386': filesystem has children
use '-r' to destroy the following datasets:
vault/poudriere/jails/92i386@clean
$ sudo zfs destroy -r vault/poudriere/jails/92i386
$

きれいになった。

$ zfs list
NAME                            USED  AVAIL  REFER  MOUNTPOINT
vault                          1.08G  18.5G    31K  /vault
vault/poudriere                1.08G  18.5G   561M  /poudriere
vault/poudriere/data             32K  18.5G    32K  /usr/local/poudriere/data
vault/poudriere/jails            32K  18.5G    32K  /poudriere/jails
vault/poudriere/ports           545M  18.5G    31K  /poudriere/ports
vault/poudriere/ports/default   545M  18.5G   545M  /usr/local/poudriere/ports/default

 

作成したいpackagesのリストを作る

作成したいpackagesを指定する。
テキストファイルにpackagesを並べればよい。

ただしOriginで記載すること。
Originっていうのは…たとえばrsyncならnet/rsyncと書く。
Originが分からなければ、pkg searchするときに-oを付ければよい。

$ pkg search -o rsync
net/grsync
net/librsync
mail/maildirsync
net/rsync
sysutils/rsyncbackup
sysutils/rsyncmanager
sysutils/rsyncrypto

psearch(ports-mgmt/psearch)でもできる。

$ psearch rsync
archivers/rvm             Archive manager that uses rsync to manage backups
devel/p5-File-DirSync     Perl5 module for synchronizing two directories rapidly
mail/maildirsync          Online synchronizer for Maildir-format mailboxes
net/grsync                GTK frontend for rsync
net/librsync              Library for delta compression of streams
net/p5-File-Rsync         Perl convenience wrapper for the rsync(1) program
net/p5-File-RsyncP        Perl Rsync client
net/rsync                 Network file distribution/synchronization utility
sysutils/dirvish          Network backup system based off of rsync
(略)

試しにrsyncだけ書く。

$ cat ./pkg.list
net/rsync

 

packagesの作成: poudriere bulk

いよいよ作成。
作成にはpoudriere bulkを使う。
poudriere bulkでオプションを一覧できる。

-fで作成するパッケージリストを指定。さっき作ったやつ。

特定のjailでのみ実施したい場合は-jでjailname指定。
-cで作成したpackagesをすべて吹き飛ばす。
-C -f <file>に書かれたpackagesのみ消す。

では実行。
初回なのでpkgも作ってくれているようですな。

$ sudo poudriere bulk -j 92i386 -f ./pkg.list
====>> Creating the reference jail... done
====>> Mounting system devices for 92i386-default
====>> Mounting ports/packages/distfiles
====>> Mounting packages from: /usr/local/poudriere/data/packages/92i386-default
====>> Logs: /usr/local/poudriere/data/logs/bulk/92i386-default/2014-01-20_22h03m21s
====>> Appending to make.conf: /usr/local/etc/poudriere.d/92i386-make.conf
/etc/resolv.conf -> /usr/local/poudriere/data/build/92i386-default/ref/etc/resolv.conf
====>> Starting jail 92i386-default
====>> Calculating ports order and dependencies
====>> pkg package missing, skipping sanity
====>> Cleaning the build queue
====>> Building 2 packages using 1 builders
====>> Starting/Cloning builders
====>> Hit CTRL+t at any time to see build progress and stats
====>> [01] Starting build of ports-mgmt/pkg
====>> [01] Finished build of ports-mgmt/pkg: Success
====>> [01] Starting build of net/rsync
====>> [01] Finished build of net/rsync: Success
====>> Stopping 1 builders
====>> Creating pkgng repository
Generating repository catalog in /packages: done!
====>> Cleaning up
====>> Umounting file systems
====>> Built ports: ports-mgmt/pkg net/rsync

====>> [92i386-default] 2 packages built, 0 failures, 0 ignored, 0 skipped
====>> Logs: /usr/local/poudriere/data/logs/bulk/92i386-default/2014-01-20_22h03m21s
$

 

自家製packagesの公開

さて。
作成したpackagesはどこにあるかというと、今回の場合は以下である。

/usr/local/poudriere/data/packages/92i386-default/

このディレクトリをwebサーバで公開する。
※もちろん、webサーバで公開しているディレクトリに中身を移しても可。

この場所は、poudriere.confのPOUDRIERE_DATAで決まる。
${POUDRIERE_DATA}/packages/<jailname>-default/となる。
もしこの場所が気に食わなかったら、POUDRIERE_DATAを変える。

lsで中身を見てみると、オフィシャルpkgsiteのものと全くそっくりな内容になっている。

$ ls /usr/local/poudriere/data/packages/92i386-default/
All             Latest          digests.txz     packagesite.txz

ではこれをwebサーバで公開する。
ここではnginxを例にとる。
nginx.confは下記のように。

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  localhost;
        location / {
            autoindex on; #Here!
            root   /usr/local/poudriere/data/packages; #Here!
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /usr/local/www/nginx-dist;
        }
    }
}

デフォルトからほとんど変えていない。
変えたのは、#Here!と記載した箇所。
rootを/usr/local/poudriere/data/packagesに向ける。
autoindexをonにする。
nginxは、デフォルトではautoindex offなので、明示的に指定しないとForbiddenを食らってしまう。

nginxを起動して;

$ sudo service nginx start
Performing sanity check on nginx configuration:
nginx: the configuration file /usr/local/etc/nginx/nginx.conf syntax is ok
nginx: configuration file /usr/local/etc/nginx/nginx.conf test is successful
Starting nginx.

接続確認。良さそうですな。

$ w3m http://localhost/92i386-default/
Index of /92i386-default/

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

../
All/                                               20-Jan-2014 22:24
Latest/                                            20-Jan-2014 22:06
digests                                            20-Jan-2014 22:24
digests.txz                                        20-Jan-2014 22:07                 3
packagesite.txz                                    20-Jan-2014 22:07                12
packagesite.yaml                                   20-Jan-2014 22:24

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

webサーバを他の用途にも使っている場合には、以下のようにlocation /packages/を/usr/local/poudriere/dataに向ければよい。
※冗長なのでserverディレクティブの中しか引用しない。

    server {
        listen       80;
        server_name  localhost;
        location / {
            root   /usr/local/www/nginx;
            index  index.html index.htm;
        }
        location /packages/ {
            autoindex on;
            root   /usr/local/poudriere/data;
        }

 

クライアント側の設定

やっとたどり着いた。
クライアント側では/etc/pkg/の下か、/usr/local/etc/pkg/repos/の下に以下のような設定ファイルを作る。
ここで192.168.200.111はサーバのアドレス。

/etc/pkg/homebrew.conf

homebrew: {
  url: "http://192.168.200.111/92i386-default",
  enabled: yes
}

こうしておき、pkg -vvとすると見えるはず。

Repositories:
  homebrew: {
    url             : "http://192.168.200.111/92i386-default",
    enabled         : yes
  }

pkg updateするとさっき作ったpackagesも見える。

$ sudo pkg update
Updating repository catalogue
digests.txz                         100%  352     0.3KB/s   0.3KB/s   00:00
packagesite.txz                     100% 1904     1.9KB/s   1.9KB/s   00:00
Incremental update completed, 2 packages processed:
0 packages updated, 0 removed and 2 added.

いろんな工夫については別途。