Monthly Archives: 10月 2013

FreeBSD 10.0-BETA2にfreebsd-upgradeしたらpkgngが吹き飛んだ件について

Pocket

 

FreeBSD 10.0は、ALPHAからBETA1まで怒涛のアップデートが続いたと思ったら、BETA2でいきなり足踏みがあった。
これは、freebsd-update(8)にバグがあったためで、結果として以下の問題があったようだ。

①freebsd-updateでFreeBSD 10.0-BETA1へのアップグレードができない
②FreeBSD 10.0-BETA1でfreebsd-updateを使えない。

それが2013/10/29(日本時間)に解決された。
各OSバージョンでいったんfreebsd-updateし、最新の状態にしてから10.0-BETA2に更新すればよい。
詳細は以下。
Multiple freebsd-update bugs break upgrading to FreeBSD 10.0

油断してるとpkgngが死ぬ

もう一つ。
今回のfreebsd-updateでは、freebsd-update installを3回求められた。
あまり記憶がないのだが、前からこうだったかな..。

ただこの3回目のinstallが曲者である。
メッセージ(後述)を見ると分かるが、古いライブラリを削除するもののようだ(make delete-old-libsのようなもの)。
したがって、ports, pkgでインストールしたソフトウェアは動かなくなる可能性がある。
恐ろしいのは、pkgコマンド(pkgng)も対象であるということだ。

告白すると、「面倒くせえ。そんなもん、後でゆっくりアップグレードするわい」と進めたら、pkgが死んでその他のソフトウェアもアップグレードできなくなって頭を抱えました。はい。

さて以下に正しい手順を示す。

アップグレード例(FreeBSD 10.0-BETA1からBETA2へ)

ではまず現状の確認。
upgradeすると失敗する。
情報通りですな。

# uname -a
FreeBSD testsv 10.0-BETA1 FreeBSD 10.0-BETA1 #0 r256420: Sun Oct 13 01:43:07 UTC 2013     root@snap.freebsd.org:/usr/obj/usr/src/sys/GENERIC  amd64
# freebsd-update upgrade -r 10.0-BETA2
Password:
Looking up update.FreeBSD.org mirrors... none found.
Fetching public key from update.FreeBSD.org... done.
Fetching metadata signature for 10.0-BETA1 from update.FreeBSD.org... done.
Fetching metadata index... done.
Fetching 2 metadata files... done.

The update metadata is correctly signed, but
failed an integrity check.
Cowardly refusing to proceed any further.
#

そこでupgradeではなく、いったんupdateするとfreebsd-updateが更新される。

# freebsd-update fetch
(略)
The following files will be updated as part of updating to 10.0-BETA1-p1:
/bin/freebsd-version
/usr/sbin/freebsd-update
/var/db/mergemaster.mtree

WARNING: FreeBSD 10.0-BETA1 is approaching its End-of-Life date.
It is strongly recommended that you upgrade to a newer
release within the next 1 month.
# freebsd-update install
Installing updates... done.
#

フレッシュなfreebsd-updateで改めてアップグレード。
今度は問題なし。

# freebsd-update upgrade -r 10.0-BETA2
Looking up update.FreeBSD.org mirrors... none found.
Fetching metadata signature for 10.0-BETA1 from update.FreeBSD.org... done.
Fetching metadata index... done.
Inspecting system... done.

The following components of FreeBSD seem to be installed:
kernel/generic src/src world/base world/games world/lib32

The following components of FreeBSD do not seem to be installed:
world/doc

Does this look reasonable (y/n)?
(略)

あとは指定されるままにinstall, reboot,もう一回installをすると以下のメッセージが。

# freebsd-update install
Password:
Installing updates...
Completing this upgrade requires removing old shared object files.
Please rebuild all installed 3rd party software (e.g., programs
installed from the ports tree) and then run "/usr/sbin/freebsd-update install"
again to finish installing updates.

ここで迂闊に3回目のfreebsd-updateをすると、先述の通り面倒なことになる。
pkgコマンドですべてのソフトウェアを強制再インストールする。
man pkg-installしてもそれっぽいのが無かったので、以下のようにした。

# pkg info|cut -f1 -d" "|xargs pkg install -fy
Updating repository catalogue
pkg: No packages matching 'gettext-0.18.3.1' has been found in the repositories
(略)
[18/18] Reinstalling tmux-1.8_1... done
#

(2013/11/18 追記)
 pkg upgrade -fyですべてのpkgを再インストール可能
(2013/11/18 追記ここまで)

freebsd-update installをもう一回して終了。

freebsd-updateの修正

以上、なのだが。
今回のfreebsd-updateバグ回避方法にはもうひとつ、freebsd-updateそのものを更新する方法がある。
その方法も試したので以下に示す。
(正直に言うと、ERRATAの「Perform one of the following:」を読み飛ばし、freebsd-updateにパッチ当てるという余計な手間をかけた。悔しいので手順を示す)

とはいえ、freebsd-updateの修正とOSアップデート手順は先述URLに丁寧に書かれている。
英語ではあるけれども、鍛えられたFreeBSDソルジャーなら屁でもない。
が、どこかに有用と感じてくれる人がいるかもしれない。
以下は10.0-BETA1から10.0-BETA2にアップグレードした例。

必要なものはsrc。
gpgもあるといいけど、まあ要らない。

srcの展開

srcのある人はスキップしてよい。
bsdconfigやら、DVDイメージ、DVDから展開する。
以下はDVDから展開する例(実際は仮想マシンからディスクイメージ読んでるだけなんですけどね)。

$ sudo mount -t cd9660 /dev/cd0 /mnt
$ cd /mnt/usr/freebsd-dist
$ sudo tar -C / -xvzpf ./src.txz
(略)

 

gnupgのインストール

これも、まあ本気のサーバ管理をしている人以外は不要じゃないかな。
以下はpkgでインストールする例。
意外にたくさんのお友達を連れてきた。

$ pkg search gnupg
gnupg-1.4.15
gnupg-2.0.22
pecl-gnupg-1.3.3_1
py27-gnupg-1.2.3
qca-gnupg-2.0.0.b3_1
$ sudo pkg install gnupg-2.0.22
Updating repository catalogue
The following 8 packages will be installed:

        Installing libgpg-error: 1.12
        Installing libgcrypt: 1.5.3
        Installing libassuan: 2.1.1
        Installing ca_root_nss: 3.15.1_1
        Installing curl: 7.32.0
        Installing pth: 2.0.7
        Installing libksba: 1.3.0
        Installing gnupg: 2.0.22

The installation will require 15 MB more space

3 MB to be downloaded
(略)

 

パッチの入手と適用

gnupgのない人は拡張子.ascのダウンロードは不要。

$ fetch http://security.freebsd.org/patches/EN-13:04/freebsd-update.patch
fetch: http://security.freebsd.org/patches/EN-13:04/freebsd-update.patch: size of remote file is not known
freebsd-update.patch                                  2754  B   25 kBps 00m00s
$ fetch http://security.freebsd.org/patches/EN-13:04/freebsd-update.patch.asc
fetch: http://security.freebsd.org/patches/EN-13:04/freebsd-update.patch.asc: size of remote file is not known
freebsd-update.patch.asc                               801  B 3785  Bps 00m00s
$

gpgでファイルの確認。
gpgが無ければスキップしてよい。

$ gpg --verify ./freebsd-update.patch.asc
Warning: using insecure memory!
gpg: Signature made Sun Oct 27 05:14:13 2013 JST using RSA key ID 5DCF6AE7
gpg: Good signature from "FreeBSD Security Officer <security-officer@FreeBSD.org>"
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: 1CF7 FF6F ADF5 CA9F BE1B  8CB2 ED67 ECD6 5DCF 6AE7

なんかWARNINGでてるけどまあいいでしょ。

パッチ適用

