インターネットに接続されていないなどの理由で、公式の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.

以上です。