カテゴリー
FreeBSD

WebDAV with Apache2.4 on FreeBSD

この前から遊んでいるJail祭り。今度は「自宅にWebDAVを作りたい」と思った。
というのも、iPadで使っている読書ソフトの「i文庫HD」は、種々のクラウドストレージに対応しているのだが、メインで使っている「SkyDrive」は、毎秒1MByteしか速度が出ないので、自炊した本1冊を取ってくるのに1分とかかかってしまう。そこで、WebDAVを使って取ってくれば、少なくとも自宅内ではもっと速くなるのではないだろうか、と思ったわけだ。
WebDAV自体は前にも作ったことがあるが、Apacheの一機能として動くので、どうしても設定が他のApacheの設定とごっちゃになってしまうのが気に入らなかった。今回はJail環境なので、贅沢にも「WebDAVのための仮想マシン」を切り出すことにする。

www/apache24をインストール……する前に、まず devel/apr1 をインストールして欲しい。なぜかというと、ここであるHackをしなければならない。WebDAVの認証をダイジェスト認証で行うのだが、どうやら「Jail環境下では、デフォルトのコードではダイジェスト認証がうまく動かない」のである。詳しくはこちらを参照されたい。
Apache 2.4 in a jail with Digest auth
ということで、/usr/local/include/apr-1/apr.h にある「#define APR_HAS_SHARED_MEMORY 1」を0にすること。この作業を行ってから、www/apache24をインストールして欲しい。

(2014/11/24追記: 現在では上の書き換えは必要なくなった模様。したがってaprもapacheもpkgからインストールして良い)

さて設定だ。まずは/usr/local/etc/apache24/httpd.confにある以下の行のコメントアウトを削除して有効にすること。

LoadModule dav_module libexec/apache24/mod_dav.so
LoadModule dav_fs_module libexec/apache24/mod_dav_fs.so
Include etc/apache24/extra/httpd-dav.conf

