Category Archives: pkgng

[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.

以上です。

Tags: ,

カスタム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.

 

以上。

Tags: ,

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.

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

Tags: ,

pkgのデータが壊れたでござる。よろしい。消しておしまい。

Pocket

pkgngで色々と遊んでたりすると、ごくごく稀に以下のような表示が出ることがある。

pkg: sqlite: database disk image is malformed (pkgdb_repo.c:545)

 

要するにpkgのdatabaseが壊れたということである。

これを復旧するにはどうしたらよいか。
実はすごく簡単だし、大した問題ではない。
ここで壊れているのは、repository catalogueつまりpkgサーバに何が格納されているか、というデータベースなので、消してもう一回ダウンロードすればよい。

# rm /var/db/pkg/repo-*.sqlite

 

として、それからpkg updateすればよいだけ。
ただし削除するときは注意。
local.sqliteは、そのホストにどのpkgがインストールされているか、というデータベースである。
これを消してしまうと、当然ながらそのホストにはpkgが一つもインストールされていない、ということになって、たいへん面倒なことになるから注意。
告白すると私は一度やりました。ええ。

Tags: ,

[メモ] pkgngで更新のあるpackagesを一覧にするには

Pocket

pkg updateとやったあと、更新のあったpackagesを一覧するには。

スマート: “pkg version -vRL=”とすればよい。
かっこよくない: いきなりpkg upgradeして表示させる。

実行例

$ pkg version -vRL=
gvfs-1.12.3_1                      ?   orphaned: devel/gvfs
mate-file-archiver-1.6.0           ?   orphaned: archivers/mate-file-archiver
mate-file-manager-1.6.2            ?   orphaned: x11-fm/mate-file-manager
mate-text-editor-1.6.0             ?   orphaned: editors/mate-text-editor

…なんか面倒くさいことになってるけど、この通り。

portsのINDEXを使う場合

/usr/portsがあり、OSバージョンに合ったINDEXがあれば、version -vIL=も使える。
INDEXとは、/usr/ports/INDEX-10などの、portsの目次。
portsを使わない場合は不要だけど、poudriereで自家製packagesを使うときには重宝するかも。

$ pkg version -vIL=
gnutls-2.12.23_2                   <   needs updating (index has 2.12.23_3)
libXfont-1.4.6,1                   <   needs updating (index has 1.4.7,1)
pkg-1.2.4_1                        <   needs updating (index has 1.2.5)
zsh-5.0.4                          <   needs updating (index has 5.0.5)

 

オプション補足

-Iと-Rの違いは下記の通り。

-I  portsのINDEXを使う。
-R リポジトリのカタログを使う。

-vと-Lの意味は以下の通り。

-v 出力を詳細にする。ないと更新の有無しか表示しない。
-L "-L ="とすると、"="を含まない場合だけ表示。すなわち、更新のある場合のみ表示。

 

Tags: ,

pkgngが死んで詰んだときには

Pocket

 

pkgコマンドが何らかの要因で壊れてしまい、pkgコマンド自体の再インストールすらできず詰んでしまったときの対処方法を示す。
お急ぎの方は「蘇生方法」からお読みください。

背景: pkgはベースシステム?package?

pkgコマンドは、ベースシステムに組み込まれていながら、pkgシステムで管理されている。
言い換えると、ベースシステムに含まれているのに追加ソフトウェアとしてのpackagesでもある、というちょっと変わった存在である。

これは、pkgコマンド自体を、OSのバージョンに固定されることなく、更新できるための仕組み。
pkgコマンドが純然たるベースシステムであった場合、pkgコマンドを更新するたびにOSリリースが発生してしまうからである。

だから、皆さんご存知の通り、初めてpkgコマンドを実行すると最新のpkgをダウンロード&インストールするのだが、それは上記のような理由である。

なお、ここでの「ベースシステム」とは、FreeBSD projectがリリースする一式(カーネル+ユーザランド)を指す。packagesはユーザが任意に追加するソフトウェア。

問題: pkgはpackageなのでpkgが壊れると詰む。

よろしい。背景は、わかる。
しかし、問題もあって、すなわち;
pkgコマンドもpkgngで管理しているので、pkgコマンドが壊れてしまった場合、pkgの再インストールができず詰む
ということである。

たとえば、pkgコマンドが依存しているshared objectが無くなったとか、壊れた場合である。
FreeBSDではこういう場合に備えて、/rescueにスタティックリンクされたコマンドが並べられているが、pkgはここにない(9.2-RELEASEで確認)。

どうしたらよいか。

蘇生方法: pkgコマンドをダウンロードして、それでpkgコマンドをインストールせよ。

結論。pkgのpackageにはスタティックリンクされたpkgが含まれているのでそれを使う。
以下、手順。

pkgコマンドのダウンロード

まず、pkg.freebsd.orgからpkgコマンドのpackageをダウンロードする。
OSバージョン、アーキテクチャに合ったpackageを選ぶこと。

9.2 i386なら、以下
http://pkg.freebsd.org/freebsd:9:x86:32/latest/Latest/pkg.txz

10.0 amd64なら、以下
http://pkg.freebsd.org/freebsd:10:x86:64/latest/Latest/pkg.txz

※URLは変わる可能性があるので、都度、確認すること。
pkg.freebsd.orgから辿っていけばよい。

実行例

$ uname -a
FreeBSD ascomoid 9.2-RELEASE FreeBSD 9.2-RELEASE #0 r255898: Fri Sep 27 03:52:52 UTC 2013     root@bake.isc.freebsd.org:/usr/obj/usr/src/sys/GENERIC  i386
$ fetch http://pkg.freebsd.org/freebsd:9:x86:32/latest/Latest/pkg.txz
pkg.txz                                       100% of 1811 kB   53 kBps 00m34s

pkg-staticの取り出し。

以下のようにしてpkg-staticを取り出す。
このpkg-staticがスタティックリンクされたpkg

$ tar xvf ./pkg-1.2.4_1.tgz -s",/.*/,,g" "*/pkg-static"
x pkg-static

pkgのインストール

このpkg-staticを使って、ダウンロード済みのpkg packageをインストールする。
ローカルにダウンロード済みのpackageをインストールする場合には引数にaddを与える。
壊れたpkgが邪魔でインストールできないなら、-fを付けて強制的にインストールする。

$ sudo ./pkg-static add -f ./pkg-1.2.4_1.tgz 
Installing pkg-1.2.4_1...pkg-static: package pkg is already installed, forced install
 done
If you are upgrading from the old package format, first run:

  # pkg2ng

あとは通常通りpkg updateなど。

pkgの設定確認

pkgの設定を一覧したり、どのリポジトリを見ているかを確認するにはpkg -vvとする。
pkgについて、誰かに質問するときには、この出力も必ず付けること。

$ pkg -vv
Version                 : 1.2.4_1
PACKAGESITE             :
PKG_DBDIR               : /var/db/pkg
PKG_CACHEDIR            : /var/cache/pkg
PORTSDIR                : /usr/ports
PUBKEY                  :
HANDLE_RC_SCRIPTS       : no
ASSUME_ALWAYS_YES       : no
REPOS_DIR               : [
  /etc/pkg/,
  /usr/local/etc/pkg/repos/,
]
PLIST_KEYWORDS_DIR      :
SYSLOG                  : yes
AUTODEPS                : yes
ABI                     : freebsd:9:x86:32
DEVELOPER_MODE          : no
PORTAUDIT_SITE          : http://portaudit.FreeBSD.org/auditfile.tbz
VULNXML_SITE            : http://www.vuxml.org/freebsd/vuln.xml.bz2
MIRROR_TYPE             : SRV
FETCH_RETRY             : 3
PKG_PLUGINS_DIR         : /usr/local/lib/pkg/
PKG_ENABLE_PLUGINS      : yes
PLUGINS                 : [
]
DEBUG_SCRIPTS           : no
PLUGINS_CONF_DIR        : /usr/local/etc/pkg/
PERMISSIVE              : no
REPO_AUTOUPDATE         : yes
NAMESERVER              :
EVENT_PIPE              :
FETCH_TIMEOUT           : 30
UNSET_TIMESTAMP         : no
SSH_RESTRICT_DIR        :
PKG_SSH_ARGS            :
PKG_ENV                 : {
}
DISABLE_MTREE           : no
DEBUG_LEVEL             : 0
ALIAS                   : {
}

Repositories:
  FreeBSD: {
    url             : "pkg+http://pkg.FreeBSD.org/freebsd:9:x86:32/latest",
    enabled         : yes,
    mirror_type     : "SRV"
  }

pkgの設定ファイルなど。

以下があれば何とかなるはず。

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

FreeBSD: {
  url: "pkg+http://pkg.FreeBSD.org/${ABI}/latest",
  mirror_type: "srv",
  enabled: yes
}

以上

Tags: ,

[メモ] FreeBSD10.0-RC5にしたら全pkg/portsを再インストールしろ

Pocket

メモ。

FreeBSD 10.0-RC5にしたら、おなじ10.0からのアップグレードであっても、pkg/portsの再インストールが必要。
というのもABIの変更があったから。

必ずしもすべてのpkg/ports、というわけではないが、全部やっておいた方が安心。

ソースは以下。
http://lists.freebsd.org/pipermail/freebsd-stable/2014-January/076817.html

> > Changes between -RC4 and -RC5 include:
> >   o Revert a change to the kinfo_file structure to preserve ABI.

You should rebuild your ports after upgrading from the previous -RCs,
since there was an ABI change.

Glen

pkgの再インストールは以下のコマンドで。

pkg upgrade -fy

 

Tags: ,

pkgngでgnome2などの「一式」を削除するには。

Pocket

 

pkgngで、あるpkg、たとえばpkg Aをインストールすると、依存によりほかのpkgを大量に連れてくることがある。
それはそれで良いのだが、ではそのpkgを、依存も含めて一式アンインストールしたい場合にはどうするか。

いったんpkg Aを削除したあとに、autoremoveを使えばよい。
これはgnome2などの巨大なものでも同じ。

pkg autoremove

manより抜粋

     pkg autoremove is used for removing orphan packages, which were installed
     during dependency resolution and are no longer needed.

pkg autoremoveは、依存関係の解決のためにインストールされたがもう必要のない、いわば「孤児」pkgを削除するのにつかわれる。

実行例(gnome2削除)

以下にgnome2を削除したときの例を示す。

gnome2のレベルになると、meta-portが用意されているので、これを削除してからautoremoveすればよい。

まずはmeta-portを削除

$ pkg info|grep gnome2
gnome2-2.32.1_5 The \"meta-port\" for the GNOME 2 integrated X11 desktop
$ sudo pkg delete gnome2-2.32.1_5
Deinstallation has been requested for the following 1 packages:

gnome2-2.32.1_5

Proceed with deinstalling packages [y/N]: y
[1/1] Deleting gnome2-2.32.1_5... done
$

 

そしてautoremove

$ sudo pkg autoremove
Deinstallation has been requested for the following 322 packages:

alacarte-0.13.2_2
bitstream-vera-1.10_5
(中略)
iso8879-1986_3
libxslt-1.1.28_1
xmlcharent-0.3_2

The deinstallation will free 2 GB

Proceed with deinstalling packages [y/N]:y
(中略)
[320/322] Deleting iso8879-1986_3...xmlcatmgr: enabling compatibility mode; removing ALL matching entries
done
[321/322] Deleting libxslt-1.1.28_1... done
[322/322] Deleting xmlcharent-0.3_2... done
$

 

おしまい。

No tags for this post.

日常使いのpkgng:pkgを探してインストール

Pocket

インストールしたいpkgがある場合、どのように探すか。
pkg searchに与えるオプションを変えながら探していく。
sageというpkgを探す場合を例に取って記録しておく。

まずはsearchから

pkg seach sageですな。

$ pkg search sage
dosage-2.6
gmessage-0.2_5
gxmessage-2.12.4_1
nagios-check_cpu_usage-1.0
p5-AnyEvent-MessagePack-0.19
p5-CGI-Application-Plugin-MessageStack-0.34
p5-Catalyst-Plugin-StatusMessage-1.002000
p5-Data-MessagePack-0.48
p5-Data-MessagePack-Stream-0.07_1

山のように引っかかって面倒。
検索する文字列を考慮してみよう。

searchで正規表現

正規表現が使えるので、頭にsageとつくpkgを探す。”^sage”を与えればよいですな。

$ pkg search "^sage"
sage-0.2.0_3

一件になった。
ではインストール…の前に必ず確認。

インストールしていないpkgの詳細を知る

インストール済みのpkgであればpkg infoで調べることができる。
未インストールならどうするか。
-fを付ければよい。

$ pkg search -f "^sage"
sage-0.2.0_3
Name           : sage
Version        : 0.2.0_3
Origin         : graphics/sage
Prefix         : /usr/local
Categories     : graphics devel
Maintainer     : oliver@FreeBSD.org
WWW            : http://www.worldforge.org/dev/eng/libraries/sage
Comment        : OpenGL extension library
Shared Libs required:
        libSDL-1.2.so.11
Shared Libs provided:
        libsage.so.2
Flat size      : 953KiB
Pkg size       : 96 KB
Description    :
Sage is an OpenGL extension library written to make use of SDL's mechanism for
enabling OpenGL's extensions.

WWW: http://www.worldforge.org/dev/eng/libraries/sage

欲しいsageは数学関連のものなので、どうも違うようですな。
危なかった!
しかし狙いのsageは無いのだろうか。

カテゴリで探す

pkgはカテゴリ分けされている。
狙いのsageは数学関連であるから、おそらくmathの下にあるはずだ。

$  pkg search "^math/"|less
math/R
math/R-cran-ChangeAnomalyDetection
math/R-cran-Formula
(略)

あるいは:

$ pkg search "math\/"|less
math/R
math/R-cran-ChangeAnomalyDetection
math/R-cran-Formula
(略)

しかし。
ありませんでした。

$ pkg search "math\/"|grep sage|wc -l
       0
$

仕方がないのでportsでインストールしよう。

math/sageはportsにはないのだろうか。
psearchを使う。

$ psearch "^sage"
graphics/sage             OpenGL extension library
math/sage                 Open source Mathematics software

あった。

portsでのインストールは最小限に。

しかしportsからインストールするソフトウェアは最小限にしたい。
つまりmath/sageだけはportsを使ってもよいが、依存するものはpkgを使いたい。
本命ではない依存ソフトウェアのコンパイルなど待ちたくないし。

portmasterを使うなら-Pを与えればよい。
以下、portmasterのman抜粋。

     -P|--packages
         use packages, but build port if not available

 

$ sudo portmaster -P math/sage
(中略)
===>>> Initial dependency check complete for math/sage
===>>> math/sage >> (15)
===>>> The following actions will be taken if you choose to proceed:
        Install math/sage
        Install devel/autoconf
        Install devel/autoconf-wrapper
        Upgrade pkg-1.1.4_10 to pkg-1.2_1
        Install devel/gmake
        Install devel/m4
        Install misc/help2man
        Install devel/p5-Locale-gettext
        Install math/atlas
        Install print/teTeX-base
        Install print/teTeX-texmf
        Install print/font-amsfonts
        Install print/tex-texmflocal
        Install textproc/texi2html
        Install www/libwww
        Install devel/libtool

===>>> Proceed? y/n [y] n

pkgのアップグレードも提案された。
嫌な予感しかしない。
pkgのアップグレードはやめよう。
いったんNで抜ける。

portmasterで特定のportsのアップグレードを抑止したい。

-xオプションを使う。
portmasterのmanから抜粋。

$ portmaster --version
===>>> Version 3.17.3
$ man portmaster
     -x  avoid building or updating ports that match this pattern.  Can be
         specified more than once.  If a port is not already installed the
         exclude pattern will be run against the directory name from
         /usr/ports.

 

$ sudo portmaster -P -x pkg math/sage
(中略)
===>>> Initial dependency check complete for math/sage
===>>> math/sage >> (14)
===>>> The following actions will be taken if you choose to proceed:
        Install math/sage
        Install devel/autoconf
        Install devel/autoconf-wrapper
        Install devel/gmake
        Install devel/m4
        Install misc/help2man
        Install devel/p5-Locale-gettext
        Install math/atlas
        Install print/teTeX-base
        Install print/teTeX-texmf
        Install print/font-amsfonts
        Install print/tex-texmflocal
        Install textproc/texi2html
        Install www/libwww
        Install devel/libtool

意図した通りpkgのupgradeが外れている。
ただ…pkgレポジトリのものよりportsのバージョンが新しいとやっぱりportsが選ばれてしまう。

Tags: ,

[報告]pkg-1.2.3でproxy越しのレポジトリ接続が可能に

Pocket

pkgngのレポジトリがsrvレコードなせいで、proxy越しだったりするとpkgがダウンロードできない問題があった。

2013/12/19現在のpkg-1.2.3でこの件が修正されている。
したがって、デフォルトの設定ファイル/etc/pkg/FreeBSD.confをそのまま使うことが出来る。

以下のような状態で、つまり、FreeBSD.confが有効(enabled:yes)になっている状態で;

$ pkg -vv
Version                 : 1.2.3
(中略)
Repositories:
  FreeBSD: {
    url             : "pkg+http://pkg.FreeBSD.org/freebsd:10:x86:64/latest",
    enabled         : yes,
    mirror_type     : "SRV",
    signature_type  : "FINGERPRINTS",
    fingerprints    : "/usr/share/keys/pkg"
  }
  us-west: {
    url             : "http://pkg0.isc.freebsd.org/freebsd:10:x86:64/latest",
    enabled         : no
  }
$

pkg updateが問題なくできる。

$ sudo pkg update
Updating repository catalogue
digests.txz                         100% 1042KB 347.5KB/s 512.4KB/s   00:03
packagesite.txz                     100% 5491KB 499.1KB/s 610.6KB/s   00:11
Incremental update completed, 22191 packages processed:
0 packages updated, 0 removed and 22191 added.

ああよかった。
こちらからは以上です。

(追記)
FreeBSD-9.xの場合には以下の内容を/usr/local/etc/pkg/repos/FreeBSD.confとして保存すればよい。

FreeBSD: {
  url: "pkg+http://pkg.FreeBSD.org/${ABI}/latest",
  mirror_type: "srv",
  enabled: yes
}

 

No tags for this post.