$ cd /usr/src
$ sudo patch < ~/somewhere/freebsd-update.patch
Hmm...  Looks like a unified diff to me...
The text leading up to this was:
--------------------------
|Index: usr.sbin/freebsd-update/freebsd-update.sh
|===================================================================
|--- usr.sbin/freebsd-update/freebsd-update.sh
|+++ usr.sbin/freebsd-update/freebsd-update.sh
--------------------------
Patching file usr.sbin/freebsd-update/freebsd-update.sh using Plan A...
Hunk #1 succeeded at 1200.
Hunk #2 succeeded at 2814.
Hunk #3 succeeded at 2852.
Hunk #4 succeeded at 2876.
done

 

freebsd-updateのコンパイルとインストール

$ cd /usr/src/usr.sbin/freebsd-update/
$ sudo make install -DWITHOUT_MAN
install -o root  -g wheel -m 555  freebsd-update.sh  /usr/sbin/freebsd-update
$

10.0-BETA1のみ以下を実行

$ sudo sed -i '' -e 's/%@/%~@/' /usr/sbin/freebsd-update

freebsd-updateの修正は以上で完了。
改めてfreebsd-updateを実行すればよい。

以上

No tags for this post.

お手軽ミラーユーティリティcpdup

Pocket

rsyncの悩み

ディレクトリの同期とくればrsyncが定番でありオンリーワンと言えよう。

ただこのrsync、久しぶりに使うとコマンド書式を忘れてて苦労するのですよ。
「確かオプションは-avzだったかな」「リモートホストの指定方法はなんだっけ・・・」とmanとしばらく格闘するわけですな。

ディレクトリ指定の複雑さ

加えてディレクトリの指定の仕方も理解しにくい。

例えば、二つのディレクトリを同期させたいとき。
rsync -avz dirA dirBを実行すると、こんなことが起こる(確かこうだった…。スラッシュがあるかないかで違ったかも)。

  • dirBがないとき
    →dirBが作られる。
  • すでにdirBがあるとき
    →dirB/dirAが作られる。

前者をイメージしていたのに、後者のパターンにゲンナリすることがよくある。
そこで使えるのがcpdupである。

お手軽ミラーユーティリティcpdup

cpdupはファイルシステムのミラーを作るユーティリティである。
「ファイルシステムの」と書いたのは、ハードリンク、ソフトリンク、デバイス、パーミッションなども面倒見てくれるからである。

リモートホストと同期させる場合のプロトコルにはsshが使われる。
また、リモートホストにもインストールが必要。

rsyncの代替にはならないけれども、手軽で、わかりやすいインタフェースを持つ。

manはこちら。
http://linux.die.net/man/1/cpdup

cpdupのインストール

FreeBSDだと、portsならsysutils/cpdup。pkgでもOK。
Linuxでもパッケージから手に入るでしょう。
リモートと同期させる場合には、リモートホストにもcpdup入れておくこと。

cpdup書式

書式は以下の通り。
オプションは一部。全部見たいならmanでどうぞ。

cpdup [-C] [-v[v]] [-d] [-I] [-i0] [-o] [-q] <ソースDir> <tターゲットDir>

通常的に使うオプションは、「-C -vv -d -I]でよいと思う。

-C    リモートホストとファイル送受をするとき、sshコネクションを圧縮する。
-vv   処理状況を表示させる。v一つだと変更のあったときしかメッセージが表示されないので、v二つがよい。
-d    処理の行われるディレクトリを表示させる。
-I    処理が終わったあとにサマリを表示させる。
-i0   確認せずにファイルやディレクトリを削除する。
-o    削除を一切しない。追加か上書きのみ。
-q    表示をさせない。


cpdup実行例

まず手元にファイルを含むディレクトリを作る。
下記の例ではtestDirディレクトリに、a, b, c, d, e, fというファイルを作った。

$ mkdir testDir
$ cd testDir/
$ touch a b c d e f
$ ls
a       b       c       d       e       f
$ cd ..

典型例

ではこれをcpdupしてみよう。
リモートの192.168.154.241にコピーする。
基本の「-C -vv -d -I」で。
出力がとても分かりやすい。

$ cpdup -C -vv -d -I ./testDir 192.168.154.241:~/testDir
Password:
Handshaked with cal01
~/testDir
Scanning ./testDir ...
~/testDir/f                      copy-ok
~/testDir/a                      copy-ok
~/testDir/e                      copy-ok
~/testDir/b                      copy-ok
~/testDir/c                      copy-ok
~/testDir/d                      copy-ok
cpdup completed successfully
0 bytes source, 0 src bytes read, 0 tgt bytes read
0 bytes written (nanX speedup)
6 source items, 6 items copied, 0 items linked, 0 things deleted
2.5 seconds     0 Kbytes/sec synced     0 Kbytes/sec scanned

 

ターゲットにすでにディレクトリがあってもOK.

そこでもう一度同じコマンドを実行してみる。
何もコピーされない。
これがもしrsyncだと、testDir/testDirが作られることになる。

$ cpdup -C -vv -d -I ./testDir 192.168.154.241:~/testDir
Password:
Handshaked with cal01
~/testDir
Scanning ./testDir ...
cpdup completed successfully
0 bytes source, 0 src bytes read, 0 tgt bytes read
0 bytes written (nanX speedup)
6 source items, 0 items copied, 0 items linked, 0 things deleted
2.6 seconds     0 Kbytes/sec synced     0 Kbytes/sec scanned

 

ターゲットのファイルを削除するときは確認あり。

では手元の./testDir/aを削除してもう一度。
ターゲットのtestDir/aを削除するか、聞いてくれる。

$ rm ./testDir/a

$ cpdup -C -vv -d -I ./testDir 192.168.154.241:~/testDir
Password:
Handshaked with cal01
~/testDir
Scanning ./testDir ...
remove ~/testDir/a (Yes/No) [No]? yes
cpdup completed successfully
0 bytes source, 0 src bytes read, 0 tgt bytes read
0 bytes written (nanX speedup)
5 source items, 0 items copied, 0 items linked, 1 things deleted
4.3 seconds     0 Kbytes/sec synced     0 Kbytes/sec scanned

 

-i0で削除時の確認を抑制

今度は手元の./testDir/bを削除し、-i0を付けてみる。
確認なくターゲットのbを削除している。

$ rm ./testDir/b
$
$ cpdup -C -vv -d -I -i0 ./testDir 192.168.154.241:~/testDir
Password:
Handshaked with cal01
~/testDir
Scanning ./testDir ...
~/testDir/b                      remove-ok
cpdup completed successfully
0 bytes source, 0 src bytes read, 0 tgt bytes read
0 bytes written (nanX speedup)
4 source items, 0 items copied, 0 items linked, 1 things deleted
2.6 seconds     0 Kbytes/sec synced     0 Kbytes/sec scanned

 

-oでターゲットの削除を抑制

さらに手元の./testDir/cを削除し、-oを付けてみる。
ターゲットのcの削除はされない。

$ rm ./testDir/c
$
$ cpdup -C -vv -d -I -o ./testDir 192.168.154.241:~/testDir
Password:
Handshaked with cal01
~/testDir
Scanning ./testDir ...
~/testDir/c                      not-removed
cpdup completed successfully
0 bytes source, 0 src bytes read, 0 tgt bytes read
0 bytes written (nanX speedup)
3 source items, 0 items copied, 0 items linked, 0 things deleted
2.6 seconds     0 Kbytes/sec synced     0 Kbytes/sec scanned

 

メッセージの抑制

メッセージ表示のオプションをすべて外してみる。
出力がかなり減った。

$ cpdup -C -o ./testDir 192.168.154.241:~/testDir
Password:
Handshaked with cal01
$

さらに-qを付けてみる。
出力が一切ない。

$ cpdup -C -q -o ./testDir 192.168.154.241:~/testDir
Password:
$

 

たいへん結構。ではスピードは?

rsyncとどれくらい違うか、実験してみた。

FreeBSD 9.2-RELEASEのソースをミラーリングしてみた。
5696のディレクトリに52315のファイルがあり、サイズは800MBである。

