2004年05月28日 金曜日

自宅サーバ設置 その3

今日はApacheのための準備をして chroot空間(/home/r/)のライブラリ群の設定。めんどくさい場合はchrootしたい環境の下にmake worldをして適当に削る。この場合の作業はざっくりこんな感じ。

# D=/home/r
# cd /usr/src
# mkdir -p $D
# make world DESTDIR=$D
# cd /usr/src/etc
# make distribution DESTDIR=$D

と言う感じ。うちのマシン(Celeron 1GHz)だとだいたいmake worldが3時間程度の模様。(make worldみたいな操作は寝ている間にがんばってもらう。) 終わったところで、chroot環境として動いてもらわねばならないので、/r/dev以下を生成する。FreeBSDの場合はDevfsになっているので、こんな感じにする。
# mount -t devfs devfs /r/dev
# devfs rule -s 10 delset
# devfs rule -s 10 add hide
# devfs rule -s 10 add path null unhide
# devfs rule -s 10 add path zero unhide
# devfs rule -s 10 add path random unhide
# devfs rule -s 10 add path uraondom unhide
# devfs -m /r/dev rule -s 10 applyset
/r/dev以下はnullとzeroとrandomとurandomのみにしてあとは隠すと言うルール。実際はこのコマンドは装置起動時もしくはデーモンの起動スクリプトで実行するのがよい。/r/etc以下は

all:  spwd.db passwd
spwd.db:        master.passwd
master.passwd:  /etc/passwd
        cat $> \
        |grep -v '^#' \
        |awk -F: \
        '{printf "%s:*:%s:%s::0:0:%s:%s:%s\n",$$1,$$3,$$4,$$5,$$6,$$7}' \
        > $@
        chmod og-r $@
spwd.db:        master.passwd
        pwd_mkdb -d . $>
passwd: master.passwd
        pwd_mkdb -d . -p $>

と言う内容のMakefileをつくっておいて、
# cd /r/etc
# make
とすると、chroot 環境に必要なパスワード情報を取り込むようになる。

Apache起動

ここまで準備したことにより、Apacheを起動できる算段となった。Apacheは普通にインストールしてchrootする環境下(/home/r/に丸ごとコピーするのが手っ取り早いと思う。ApacheもDaemontoolで管理することにするため、以下のようなrunスクリプトを書く。(Daemontoolの使い方は前日の日記を参照。)

#!/bin/sh
APACHE=/usr/local/apache2
PATH=/usr/local/daemontools/bin:$PATH
exec env - PATH=/usr/local/bin:$APACHE/bin:$PATH \
pgrphack chroot /home/r httpd -DFOREGROUND

あとは/serviceに登録するとApacheが起動する。

Apacheのユーザーディレクトリ

ここのユーザーがWebページをもてるように若干の工夫をする。ざっくりと以下のような操作をユーザー作成時に行う。hogeというユーザーを作る時は、
# mkdir /home/r/hoge
# cp -pr /home/hoge/http /home/r/hoge && rm -rf /home/hoge/http
# chown -R hoge:ogwk /home/r/hoge
# ln -s /home/r/hoge/http /home/hoge/http
と言う具合に、chroot空間側にユーザーがファイルを置く空間を作って、シンボリックリンクを張る。これに対応するApacheの設定(httpd.conf)を抜粋して書くと

<Directory "/home/*/http">
  Options Indexes ExecCGI FollowSymLinks SymlinksIfOwnerMatch
  AllowOverride All
</Directory>
UserDir http

となる。ここまで設定を行って、実際に表示できるかどうか試してみること。