次に/usr/local/etc/apache24/extra/http-dav.confの途中部分(「# “Dav On” is specified.」と「# The following directives」の間)を以下のように書き換える。

<VirtualHost *:80>
ServerName ibunko.vegalta.org
DocumentRoot "/var/www/html/dav"
DavLockDB /var/spool/lock/dav/Lock
  <Directory "/var/www/html/dav">
    Dav On
    AuthType Digest
    AuthName Vegalta.org-WebDAV
    AuthUserFile "/usr/local/etc/apache24/.htdigest"
    Require user ibunko
  </Directory>
</VirtualHost>

次にロックの設定。

# mkdir /var/spool/lock/dav
# chown www:www /var/spool/lock/dav

ディレクトリ名に注意。DavLockDBに指定するのは「ファイル名のプレフィックス」なので、/var/spool/lock/dav/ に Lock*** というファイルが作成可能なようにする必要がある。

最後ににパスワードの設定。

# cd /usr/local/etc/apache24
# htdigest -c .htdigest 'Vegalta.org-WebDAV' ibunko
(パスワードを入力)
# chown www:www .htdigest
# chmod 640 .htdigest

htdigestにある’Vegalta.org-WebDAV’は、AuthNameで指定した文字列と同じであること。

これで設定は終わり。apacheを起動し、Windowsやi文庫HDでアクセスに成功すれば完了だ。

カテゴリー
FreeBSD

VIMAGE + JailなマシンをIPv6対応にしよう

うちはIPv4グローバルアドレスが1つしかないので、いくらJailで仮想マシンを一杯作っても、他人に提供できない。よろしい、ならばIPv6だ。「v6! v6! v6!」

前提条件として、既にIPv6が動いているネットワークであることとする。もしまだIPv6が動いていないネットワークだったら、OCN IPv6サービスでも使ってなんとかすること。Jailの親マシンをIPv6対応にする作業は他に優秀な文献がたくさんあるので割愛する。

/usr/local/etc/ezjail/test01(抜粋)

export jail_test01_exec_prestart0="ifconfig epair1 create up"
export jail_test01_exec_prestart1="ifconfig vswitch0 addm epair1a"
export jail_test01_exec_poststart0="ifconfig epair1b vnet test01"
export jail_test01_exec_poststart1="jexec test01 /sbin/ifconfig epair1b 192.168.0.101/24"
export jail_test01_exec_poststart2="jexec test01 /sbin/route add default 192.168.0.1"
export jail_test01_exec_poststart3="jexec test01 /sbin/ifconfig epair1b inet6 accept_rtadv up"
export jail_test01_exec_poststart4="jexec test01 /sbin/rtsol epair1b"
export jail_test01_exec_poststop0="ifconfig epair1a destroy"

poststart3は、インターフェースに対して「IPv6のルータ広告(RA)パケットを受け入れますよ」と指示を出す。これで、このインターフェースはルータからRAパケットが来たら、自分自身のアドレスやらデフォルトルータやらを良きに計らって設定してくれる。
poststart4は、RAパケットを待つコマンド。

で、なんとこれで終わりだ。Jailマシン側の設定は必要ない。
「/usr/local/etc/rc.d/ezjail stop test01」「/usr/local/etc/rc.d/ezjail start test01」と実行すれば、晴れて君のJailマシンもv6世界の一員だ。

カテゴリー
FreeBSD

シェルスクリプトつれづれ: 定義されていたらhoge、いなければ空文字列

jail周りを追いかけていて知った知識を小出しにしてアクセス数を稼ぐメソッド。

/etc/rc.d/jail にこんなコードがあった。ちょうどjailを起動するコマンドの部分。

eval ${_setfib} jail -n ${_jail} ${_flags} -i -c path=${_rootdir} host.hostname=${_hostname} \
                        ${_addrl:+ip4.addr=\"${_addrl}\"} ${_addr6l:+ip6.addr=\"${_addr6l}\"} \
                        ${_parameters} command=${_exec_start} > ${_tmp_jail} 2>&1 \
                        > /dev/null

${_addrl:+ip4.addr=\”${_addrl}\”} とはなんだろう、と思っていろいろ調べた結果、この部分は
「変数_addrlが定義されていれば ip4.addr=”${_addrl}” に。定義されていなければ空文字列」
という意味になるらしい。

カテゴリー
FreeBSD

FreeBSD 9.2-RELEASE + ezjail + VIMAGE

(2014/11/24追記: 10.0-RELEASE以降の環境については 新しい記事を参照)

表題の環境でJailを作ってみる。

VIMAGEというのは、Jailにその親とは独立したネットワーク環境を持たせる方法。これがないときには、親がSSHサーバを立ち上げているとJail環境でもSSHサーバを立ち上げるのにいろいろ手間がかかるなどしたらしい。

昔はezjailとVIMAGEを共存させるのがえらく大変だったらしいが、9.2-R時点ではうまく共存がはかられていて、システムファイルにパッチを当てたりする必要はなくなった。

まずは参考文献から。

このへんをぐるぐる見回ったり、最新バージョンの状況に合わせたり。

カーネルコンフィグ

options         VIMAGE
options         NULLFS

NULLFSは、後述のportsディレクトリの使用に必要。

ネットワークの下準備

親マシンの/etc/rc.confで以下の記述を行う。

cloned_interfaces="bridge0"
ifconfig_bridge0_name="vswitch0"
ifconfig_vswitch0="addm bge0"

bge0は各自のインターフェースの名前に。
ここで再起動して設定を有効にしておく。

ezjailでベースJailを作成

portsからezjailをインストール。
私はZFSを使っているので、/usr/local/etc/ezjail.conf を以下のように書き換え。

--- ezjail.conf.sample  2013-04-16 11:26:48.000000000 +0900
+++ ezjail.conf 2013-10-04 18:49:33.213786353 +0900
@@ -49,14 +49,14 @@
 # ZFS options

 # Setting this to YES will start to manage the basejail and newjail in ZFS
-# ezjail_use_zfs="YES"
+ezjail_use_zfs="YES"

 # Setting this to YES will manage ALL new jails in their own zfs
-# ezjail_use_zfs_for_jails="YES"
+ezjail_use_zfs_for_jails="YES"

 # The name of the ZFS ezjail should create jails on, it will be mounted at the ezjail_jaildir

-# ezjail_jailzfs="tank/ezjail"
+ezjail_jailzfs="raidtank/usr/jails"
 # ADVANCED, be very careful!
 # ezjail_zfs_properties="-o compression=lzjb -o atime=off"
 # ezjail_zfs_jail_properties="-o dedup=on"

次に全JailのベースとなるJailを作成する。ZFSだとスナップショットなどなどを使って、ベース部分を共用するようにしてくれる。
私は直前に9.2-RELEASEをソースからインストールしていたので、その成果物を使うコマンドがこちら。

# ezjail-admin setup -i

これでベースJailの作成は完了。
あと1つ作業を。ports用の領域を作る。ここも共用される。(ワークディレクトリは各々のJailに必要。後述)

# ezjail-admin update -P

個別のJailの作成

続いて個別のJailの作成に入る。今回はtest01という、apacheの動作検証を行うJailを作成することにする。
今回はezjailではまだサポートされていないVIMAGEを使うので、少し手間がかかる。
まずJailの作成。

# ezjail-admin create test01 0.0.0.0

IPアドレスに0.0.0.0を渡しているのは、VIMAGEだと違う方法で渡すからである。
さて、個別のJailの設定ファイルは /usr/local/etc/ezjail/ にできる。今回の場合にはtest01というファイルが出来ているはずである。
このファイルを編集する。

--- test01.orig 2013-10-08 22:21:10.148635580 +0900
+++ test01      2013-10-04 20:39:28.905690077 +0900
@@ -7,7 +7,6 @@
 #

 export jail_test01_hostname="test01"
-export jail_test01_ip="0.0.0.0"
 export jail_test01_rootdir="/usr/jails/test01"
 export jail_test01_exec_start="/bin/sh /etc/rc"
 export jail_test01_exec_stop=""
@@ -27,3 +26,10 @@
 export jail_test01_parentzfs="raidtank/usr/jails"
 export jail_test01_parameters=""
 export jail_test01_post_start_script=""
+
+export jail_test01_exec_prestart0="ifconfig epair1 create up"
+export jail_test01_exec_prestart1="ifconfig vswitch0 addm epair1a"
+export jail_test01_exec_poststart0="ifconfig epair1b vnet test01"
+export jail_test01_exec_poststart1="jexec test01 /sbin/ifconfig epair1b 192.168.0.101/24"
+export jail_test01_exec_poststart2="jexec test01 /sbin/route add default 192.168.0.1"
+export jail_test01_exec_poststop0="ifconfig epair1a destroy"

最初の削除は、VIMAGEではこの方法でIPアドレスを渡さないため。
2番目の追加は、ここでネットワークの設定をするためである。test01(変数名の中も)は各自のJailの名前に置き換えること。
prestart, poststart, poststopに指定した各コマンドは、親マシンで実行される。なので、Jailで実行したいコマンドを書くにはpoststart1のようにjexecコマンドを介すこと。
親マシンの/etc/rc.confに以下の記述を追加する。

ezjail_enable="YES"
jail_parameters="vnet=new"

1行目は言わずもがな。2行目は、VIMAGEの使用を/etc/rc.d/jail に伝えるためにある。

それではJailを起動しよう。

# /usr/local/etc/rc.d/ezjail start

うまく起動したかjlsで確認。

# jls
   JID  IP Address      Hostname                      Path
     1  -               test01                        /usr/jails/test01

このように出てくれば成功。

Jail仮想マシンの設定

Jailマシンにログインして設定を行う。

# jexec 1 /bin/sh
#

2つめの「#」はJailマシンのプロンプトだ。後は普通にFreeBSDの設定をするようにすればいい。とりあえずrootのパスワードを。

なお、/etc/resolv.confは手動で設定する必要がある。domainとnameserverと、あとはお好みで。

カテゴリー
FreeBSD wordpress

復活

復活させた。

  • PHP 5.4にするとPukiwikiが動作しないので、涙を呑んで5.3に戻した。
  • PHPとsuexecの関係ってどうなってたっけ? なんにせよWordpressの自動更新が働かないので手動更新した。
  • 技術ネタは長文になるのでこちらに載せましょう。