ハードウェアのスペックは割愛。
Windows上のVMがソース、古いDELLマシンがターゲットなので…。

rsyncには-avzを、cpdupには-C -vv -d -Iを与えた。

結果。

rsyncは6分。

sent 191011733 bytes  received 1016783 bytes  518295.59 bytes/sec
total size is 686599114  speedup is 3.58

real    6m10.328s
user    0m38.497s
sys     0m33.395s

cpdupは30分。
…30分!?

686599114 bytes source, 686599114 src bytes read, 0 tgt bytes read
686599114 bytes written (1.0X speedup)
52315 source items, 58011 items copied, 0 items linked, 0 things deleted
1893.2 seconds   708 Kbytes/sec synced   354 Kbytes/sec scanned

real    31m33.236s
user    0m8.380s
sys     0m16.133s

ま、まあ、スピードの点では、cpdupはまったく話にならないですな…。
(転送量を見るとcpdupの方はspeedupがあまり効いてないように見えるなあ。)

ミラーリングとは言っても、初回のフルコピーだから、差分コピーだとまた違った結果が得られるかもしれない。
ただちょっとここまで差があると試す気にもなりまへん。

まとめ

cpdupはちょっとしたミラーリングの時に使うには、手軽で書式もわかりやすいので有用、いっぽう、気合い入れてやるミラーリングはrsyncで、って事でいいんじゃないでしょうかね。

No tags for this post.

らくらく構築、CalDAVサーバBaikal

Pocket

カレンダーサーバのBaikalを試してみたので記す。

ここでのカレンダーサーバとは、Googleカレンダーのようなものですな。
「だったらそんなのGoogleカレンダーでいいじゃないか」というのは仰るとおりだが、そもそも環境の都合上、Googleカレンダーへの接続ができないとか、PRISM以降、オンラインサービスを信用ならない向きには有用なサービスであります。

カレンダーサーバの選択

とはいえ、カレンダーサーバ(以降、CalDAVサーバ)を選ぶにも、かなりの数が作られている。
Wikipedia(英語版)で調べてみると、各種CalDAVサーバが一覧にされた比較表が出てくる。
これを参考に選んでみよう。

http://en.wikipedia.org/wiki/Comparison_of_CalDAV_and_CardDAV_implementations

いろいろ眺めてみて、かつ、少しかじってみて、Baikalを選んだ。
いずれのCalDavサーバも機能は一長一短なので、構築がとっても楽だったBaikalに決めた。

Baikalとは。

SabreDAVをベースにしたCalDAV, CardDAVサーバである。
オフィシャルサイトはこちら
しかしこのサイトにはドキュメントがまったくないので、GitHubのこちらを勧める。
RequirementはPHP5.3以降にSQLite3、php-pdo。データベースにはMySQLも利用できる。
WebDAVサーバも必要だが、apache, nginx, lighttpd等、どれでもいいでしょう。
さっそくインストールしてみる。

Baikalのインストール

これはなんでもない。
FreeBSDならpkgngにあるのでそれで。portsならwww/baikal 。
依存も少なめで非常にいい。

インストールが終わると以下のメッセージが表示される。

To finish installing Baikal:
        1) Set up an httpd directive
           See /usr/local/share/examples/baikal
        2) touch /usr/local/www/baikal/Specific/ENABLE_INSTALL
        3) Browse http://your.host.here/admin
        4) rm /usr/local/www/baikal/Specific/ENABLE_INSTALL

上記メッセージに沿って進める。

 

httpサーバの設定

FreeBSDだと/usr/local/www/baikalにインストールされる。
それぞれのhttpサーバでbaikalのインストールされたディレクトリを公開する。
ただし公開するのはbaikalのhtmlディレクトリ。
/usr/local/www/baikal/html/である。

私の場合、/usr/local/www/dataがhttpサーバのドキュメントRootだった。
webサーバでaliasの設定をすべきだが、面倒なので横着してsymlink張った。

# ln -s /usr/local/www/baikal/html /usr/local/www/data/baikal
# ls /usr/local/www/data
baikal          index.html

 

Baikalのセットアップ

インストール時メッセージに沿う。
SpecificフォルダにENABLE_INSTALLというファイルを作る。

# touch /usr/local/www/baikal/Specific/ENABLE_INSTALL
# ls /usr/local/www/baikal/Specific
.htaccess       ENABLE_INSTALL  db

その後、ブラウザで接続。
http://<baikalサーバ>/baikal/admin へ。
うまくすれば以下の画面になるはず。

baikal01

データベースセットアップ。
SQLiteならそのまま進む。
baikal02
baikal03

一通りの設定が終わったのでダッシュボードへ。
baikal04

終わったらSpecific/ENABLE_INSTALLを削除すること。

ユーザ、カレンダの追加

上記からの流れでdashboardに移動しているはず。
メニューバーのユーザ管理をクリックしていけばユーザ、カレンダー追加ができる。

baikal05

baikal06
ここでのパスワードは、あとあとカレンダーへアクセスするときに必要になるもの。

ユーザを作ったら、カレンダーをクリック。

baikal07

カレンダーが出来ていますね。
baikal08

 

カレンダーへのアクセス

CalDAVに対応しているならなんでもいい。
ここのClient Implementationsにズラリと並んでいるどれでもOK.
iOS, Androidだって、よりどりみどり。

ここでは、ThunderbirdのLightningからアクセスする例を示す。

lightning

CalDAVを選び、アドレスに以下を入れる。

http://<IPアドレス>/baikal/cal.php/calendars/<ユーザ>/default

たとえば、http://192.168.154.241/baikal/cal.php/calendars/doe/default

以上。

No tags for this post.

nginxとlighttpdで悩んでlighttpd + php5 + fastcgiのインストールと設定へ

Pocket

apacheは吊るしのFreeBSD pkgでphpを使えない。

10.0-BETA1にして曲がりなりにもpkgが普通に使えるようになって、あまりの便利さに感動し、追加ソフトウェアはすべてpkgにしようと決めたのだが。

apacheとphpでいきなり壁に当たりました。
apacheをpkgでインストールすると、phpのモジュールが付いてこないのである。
phpモジュールが欲しいなら、apacheをportsからインストールしないといけない。

もちろん、pkgngはportsと一緒に使えるよう考えて作られている。
apacheだけportsからインストールしたって何の問題もない。
ただ、あの巨大な/usr/portsディレクトリをメンテしていくのが億劫なわけですよ。

ならばよろしいapacheはもう捨てよう。
たぶんまた、吊るしのpkgで使えないソフトウェアが出てくると思うが、その時はその時考えよう。

nginx, lighttpdのどちらがよいか。

apacheの代替といってすぐに思い浮かぶのはnginxとlighttpdである。

“nginx lighttpd comparison”などとググってみると、いくつかのもまとめがヒットする。

http://www.wikivs.com/wiki/Lighttpd_vs_nginx
http://wiki.dreamhost.com/Web_Server_Performance_Comparison

軽く速く柔軟な設定が可能という点では同じだが、概観したところnginx優勢のようである。

また、lighttpdには品質面で気になる点もある。
どうも長い間放置されているメモリリークがあるようだ。

ただlighttpdの設定のほうが分かりやすい、というのは皆の認めるところらしい。
メモリリークは心配だが、さっさとhttpサーバを設定したいのでlighttpdを選択。

以下、lighttpdでphpを、fastcgiで動かす。
環境はFreeBSD 10.0-BETA1。pkgngでインストール。
設定方法は他OSでも参考になる部分があるかも。

lighttpd, php5のインストール

pkgでインストール。
簡単。
lighttpdは依存も少ない。

# pkg install php5 lighttpd
(略)

 

php5のバージョン確認

lighttpdを扱う前に、phpを確認する。
fastcgi対応かどうか。

“php5″でインストールされたのは5.4.20
/usr/local/bin/php-cgiを確認すると、特に指定や追加のインストールの必要なくfastcgi対応であることが分かる。

# php -v
PHP 5.4.20 (cli) (built: Oct  3 2013 03:35:30)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies

# php-cgi -v
PHP 5.4.20 (cgi-fcgi) (built: Oct  3 2013 03:35:34)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies

 

lighttpdのファイル配置

lighttpdとしてインストールされたファイルを確認する。

設定ファイル
/usr/local/etc/lighttpd下に。

# cd /usr/local/etc/lighttpd/
# ls
RCS                     lighttpd.conf.sample    vhosts.d
conf.d                  modules.conf
lighttpd.conf           modules.conf.sample

ドキュメントルート
初期状態では/usr/local/www/dataだが、ディレクトリは自分で作る必要がある。

lighttpdのログファイル
初期状態では/var/log/lighttpd下に。

# cd /var/log/lighttpd/
# ls
access.log      error.log

ファイルを確認したら、lighttpdの設定に移る。

lighttpdの設定

流れとしては、

  1. lighttpd.confで全体の設定を、
  2. modules.confで読み込むモジュールの設定を、
  3. conf.d/下の*.confで各モジュールの設定を行う。

fastcgiを使うなら、
lighttpd.confで設定ののち、
modules.confでfastcgiのモジュールを読み込む指定をし、
conf.d/fastcgi.confでphpの指定をする、となる。

なお、php.iniにも一部変更が必要。

lighttpdオフィシャルのチュートリアルはここ
以下、/usr/local/etc/lighttpd下にある設定ファイルに手を加えていく。

lighttpd.confの修正

lighttpd.conf.sampleから変えたのは以下の3行だけ。

server.use-ipv6 = "disable"
server.bind = "192.168.154.241"
$SERVER["socket"] == "192.168.154.241:80" { }

コメント行、空行を除いたlighttpd.confは以下の通り。
include “modules.conf”と指定がある通り、ここでmoduleを読み込んでいる。

# grep -v "^#" ./lighttpd.conf|grep -v "^$"
var.log_root    = "/var/log/lighttpd"
var.server_root = "/usr/local/www/data"
var.state_dir   = "/var/run"
var.home_dir    = "/var/spool/lighttpd"
var.conf_dir    = "/usr/local/etc/lighttpd"
var.vhosts_dir  = server_root + "/vhosts"
var.cache_dir   = "/var/cache/lighttpd"
var.socket_dir  = home_dir + "/sockets"
include "modules.conf"
server.port = 80
server.use-ipv6 = "disable"
server.bind = "192.168.154.241"
server.username  = "www"
server.groupname = "www"
server.core-files = "disable"
server.document-root = "/usr/local/www/data/"
server.tag = "lighttpd"
server.pid-file = state_dir + "/lighttpd.pid"
server.errorlog             = log_root + "/error.log"
include "conf.d/access_log.conf"
include "conf.d/debug.conf"
server.event-handler = "freebsd-kqueue"
server.network-backend = "writev"
server.max-fds = 2048
server.stat-cache-engine = "simple"
server.max-connections = 1024
index-file.names += (
"index.xhtml", "index.html", "index.htm", "default.htm", "index.php"
)
url.access-deny             = ( "~", ".inc" )
$HTTP["url"] =~ "\.pdf$" {
server.range-requests = "disable"
}
static-file.exclude-extensions = ( ".php", ".pl", ".fcgi", ".scgi" )
include "conf.d/mime.conf"
include "conf.d/dirlisting.conf"
server.follow-symlink = "enable"
server.upload-dirs = ( "/var/tmp" )
$SERVER["socket"] == "192.168.154.241:80" { }

 

modules.conf

lighttpd.confで指定されたmodules.confの設定。
どんなmoduleを読み込むか。
以下の行を有効にしただけ。
つまりfastcgiを有効に。
そのほかにも興味深そうなmoduleはあるがミニマルスタートが原則。

include "conf.d/fastcgi.conf"

コメント行、空行を除いたlighttpd.confは以下の通り。

# grep -v "^#" ./modules.conf|grep -v "^$"
server.modules = (
"mod_access",
)
include "conf.d/fastcgi.conf"

 

conf.d/fastcgi.conf

fastcgiの設定。
phpをどう実行するかを指定できる。

ローカルのphp-cgiでもよいし、ローカルホストの別webサーバ(apacheとか)でもよいし、はたまた別ホストのwebサーバでもよい。
詳細はこちら

ここでは、ローカルの/usr/local/bin/php-cgiを使う。
fastcgi対応のphpである。

ローカルなのでIPアドレスやTCP/IPポートの指定は不要で、UNIXドメインソケットして使うファイルを指定すればよい。
最終的に以下の行を追加

fastcgi.server = ( ".php" =>
                    (("bin-path" => "/usr/local/bin/php-cgi",
                      "socket" => "/tmp/php.socket"
                     ))
                 )

コメント行、空行を除いたlighttpd.confは以下の通り。

server.modules += ( "mod_fastcgi" )
fastcgi.server = ( ".php" =>
        (("bin-path" => "/usr/local/bin/php-cgi",
        "socket" => "/tmp/php.socket"
        ))
        )

以上でlighttpdの設定は完了

php.iniの設定

lighttpdのドキュメントを見ると以下のように書いてあるので、php.iniを修正する。

If you want to use PATH_INFO and PHP_SELF in you PHP scripts you have to configure php and lighttpd. The php.ini needs the option:
cgi.fix_pathinfo = 1

FreeBSDだとphp.iniは/usr/local/etcに置かれるべきもの。
初期状態ではphp.iniが無いので、sampleからコピーする。
sampleにはphp.ini-developmentとphp.ini-productionの二つがある。
developmentの方を選んだ。

# cd /usr/local/etc/
# cp php.ini-development php.ini

以下の行のコメントを外す。

cgi.fix_pathinfo=1

 

起動確認

/usr/local/www/dataを作り、”It works!”とでも書いたindex.htmlを作る。

# mkdir /usr/local/www/data
# echo "It works" > /usr/local/www/data/index.html

FreeBSDなら/etc/rc.confに以下の行を追加。

# enable lighttpd at boot
lighttpd_enable="YES"

 

起動。

# service lighttpd start
Performing sanity check on lighttpd configuration:
Syntax OK
Starting lighttpd.

 

ログに異常もなし。

# tail /var/log/lighttpd/error.log
2013-10-22 21:30:20: (log.c.166) server started
#

 

ブラウザでつないで、index.htmlが表示されればOK。

No tags for this post.

[FreeBSD] pkg -j でjailの「外から」pkgng操作を。

Pocket

サマリ

pkg -jを使うと、ホストからjail内のpkgを操作できる。
しかし、あらかじめjail内にpkgのインストールが必要。

pkg -j

pkgのmanを見ると以下の記載が。

     -j <jail name or id>
             pkg will execute in the given <jail name or id>, where name
             matches ``jls name'' and id matches ``jls jid''.  See jail(8) and
             jls(8).

つまり、-jに続けてjail名あるいはjail idを指定すれば、ホストから当該jail内のpkgを操作できる、ということである。
これはさっそく試さねばなるまい。
qjailを使ってexmaple02というjailを作った。

$ sudo qjail create -n em0 -4 192.168.100.241 example02
Successfully created  example02
[vanilla@yaryka ~]$ sudo qjail start example02
Jail successfully started  example02
[vanilla@yaryka ~]$ sudo qjail list

STA JID  NIC IP              Jailname
--- ---- --- --------------- --------------------------------------------------
DR  1    em0 192.168.100.240 example01
DR  2    em0 192.168.100.241 example02

 

さっそく試してみるが…?

$ sudo pkg -j example02 info
$ sudo pkg -j example02 update
Updating repository catalogue
$ sudo pkg -j example02 install bash
Updating repository catalogue
$

まったく反応がない。

いろいろ試した結果、jailにはpkgがあらかじめインストールされていなければならないのであった。

jailでpkgのインストール

仕方なくjailのコンソールに接続し、pkgをインストール。
現時点ではpkgの公式リポジトリがないので、こちらの通りに進める。

$ sudo qjail console example02
FreeBSD 10.0-BETA1 (GENERIC) #0 r256420: Sun Oct 13 01:43:07 UTC 2013

Welcome to your FreeBSD jail.
example02 /root >sh
# PACKAGESITE="http://96.47.72.120/pkg-test-freebsd:10:x86:64/latest" pkg
The package management tool is not yet installed on your system.
Do you want to fetch and install it now? [y/N]: y
Bootstrapping pkg please wait
Installing pkg-1.1.4_6... done
If you are upgrading from the old package format, first run:
(略)

もう一度ホストからpkgを実行。
今度は問題なく進んだ。

$ sudo pkg -j example02 update
Updating repository catalogue
digests.txz                         100%  955KB 191.0KB/s 214.8KB/s   00:05
packagesite.txz                     100% 5209KB 226.5KB/s  28.6KB/s   00:23
Incremental update completed, 0 packages processed:
0 packages updated, 0 removed and 21607 added.
$

 

jailの外からpkg -jでpkg操作

ではjailの外からインストールを。

$ sudo pkg -j example02 install bash
Updating repository catalogue
The following 2 packages will be installed:

        Installing gettext: 0.18.3
        Installing bash: 4.2.45

The installation will require 14 MB more space

3 MB to be downloaded

Proceed with installing packages [y/N]: y
gettext-0.18.3.txz                  100% 2086KB 231.8KB/s  85.9KB/s   00:09
bash-4.2.45.txz                     100%  890KB 222.6KB/s 410.2KB/s   00:04
Checking integrity... done
[1/2] Installing gettext-0.18.3... done
[2/2] Installing bash-4.2.45... done
$

-jオプションを付けるだけで、まったく同じように使える。
infoで一覧も得られるし、auditでセキュリティチェックもできる。upgradeもできそうだ。

$ sudo pkg -j example02 audit -F
auditfile.tbz                       100%   90KB  90.3KB/s  90.3KB/s   00:00
0 problem(s) in your installed packages found.
$ sudo pkg -j example02 info
Password:
bash-4.2.45                    The GNU Project's Bourne Again SHell
gettext-0.18.3                 GNU gettext package
pkg-1.1.4_6                    New generation package manager
$ sudo pkg -j example02 upgrade
Updating repository catalogue
Nothing to do
$

こいつは便利でございますな。

 

 

 

 

 

 

 

No tags for this post.

10.0-BETA1でezjailが息してない→qjailに乗り換えた。

Pocket

 

せっかく覚えたezjailが息してない

jailの設定ファイルが、rc.conf,/etc/rc.d/jailからjail.confに変わる。

https://twitter.com/m_bird/status/386369822751076352

そのせいか10.0-BETA1にしたら、ezjail使うたび怒られるようになった。
具体的にはezjail-adminでjailをうまく起動できない。
ezjail覚えたばっかなのに…。

「手動でなんとかしろよ」とエラーメッセージが出るのだが、jailの仕組みはとても複雑で、jail.confの書式も良くわからないしsampleもない。
「rc.d, rc.confをそのままコピー&ペーストしたらいいんだよ」とは言うのだけど、そもそもrc.d, rc.confを自分で書くのが嫌でezjail使ってたのに。

しょうがないんで、あんまり深く追いかけずに別のラッパーであるqjailを試した。

なかなか独特のテイストが感じられるのだが、思ったより手軽で、ドキュメントも(時にはウンザリするくらい)充実している。
もちろんjail.confにも安心対応。

数十個ものjailを作ることも出来たり、一度作成したjailをテンプレートにする機能もあったりして驚く。

ググった感触でいうとあんまり人気ないみたいだけど、結構いい。
細けえ事はどうでもいいからjailを使わせろという諸兄にはおすすめである。

qjailのインストール

2013/10/18時点で2.2と3.2がある。
jail.confに対応しているのは3.2。

話は前後するが、qjail3.2のman qjail(8)から抜粋すると;

This version of qjail has been converted from using the legacy rc.d
rc.conf method of jail definition as used in all pervious versions of
qjail, to using the jail(8) jail.conf method which became available in
9.1-RELEASE.

よって3.2をインストール。
なお、以下でqjailをインストールするFreeBSDは10.0-BETA1でございますので、pkgngを使います。

$ pkg search qjail
qjail-2.2
qjail-3.2
$ sudo pkg install qjail-3.2
Password:
Updating repository catalogue
The following 1 packages will be installed:

        Installing qjail: 3.2

The installation will require 416 KB more space

116 KB to be downloaded

Proceed with installing packages [y/N]: y
qjail-3.2.txz                       100%  116KB 115.9KB/s 115.9KB/s   00:01
Checking integrity... done
[1/1] Installing qjail-3.2... done
########################################################################
Use the qjail utility to deploy small or large numbers of jails quickly.

First issue "rehash" command to enable the qjail command (if using csh).
Then issue "man qjail-intro" to read the qjail introduction.
After reading that do "man qjail" for the usage details.
For the BIG PICTURE issue "man qjail-howto".

########################################################################
For instructions on upgrading jail filesystems
Read /usr/local/share/examples/qjail/upgrade-info.txt
$

 

qjailでの初期設定

まずはjailのひな形、ベース環境を作る。
qjail installでよい。
ひな形取得先のftpサーバを変更するならオプションで指定する。
書式は以下。

qjail install -h ftp2.jp.freebsd.org

 

RELEASE以外でのqjail install

しかし、ftpサーバからダウンロードできるのはRELEASEのみ。
BETA, RC, ALPHA, STABLE等々だとダメ。
回避方法は二つ。

①なんでもいいのでRELEASEで作っておいてアップグレードする
②ダウンロードしたディスクイメージを使う。

今回は②にした。
①はman qjail参照。
②をもう少し細かく書くと、ディスクイメージをマウントし、base.txzなどのある「ディレクトリ」をqjail install -fに続けて指定する。

「ディレクトリ」とわざわざ書いたのは、cdで行けるところ、というのを強調したかったから。
ディスクイメージの直接指定はできないし、ftpサーバのディレクトリ指定もダメ。
ガッカリ。

(追記)RELEASE以外でのqjail install

「RELEASE以外」というのは、実はRELEASE-p2といったような、パッチレベルが0以外の場合も該当する。
つまりfreebsd-updateでパッチを当てた状態でqjail installすると失敗する。
これは、qjailは自ホストのOSバージョンをもとにディレクトリを移動するから。
OSバージョンが10.1-RELEASE-p16だったら、ftpサーバの10.1-RELEASE-p16などを見に行ってしまう。
しかし、ftpサーバはパッチレベルごとにはディレクトリが作られないので、参照先がなく失敗する。

ところで、ここでのOSバージョンとは、具体的には環境変数UNAME_rである。
ということは、qjail installのときだけUNAME_rを変更すればパッチレベルが変わっていようがよいのである。
以下、10.1-RELEASE-p16で実行した例。

root@kraken:/usr/local # setenv UNAME_r "10.1-RELEASE"
root@kraken:/usr/local # qjail install -h ftp2.jp.freebsd.org
Trying 202.232.140.170:21 ...
Connected to ftp.iij.ad.jp.
220 IIJ FTP server ready (IPv4 client).
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
200 Switching to Binary mode.
250 Directory successfully changed.
local: base.txz remote: base.txz
229 Entering Extended Passive Mode (|||52115|).
150 Opening BINARY mode data connection for base.txz (66173780 bytes).
 85% |*****************************      | 54994 KiB  999.68 KiB/s    00:09 ETA
226 Transfer complete.
66173780 bytes received in 01:03 (0.99 MiB/s)
221 Goodbye.

The RELEASE distribution files are populating template.
Est LT 1 minute elapse time for this to complete.

Successfully installed qjail system.

追記ここまで

ダウンロードしたディスクイメージからqjail install

仕方がないので淡々と進める。
10.0-BETA1のイメージダウンロードして、ローカルでマウント。

$ fetch ftp://ftp.iij.ad.jp/pub/FreeBSD/releases/ISO-IMAGES/10.0/FreeBSD-10.0-BETA1-amd64-disc1.iso
FreeBSD-10.0-BETA1-amd64-disc1.iso            100% of  693 MB 8138 kBps 01m27s
$
$ sudo mdconfig -a -t vnode -f ./FreeBSD-10.0-BETA1-amd64-disc1.iso -u 0
$ sudo mount -t cd9660 /dev/md0 /mnt

/mntにマウントしたとすると、/mnt/usr/freebsd-dist/が目的の場所。

$ ls /mnt
COPYRIGHT       etc             mnt             sbin            var
bin             lib             proc            sys
boot            libexec         rescue          tmp
dev             media           root            usr
$ ls /mnt/usr
bin             include         libdata         obj             src
freebsd-dist    lib             libexec         sbin            tests
games           lib32           local           share
$ ls /mnt/usr/freebsd-dist/
MANIFEST        doc.txz         kernel.txz      src.txz
base.txz        games.txz       lib32.txz
$

qjail install -fで実行。
終わったらマウントも外そう。

$ sudo qjail install -f /mnt/usr/freebsd-dist/                  
The RELEASE distribution files are populating template.
Est LT 1 minute elapse time for this to complete.

sharedfs is being populated.
Est LT 1 minute elapse time for this to complete.

Successfully installed qjail system.
$
$ sudo umount /mnt
$ sudo mdconfig -d -u 0

 

qjailの構成

/usr/jailsにいくつかのディレクトリが生まれる。
また、設定ファイルが/usr/local/etc/に格納される。

/usr/jails下は以下の通り。

$ ls /usr/jails
archive         flavors         sharedfs        template

sharedfs:
OSの実行ファイル、ライブラリ。全Jailで共有される。

$ ls /usr/jails/sharedfs/
bin     lib     libexec sbin    sys     usr

template:
OS configuration fileがある。設定変えようと思ったらここかな。

$ ls /usr/jails/template/
COPYRIGHT       home            mnt             sharedfs        var
bin             lib             proc            sys
dev             libexec         root            tmp
etc             media           sbin            usr

archive:
初期状態では空。
qjail archiveコマンドで作成されるアーカイブが格納される。

flavors:
flavorですな。defaultとssh-defaultの二つがある。

$ ls /usr/jails/flavors/
default         ssh-default

そのほか、/usr/local/etc/下に以下のようなファイル、ディレクトリがたくさん出来る。
jailを作ると今度はこのディレクトリの下にjail名でファイルができる。
global, local, vnetの意味が、想像はできるもののよく分からない。

$ ls /usr/local/etc/qjail*
/usr/local/etc/qjail.portsnap.conf
/usr/local/etc/qjail.fstab:
/usr/local/etc/qjail.global:
/usr/local/etc/qjail.local:
/usr/local/etc/qjail.vnet:

 

jailの作成

書式。代表的なもののみ。

qjail create -n <NIC name>  -f <flavor> -a <アーカイブ> \
 -4 <割り当てるIPアドレス>  jailname

-fと-aは一緒に使えない。

実際に作ってみる。
あっさりと出来上がる。
あっさりしすぎて逆に不安なくらい。

$ sudo qjail create -n em0 -4 192.168.100.240 example01
Successfully created  example01

気がつくと、/etc/jail.confが生まれている!

example01 {
host.hostname       =  "exmaple01";
path                =  "/usr/jails/exmaple01";
mount.fstab         =  "/usr/local/etc/qjail.fstab/exmaple01";
exec.start          =  "/bin/sh /etc/rc";
exec.stop           =  "/bin/sh /etc/rc.shutdown";
exec.consolelog     =  "/var/log/qjail.exmaple01.console.log";
devfs_ruleset       =  "4";
allow.mount.devfs;
mount.devfs         =  "1";
ip4.addr            =  192.168.100.240;
interface           =  "em0";
}

jail起動…の前に、qjail listで確認。

qjail list

作成済みのjailはqjail listで確認できる。

$ sudo qjail list
STA JID  NIC IP              Jailname
--- ---- --- --------------- --------------------------------------------------
DS  N/A  em0 192.168.100.240 example01

最初のカラムのSTAはStatusの略。

一文字め:Jailの種別
    D: ディレクトリベースのjail.
    I: イメージベースのjail.
二文字め:状態
    R: 実行中
    S: 停止中

JIDはjail IDのこと。そのほかは見たまま。

qjail start

qjail startでjailを起動。
qjail listの表示も変わり、ネットワークインタフェースへのaliasも実行してくれている。

$ sudo qjail start example01
Jail successfully started  example01
$
$ sudo qjail list
STA JID  NIC IP              Jailname
--- ---- --- --------------- --------------------------------------------------
DR  N/A  em0 192.168.100.240 example01

$ ifconfig em0
em0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=9b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM>
        ether 08:00:27:a1:d7:05
        inet 192.168.100.110 netmask 0xffffff00 broadcast 192.168.100.255
        inet 192.168.100.240 netmask 0xffffffff broadcast 192.168.100.240
        nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
        media: Ethernet autoselect (1000baseT <full-duplex>)
        status: active

 

qjail consoleでjailの中へ

qjail consoleでコンソールにアクセスできる。

$ sudo qjail console example01
FreeBSD 10.0-BETA1 (GENERIC) #0 r256420: Sun Oct 13 01:43:07 UTC 2013

Welcome to your FreeBSD jail.
example01 /root >

特に何もしていないけど、/etc/localtimeと/etc/resolv.confは作ってくれた。wall_cmos_clockはなかった。

exmaple01 /root >ls /etc | egrep "resolv|clock|localtime"
localtime
resolv.conf

 

qjail stopで止めて、archiveでアーカイブ、deleteで削除完了

単純にstopしてdeleteするのは面白くないから、deleteの前にarchiveしてみた。
/usr/jails/archiveの下に<jail名>@日付秒.tarというファイルが出来ている。
また、deleteしてもjail.confには記載が残っているようだ。

$ sudo qjail stop example01
Jail successfully stopped  example01
$ sudo qjail archive example01
Successfully archived example01
$ ls /usr/jails/archive/
example01@201310182327.36.tar
$ sudo qjail delete example01
Successfully deleted  example01
$ sudo qjail list
STA JID  NIC IP              Jailname
--- ---- --- --------------- --------------------------------------------------

$
$ cat /etc/jail.conf
example01 {
host.hostname       =  "example01";
(後略)

 

qjail restoreでarchive済みのjailを復活可能ッ!

ためしにrestoreしてみたら何事もなかったかのように復活して驚いた。
これはスナップショット的に使えますね。

$ sudo qjail restore example01
Successfully restored example01
$ sudo qjail list
STA JID  NIC IP              Jailname
--- ---- --- --------------- --------------------------------------------------
DS  N/A  em0 192.168.100.240 example01
$
$ sudo qjail start example01
Jail successfully started  example01
[vanilla@yaryka ~]$ sudo qjail console example01
Last login: Thu Oct 17 23:50:08 on pts/3
FreeBSD 10.0-BETA1 (GENERIC) #0 r256420: Sun Oct 13 01:43:07 UTC 2013

Welcome to your FreeBSD jail.
example01 /root >

 

qjail、便利だよね?

ご覧の通り、qjailはjailをマクロなレベルで扱うことに長けているようで、とても便利に感じる。
qjailにはほかにもqjail configというコマンドがあり、既存のjailの設定(たとえばIPアドレスとか)を変えたりできるし、jailのOSアップデートも手軽にできるようだ。
そのあたりはまた試すとして、しばらくjailはqjailでメンテしようと思った。

 

No tags for this post.

[FreeBSD][メモ] svnliteってなんだ?

Pocket

FreeBSD 10.0でsvnliteというのが生まれた。
これが何なのか、調べたので。

svnliteってなに?

端的に言って、cvsup, csupの代わり。
以前、FreeBSDのsrcアップデートにはcsupを使っていたけれども、FreeBSDの公式リポジトリがCVSからSubversionに移行したのでそれに伴う処置。

だからして、FreeBSDソースコードのチェックアウトに使われるもの。あるいはコミットにも。
そんなわけで、通常のsvnと違い後述のような性質を持ち、プラグインを多用する場合のsvn用途には使わない方がよい。

svnliteの特徴

  • ライブラリはすべてスタティックでリンクされる。
  • インストール直後からすぐに使えるし、単体で動く。しかし機能制限はあって:
  • python/perl等のプラグインやAPIのサポートがない。つまり:
  • python/perlに依存しないのでコンパイルはすぐに終わるし,
  • python, perlのバージョンアップに影響を受けない。
  • 注: subversionの依存は凄まじく、普通にインストールすると沢山のお友達を連れてくる都合上、/usr/local配下で238Mバイト消費。
  • デフォルトでは”svnlite”としてインストールされる。”svn”ではない。だから:
  • subversionを別にインストールしても安心。
  • make.confでWITH_SVNとすると、svnとしてインストールされる。
  • make.confでWITHOUT_SVNLITEとすると、svnliteは無効に。

詳細は以下。
http://svnweb.freebsd.org/base?view=revision&revision=251886
あるいは下記から始まる熱い議論。
http://lists.freebsd.org/pipermail/svn-src-all/2013-June/070250.html

FreeBSD 10.0-BETA1では1.8.1相当。

$ svnlite --version
svn, version 1.8.1 (r1503906)
compiled Oct 13 2013, 01:33:45 on bikeshed-green-indigo-orange-freebsd

 

似たものにsvnupがあるが、2013年6月の時点で問題がありベースシステムへのマージは見送り。(問題にはコアダンプも含まれる…)

No tags for this post.

[FreeBSD]freebsd-updateするならfreebsd-versionを使おう

Pocket

 

freebsd-version(1)

10.0-BETA1で、freebsd-versionというFreeBSDのパッチレベルを教えてくれるコマンドが生まれた。
便利なコマンドなのでメモ。

FreeBSDには、freebsd-updateというバイナリアップデートコマンドがある。
make buildworld, buildkernelしなくても、必要なファイルだけを更新してくれる優れもののコマンド。
セキュリティ更新があった場合や、アップグレードにとても便利なのだが、困ったことが一つ。

あるセキュリティ更新が、カーネルに影響せず、ユーザランドのファイルのみ対象だった場合。
仮にここで9.2-RELEASEのユーザランド、たとえばbindにのみ更新があり9.2-RELEASE-p1になったとする。

そのFreeBSDのパッチレベルを確認しようとunameコマンドを使っても、返ってくるのは9.2-RELEASEである。
つまりunameはカーネルしか見ていない。
これでは本当にfreebsd-updateが完了したか不安になる。

カーネルを再コンパイルすればきちんと9.2-RELEASE-p1と返してくれるようになるが、これでは何のためのfreebsd-updateなのか分からなくなる。

今回のfreebsd-versionは、このfreebsd-updateの困ったことを解決してくれるコマンドである。

使い方

$ freebsd-version
10.0-BETA1
$ which freebsd-version
/bin/freebsd-version
$ file /bin/freebsd-version
/bin/freebsd-version: POSIX shell script, UTF-8 Unicode text executable

freebsd-updateは10.0-BETA1で入ったもの。
/binの下にある。
ご覧の通りシェルスクリプトである。

freebsd-versionに-kオプションを与えると、カーネルのパッチレベルを返す。
uname -rと同じように見えるが、以下の点で違う。
freebsd-updateなどでパッチを適用し、リブートして「いない」状態であっても、新しいカーネルのパッチレベルを返してくれる。
リブートするまえに確認できるから便利ですな。

オプションなし、あるいは-uオプションを付けると、ユーザランドのパッチレベルを返してくれる。

-kuとつけると、最初にカーネルのバージョン、次にユーザランドのバージョンを返してくれる。

以下が実行例だが、ユーザランドに更新のない10.0-BETA1だけに違いが分からない…。

$ freebsd-version -k
10.0-BETA1
$ freebsd-version -u
10.0-BETA1
$ freebsd-version
10.0-BETA1
$ freebsd-version -ku
10.0-BETA1
10.0-BETA1

 

詳細はman freebsd-version。
環境変数ROOTでpathを与えると、freebsd-versionはそこを基準にしてカーネルやユーザランドのパッチレベルを教えてくれる例など載っているので。

EXAMPLES
To determine the version of the currently running userland:

/bin/freebsd-version -u

To inspect a system being repaired using a live CD:

mount -rt ufs /dev/ada0p2 /mnt
env ROOT=/mnt /mnt/bin/freebsd-version -ku

SEE ALSO
uname(1), loader.conf(5), freebsd-version(8)

 

uname -U, uname -K

と、この記事をまとめた後(この記事は予約投稿なのです)に、HEADに修正が入った
unameに新しいオプションが追加される。-Uと-K。

-Uがユーザランドの、-Kがカーネルのバージョンを返す。
HEADだから11.0に入るのかな。
しかしそうなるとfreebsd-versionの立場は…。と思ったけど、コミット理由に「important for jail/chroot environments」と書いてありますな。

 

 

 

No tags for this post.

FreeBSD 10.0-BETA1でportsやミラーサイトに頼らずpkgngを使うには(2013/10/15現在)

Pocket

 

FreeBSD 10.0もBETA1がリリースされた。
ウホッとばかり突撃して、pkg_*の無いのに仰け反り、それなのにpkgではインストールのしようが無い現状に絶望した日本のFreeBSDユーザの方(絶対に少ねえ)に捧げます。

改めて背景を。
10.0からは、従来のパッケージ管理システムであるpkg_*に代わり、pkgngが登場する。
しかし。
2013/10/15現在、いまだ公式のpkgng向けPACKAGESITEが用意されていないのである。
なぜ、というのはここでも触れたとおり。
となれば、現時点ではportsからしか各種ソフトウェアをインストール出来ない。
うわ面倒くせえ。

PACKAGESITEは、さすがに10.0-RELEASEのときまでには準備がなされるはずであるが、現時点で外部のミラーサイトを参照せずにpkgngを使う方法を示す。

(追記:2013/11/7)
公式のpkgngが公開されている。詳しくは以下を。
http://april.fool.jp/blogs/?p=2357
(追記ここまで)

その名もpkg-test.freebsd.org。しかし。

実は、ゆくゆくオフィシャルなPACKAGESITEになる予定のサーバはもうある。
それがpkg-test.freebsd.orgである。

じゃ、これをPACKAGESITEに指定すればいいじゃないか。
しかしですね、ブラウザでpkg-test.freebsd.orgに繋ごうとすると分かるが、No address recordとなるわけですよ。

というのも、pkg-test.freebsd.orgはDNS上、AレコードではなくSRVレコードだそうであり、かつRFCに沿ってないからだという、もうほんといい加減にせえよ…。
詳細は下記を。
Where is pkg repository for 9.2-RELEASE (amd64)?

よろしい。ではIPアドレス直打ちでどうだということで、まっさらのFreeBSD 10.0-BETA1でpkgngを使う方法を示す。

さいしょの一歩(pkgコマンドのインストール)

何はともあれ、まずはpkgコマンドそのものをインストールしなければならない。
pkgと叩けばいいのだが、さっそくこれですよ。

# pkg
The package management tool is not yet installed on your system.
Do you want to fetch and install it now? [y/N]: y
Bootstrapping pkg please wait
pkg: Error fetching http://pkg.FreeBSD.org/freebsd:10:x86:64/latest/Latest/pkg.txz: No address record
A pre-built version of pkg could not be found for your system.
Consider changing PACKAGESITE or installing it from ports: 'ports-mgmt/pkg'.

そこで、環境変数PACKAGESITEに以下のアドレスを与えてpkgコマンドを実行。
下記の例ではhttp://96.47.72.120/pkg-test-freebsd:10:x86:64/latestである。
96.47.72.120はpkg-test.freebsd.orgのIPアドレス
i386だったら、http://96.47.72.120/pkg-test-freebsd:10:x86:32/latestにしてね。

もちろん、pkg-test.freebsd.orgが参照しているpkg1.nyi.freebsd.orgでもOK。

# sh
# PACKAGESITE="http://96.47.72.120/pkg-test-freebsd:10:x86:64/latest" pkg
The package management tool is not yet installed on your system.
Do you want to fetch and install it now? [y/N]: y
Bootstrapping pkg please wait
Installing pkg-1.1.4_6... done
If you are upgrading from the old package format, first run:
(中略)
Commands provided by plugins:

For more information on the different commands see 'pkg help <command>'.
#

これでpkgコマンドがインストールされた。
つぎはpkgコマンドの設定。

pkgの設定

/usr/local/etc/pkg.confというファイルが出来ているはず。
ここのPACKAGESITEを確認。
ちなみに書式はYAML。
以下のようになっているはず。

packagesite: http://96.47.72.120/pkg-test-freebsd:10:x86:64/latest

今後のことを考えて、以下のように書き換えておきましょう。

PACKAGESITE     : http://96.47.72.120/pkg-test-${ABI}/latest

オフィシャルのPACKAGESITE(きっとpkg.freebsd.orgになるはず)が準備出来たら、ここはすぐに書き換えること。

なお、/etc/make.confへのWITH_PKGNG= yesは要りません。
必要なのはFreeBSD 10.0より前のバージョン。
FreeBSD HandBookより

To ensure that the FreeBSD Ports Collection registers new software with pkgng, and not the traditional packages format, FreeBSD versions earlier than 10.X require this line in /etc/make.conf

そうしたらpkg updateしておしまい。

pkg updateとpkgのインストール

# pkg update
Updating repository catalogue
digests.txz                         100%  955KB 238.7KB/s 214.8KB/s   00:04
packagesite.txz                     100% 5209KB 274.1KB/s 418.6KB/s   00:19
Incremental update completed, 0 packages processed:
0 packages updated, 0 removed and 21607 added.

2013/10/15の時点で約21000のパッケージがあるようですな。
念のためpkg upgrade。

# pkg upgrade
Updating repository catalogue
Nothing to do
#

まあ何もないよね。

試しにいくつかパッケージをインストールしてみましょう。

# pkg install bash tmux sudo portaudit
Updating repository catalogue
The following 6 packages will be installed:

        Installing gettext: 0.18.3
        Installing libevent: 1.4.14b_2
        Installing sudo: 1.8.7_1
        Installing portaudit: 0.6.1
        Installing bash: 4.2.45
        Installing tmux: 1.8_1

The installation will require 18 MB more space

4 MB to be downloaded

Proceed with installing packages [y/N]: y
gettext-0.18.3.txz                  100% 2086KB 231.8KB/s 285.9KB/s   00:09
libevent-1.4.14b_2.txz              100%  125KB 124.5KB/s 124.5KB/s   00:01
sudo-1.8.7_1.txz                    100%  652KB 217.4KB/s 392.2KB/s   00:03
portaudit-0.6.1.txz                 100%   10KB  10.1KB/s  10.1KB/s   00:00
bash-4.2.45.txz                     100%  890KB 222.6KB/s 360.2KB/s   00:04
tmux-1.8_1.txz                      100%  203KB 203.3KB/s 193.3KB/s   00:01
Checking integrity... done
[1/6] Installing gettext-0.18.3... done
[2/6] Installing libevent-1.4.14b_2... done
[3/6] Installing sudo-1.8.7_1... done
[4/6] Installing portaudit-0.6.1...
===>  To check your installed ports for known vulnerabilities now, do:

      /usr/local/sbin/portaudit -Fda

 done
[5/6] Installing bash-4.2.45... done
[6/6] Installing tmux-1.8_1... done

パッケージも新しく、pkg auditで確認しても脆弱性の報告はない。

# pkg audit -F
auditfile.tbz                       100%   90KB  90.0KB/s  90.0KB/s   00:01
0 problem(s) in your installed packages found.
#

というわけで、いろいろ問題はあるけれど、pkg-test.freebsd.orgは現時点で十分使えるということでございます。

 

 

 

 

No tags for this post.

FreeBSD 10インストーラからのzfs on rootを試してみたよー

Pocket

 

FreeBSD 10.0-RELEASEから、インストールの際にファイルシステムとしてZFSが選べるようになる。
システムの置かれるファイルシステムをZFSにする、ということは、今までも出来ないことはなかったけど、そりゃもう面倒な手順を経る必要があった。
それがインストールの時の選択ひとつで出来るようになったというのは、けっこうすごいこと。

また、システムをZFSに置けると、まずパーティションの切り方に悩まなくて済む。
あとで/varが足らないとか/usr/localがとかそういったことが無くなる。

そのうえで、システムまるごとzfsのアドバンテージを満喫できる。
まるまるスナップショット取れたりするからね。

ただ、2012/10/10現在、いまだテスト中のところであり、10.0-BETA1あたりに入るかも、という状態。(2013/10/15追記; 10.0-BETA1に入ってました)
そんな状態で試してみた顛末を記す。

なお一次情報は以下の通り。

 

インストーラでのzfs on rootを試す

前提:FreeBSD 10.0-ALPHA5, zfsbootonly.2013-10-09.isoをvirtualboxで試しています。
注意: 先述の通りテストの真っ最中なので、下記の内容が変わる可能性は十分にあります。

Allan Jude氏のページからインストーラをダウンロードする。
通常通り起動し、10.0になっても相変わらず愛想のかけらもないメニューを選択して進むと、以下の通りフォーマットのところでZFSが選べる。

 

menu001

ZFSを選ぶとこのように。

menu002

使うディスクを選び、進む。

menu003

あとは通常通り。

 

unameはこの通り。

FreeBSD yaryka 10.0-ALPHA5 FreeBSD 10.0-ALPHA5 #0 r256092: Sun Oct  6 22:30:23 UTC 2013     root@snap.freebsd.org:/usr/obj/usr/src/sys/GENERIC  amd64

 

カーネルモジュールがこのように組み込まれている。

$ kldstat
Id Refs Address            Size     Name
 1   10 0xffffffff80200000 17fbc88  kernel
 2    1 0xffffffff819fc000 2b66d0   zfs.ko
 3    2 0xffffffff81cb3000 8098     opensolaris.ko

 

 

ディスクの内容はこのように。

$ df -h
Filesystem                   Size    Used   Avail Capacity  Mounted on
zroot/bootenv/default         61G    856M     60G     1%    /
devfs                        1.0k    1.0k      0B   100%    /dev
zroot/tmp                     60G    176k     60G     0%    /tmp
zroot/usr/home                60G    184k     60G     0%    /usr/home
zroot/usr/local               60G    144k     60G     0%    /usr/local
zroot/usr/obj                 60G    144k     60G     0%    /usr/obj
zroot/usr/ports               60G    160k     60G     0%    /usr/ports
zroot/usr/ports/distfiles     60G    144k     60G     0%    /usr/ports/distfiles
zroot/usr/ports/packages      60G    144k     60G     0%    /usr/ports/packages
zroot/usr/src                 60G    144k     60G     0%    /usr/src
zroot/var                     60G    452k     60G     0%    /var
zroot/var/crash               60G    148k     60G     0%    /var/crash
zroot/var/db                  60G    240k     60G     0%    /var/db
zroot/var/db/pkg              60G    144k     60G     0%    /var/db/pkg
zroot/var/empty               60G    144k     60G     0%    /var/empty
zroot/var/log                 60G    196k     60G     0%    /var/log
zroot/var/mail                60G    144k     60G     0%    /var/mail
zroot/var/run                 60G    228k     60G     0%    /var/run
zroot/var/tmp                 60G    152k     60G     0%    /var/tmp

 

No tags for this post.