2007-11-02

ユーザー領域にFreeBSD portsをインストールする方法

last update $Date: 2007/11/02 22:00:15 $

portsとは?

さまざまなソフトウェアをFreeBSDで管理するためのシステムです。ソースコードのコンパイルやインストールの手順が書かれたMakefileをもとに、バージョン更新やアンインストールなどを簡単に実行する事が出来ます。

ユーザー領域にインストールする理由

FreeBSDのportsは、root権限を持ったサーバー管理者が扱う事を前提として設計されているようです。大抵のroot権限を持たないユーザーは、使用したいソフトウェアがあった場合はportsを使用せずにソースコードからビルドして、手作業でインストールしたり更新管理をしています。また、システム管理者にportsを使ったインストールを要求して作業してもらう事も有ります。 このドキュメントではユーザーがユーザー領域(以下ローカルパス)にソフトウェアをインストールする際に、便利なportsを使ってインストールをする方法を紹介します。 (ports管理ツールを使う事で更新管理も出来ると思います)

ユーザー領域で使用しても無意味なソフトウェア

例えばsysutilsなど実行するのにroot権限が必要なカーネルやシステムを扱うソフトウェアは、ユーザー権限では使用出来ないのでportsを使う意味が無いでしょう。 ネットワークデーモンとなるサービス等は実行ユーザーの設定をする必要があるでしょう。

インストール前の準備

home以下の~/usr/ports/と~/usr/localを使用します。あらかじめディレクトリを用意します。

% mkdir -p ~/usr/local
% cd ~/usr/local
% mkdir -p etc lib tmp/dist tmp/work var/db/pkg

ports.tar.gzを使ってportsツリーを~/usr/portsに展開します。tarで展開後のports.tar.gzは消しても構いません。(portsツリーは400MB弱のHDD容量を使用します)

% cd ~/usr
% fetch ftp://ftp.jp.freebsd.org/pub/FreeBSD/ports/ports/ports.tar.gz
% tar zxvf ports.tar.gz

INDEX-6.bz2を取得してインデックスファイルを展開します。

% cd ~/usr/ports
% fetch http://www.FreeBSD.org/ports/INDEX-6.bz2
% bunzip2 INDEX-6.bz2

環境変数の設定

~/.cshrcに環境変数の設定をします

setenv INSTALL_AS_USER yes
setenv PREFIX ${HOME}/usr/local
setenv LOCALBASE ${HOME}/usr/local
setenv PKG_DBDIR ${LOCALBASE}/var/db/pkg
setenv PORT_DBDIR ${LOCALBASE}/var/db/pkg
setenv DISTDIR ${LOCALBASE}/tmp/dist
setenv WRKDIRPREFIX ${LOCALBASE}/tmp/work
setenv PORTSDIR ${HOME}/usr/ports
setenv PKGTOOLS_CONF ${LOCALBASE}/etc/pkgtools.conf
setenv DEPENDS_TARGET 'install clean'

sysctlが使えない場合

サーバーの設定によってはユーザー権限ではsysctlを実行出来ないようにしている場合が有ります。もし

% sysctl -n kern.osreldate

が実行出来なかった時は、環境変数に明示的に値を設定する事で回避できます。 OSVERSIONに/usr/src/sys/sys/param.h#define __FreeBSD_versionで表されるバージョン番号を設定します。uname -rの結果が「6.2-RELEASE-pX」であれば

setenv OSVERSION 602000

という文を~/.cshrcに記入します。 そしてsysctl -n kern.argmaxも実行出来ない場合は

setenv CONFIGURE_MAX_CMD_LEN 262144

とします。 もしユーザー権限でsysctlが実行出来る場合は、この項目の設定をする必要は有りません。

ライブラリパスの設定

ldconfig -rコマンドを使って整形し、ld-elf.so.confを生成します。ローカルのライブラリパスも追記しておきます。

% ldconfig -r | awk '/search/ {print $3}' | tr ":" "\n" > ~/usr/local/etc/ld-elf.so.conf
% echo ${HOME}/usr/local/lib >> ~/usr/local/etc/ld-elf.so.conf

LDCONFIGコマンドとライブラリパス環境設定を~/.cshrcに記入します。

setenv LDCONFIG "/sbin/ldconfig -f ${LOCALBASE}/var/run/ld-elf.so.hints -i -R ${LOCALBASE}/etc/ld-elf.so.conf"
setenv LD_LIBRARY_PATH ${LOCALBASE}/lib
setenv LD_RUN_PATH ${LOCALBASE}/lib

ローカルパスのbin,sbin等を~/.cshrcに記入します。

setenv PATH ${PATH}:${LOCALBASE}/bin:${LOCALBASE}/sbin
setenv MANPATH_MAP ${LOCALBASE}/bin ${LOCALBASE}/man

portsを使ってローカルパスにインストールする

以上の設定が出来たら、

source ~/.cshrc

を実行して環境変数を読み込んで、~/usr/ports/以下のインストールしたいportsでmake installを実行してください。

参考リンク

Permanent link | Trackback | | このエントリーを含むはてなブックマーク livedoor Clip View blog reactions del.icio.us

otsune posted at 09:19 in
WriteBacks

2006-08-16

ユーザー領域にCPANをインストールする方法

Last updated $Date: 2011/03/22 06:19:28 $

追記

いまは local::lib (devel/p5-local-lib) を使えば下記の設定と同じ事が出来ます。そのモジュールを使う事を強くお勧めします。

追記2

さらに今時は cpanm (devel/p5-App-cpanminus) をインストールしても同様のことが出来ます。

CPANとは?

CPANはComprehensive Perl Archive Networkの略で、Perlのさまざまなモジュールを簡単にインストールできるシステムです。lang/perl5.8がインストールされていればcpanコマンドで使用出来ます。またperl -MCPAN -e shellでも実行できます。

ユーザー領域にインストールする理由

サーバー管理者であればroot権限を持っているので、p5-から始まるportsを使用してモジュールをインストールすれば通常はOkです。 ここではroot権限を持たない一般ユーザーが、自分の自由になるホームディレクトリへCPANモジュールをインストールして使う方法を解説します。 Perlそのものはシステムにインストールされたものを使用することを想定しています。 インストールはユーザーディレクトリの~/local以下を使うことを前提にして説明します。

インストール前の準備

あらかじめ~/localを作成しておきます。

$ mkdir -p ~/local

cpanの初期設定ファイルを作ります。

$ echo no | cpan

設定ファイルの~/.cpan/CPAN/MyConfig.pmの該当部分を書き換えます。(mbuildpl_argの項目は存在しないので、追記してください)

'make_install_arg' => qq[SITEPREFIX=$ENV{HOME}/local],
'makepl_arg' => qq[INSTALLDIRS=site INSTALL_BASE=$ENV{HOME}/local LIB=$ENV{HOME}/local/lib/perl5 PREFIX=$ENV{HOME}/local],
'mbuildpl_arg' => qq[./Build --install_base $ENV{HOME}/local],
'urllist' => [q[ftp://ftp.ring.gr.jp/pub/lang/perl/CPAN/], q[ftp://ftp.kddilabs.jp/CPAN/]],

~/.cshrcにPATHとPERL5LIB環境変数の設定を追記します。(bashを使っている場合はexport PERL5LIB=$HOME/local/lib/perl5などと読み替えてください)

$ echo 'setenv PATH $HOME/local/bin:$PATH' >> ~/.cshrc
$ echo 'setenv PERL5LIB $HOME/local/lib/perl5:$HOME/local/lib/perl5/site_perl' >> ~/.cshrc
$ source ~/.cshrc

BSDPANのエラーを回避する

FreeBSDのcpanには、portsとCPANモジュールを連動して管理できるBSDPANという仕組みが有ります。ユーザー権限でcpanインストールをする時に、BSDPANが/var/db/pkgへ書き込みをしようとしてパーミッションエラーがでます。 それを回避したい場合は、インストールする前に以下の環境設定を~/.cshrcなどに追記してsource ~/.cshrcで読み込んでおきます。 (この設定はCPANを使うために必須では無いので、省略してもかまいません)

setenv PKG_DBDIR $HOME/local/var/db/pkg
setenv PORT_DBDIR $HOME/local/var/db/pkg
setenv INSTALL_AS_USER
setenv LD_LIBRARY_PATH $HOME/local/lib

インストール前にあらかじめBSDPANデータの保存先ディレクトリを作成しておきます。

$ mkdir -p ~/local/var/db/pkg

CPANをアップデートして初期設定

CPANを最新版にアップデートします。 途中の質問は全てリターンでOkです。

$ cpan -i Bundle::CPAN

インストールが終わったらcpanコマンドで新しいCPANシステムの初期設定を実行します。

$ cpan

ミラーサイトの選択は(2) Asiaと(7) Japanを選択します。他の質問はリターンでOkです。

設定が終わればユーザー領域でCPANが使えるようになります。

Net::SSLeayのインストール

この設定をしている場合にNet::SSLeayをインストールしようとすると、make時にOpenSSLライブラリをユーザー領域から探そうとするため失敗することがあります。その場合はmakepl_argの先頭に--を一時的に入れます。

cpan> o conf makepl_arg "-- INSTALLDIRS=site LIB=$ENV{HOME}/local/lib/perl5 PREFIX=$ENV{HOME}/local"
cpan> install Net::SSLeay

XML::Parserのインストール

この設定をしている場合にXML::parserをインストールしようとすると、make時にexpatライブラリが見つからないため失敗することがあります。その場合はmakepl_argにEXPATLIBPATHとEXPATINCPATHを一時的に入れます。システムにportsのtextproc/expat2がインストールされている場合は/usr/local/libと/usr/local/includeを指定します。ユーザー領域にexpatをインストールする場合は$ENV{HOME}/local/libなど該当する場所を指定する必要が有ります。

cpan> o conf makepl_arg "INSTALLDIRS=site LIB=$ENV{HOME}/local/lib/perl5 PREFIX=$ENV{HOME}/local EXPATLIBPATH=/usr/local/lib EXPATINCPATH=/usr/local/include"
cpan> install XML::Parser

参考

Permanent link | Trackback | | このエントリーを含むはてなブックマーク livedoor Clip View blog reactions del.icio.us

otsune posted at 08:19 in
WriteBacks

2005-05-24

jailの作り方

Last updated $Date: 2011/03/22 06:19:28 $

この記事について

この記事は FreeBSD Expert 2005 に掲載された記事です。掲載時に修正されたのでまったく同一の内容ではありません。またこのサイトで公開するにあたってWeb用に修正しています。おかしな記述がありましたらコメント等で指摘してくれると幸いです。

jailとは

jailとは「仮想FreeBSDマシン」を実現する機能です。FreeBSDマシン内に、もう一つのFreeBSD環境を作ることができます。 FreeBSDを含めたUNIX系OSには、古くからchrootというコマンドが存在します。 chrootコマンドを使用することでルートディレクトリを変更してコマンドを実行することができます。コマンドを任意のディレクトリの下に閉じ込めてファイルシステムのアクセスに制約をかけることができます。 chrootから実行されたコマンドは、指定されたルートディレクトリよりも上の階層へアクセスすることが出来ない状態で起動します。 jailはchrootの機能を拡張して、ネットワーク・プロセス等も隔離できるようにしたFreeBSD特有の仕組みです。 LinuxのUser Mode Linux(UML)のような仮想OSや、VMwareなどの仮想マシンに似たシステムです。ただし、それらの仮想OS技術とは違い、プロセス自体はホストマシン(以下、host環境)のカーネルによって動作しています。そのため仮想マシンとして動作するOSはFreeBSDに限定されます。 この記事では仮想FreeBSDマシンのことを分かりやすくするため「jail環境」と表現しています。

構築例

IPアドレス ホスト名 FQDN root directory
host環境 192.168.1.1 host host.example.jp /
jail環境 192.168.1.2 jail1 jail1.example.jp /usr/local/jail1

jailで出来る事

プロセスとネットワークを分離できる

jail環境の中からhost環境や他のjail環境のプロセスやネットワークを参照したり操作できないようにします。

IPv4アドレスひとつを使用できる

jail(8)の引数で指定したIPv4アドレスをひとつ使用します。

ユーザーアカウントや設定を分離できる

host環境には最低限のアカウントだけ登録して、ユーザーアカウントはjail環境にだけ作成するような使い方が出来ます。 ただしhost環境とjail環境でUID/GIDは共通の値を使いますので、通常は値が重複しないように割り振って、管理が混乱しないようにします。

攻撃を受けても被害を分離できる

動作させるためにroot権限が必要なWebサーバーなどをjail環境に閉じ込めて動作させることで、侵入があってもhost環境に被害を受けないようにすることができます。 一般的にグローバルIPを持ってインターネットへ接続すると、外部からの攻撃を受けやすくなります。もしWebサーバー等に脆弱性があり、外部から侵入されてroot権限を奪われても、jail環境として分離しておけばhost環境への被害を食い止めることが出来ます。

jailで出来ない事

IPv6は使えない

使用できるネットワークはIPv4だけに限定されている。

ICMP・ブロードキャスト・ループバックアドレスは使えない

ループバックアドレスの127.0.0.1が使えない。そのためSambaなどのソフトは自分自身に接続する必要のある一部の機能が動作しない。 またICMPが使えないためjail環境ではpingコマンドなどが使えない。

FreeBSD 5.3以降

/etc/sysctl.confにsecurity.jail.allow_raw_sockets=1を指定することでjail環境からpingやtracerouteを使用する事が出来ます。

RPCやBerkeley Packet Filter(bpf)やrawデバイスが必要なソフトは動作しない

RPCが必要なNFSやNISは使えない。いわゆるパケットスキャナーといわれているソフトも動作しない。AppleTalkを使用したNetatalkも使えない。

FreeBSD 5.3以降

/etc/sysctl.confにsecurity.jail.allow_raw_sockets=1を指定することでjail環境でrawソケットを使用する事が出来ます。

CPU資源の柔軟な分離は出来ない

jailはいわゆる仮想OSに似た使い方が出来ますが、プロセスの管理そのものはhost環境のカーネルで行われています。CPUパワーを任意に分割してjail環境に簡単に割り振るようなことはできません。 host環境でrenice(8)を使用することによってjailで動作しているプロセスの優先度をコントロールすることはできます。

System V プロセス間通信(以下、SysVIPC)はデフォルトで無効に設定してある

PostgreSQLなどSysVIPCを使用するソフトをjail環境で使う場合は、ホスト環境でカーネルパラメーターを有効化しないと起動しません。 FreeBSD QandA 1866を参照してください。 jail環境でSysVIPCを有効にすることはセキュリティ的には推奨されていませんのでよく理解して使用してください。

FreeBSD 4系

/etc/sysctl.confにjail.sysvipc_allowed=1を指定する。

FreeBSD 5系

/etc/rc.confにjail_sysvipc_allow="YES"を指定する。

ファイルシステムを操作することが出来ない

mountumountすることはできません。

カーネルセキュアレベル(以下、kern.securelevel)が高い時にファイルフラグの変更ができない

FreeBSDにはファイルフラグというセキュリティの仕組みが存在します。 (ファイルフラグについての詳細はchflags(1)のマニュアルを参照してください。)

schgやsunlnkなどのファイルフラグをセットしたファイルはrmコマンドやmvコマンド等で削除・変更することが出来なくなります。 それぞれsystem immutable(システムレベルでの変更不可)やsystem undeletable (システムレベルでの削除不可) のファイルフラグを表します。 通常はchflagsコマンドを使用することでファイルフラグを変更できますが、host環境のkern.securelevelが1よりも高い状態の場合は、セットすることもクリアすることも出来ません。 kern.securelevelを下げるには、host環境の/etc/rc.confでkern_securelevel="-1"等の低い値を指定して再起動をする必要があります。

二つに分かれるjailの構築法

jailの構築法として大きく分類すると「フルツリー」と「ミニツリー」の二つがあります。jail(8)のmanではそれぞれ"fat" jailと"thin" jailと表現されています。 前者はFreeBSDのシステムをjail環境にほぼ全て用意する方法です。 後者はjail環境で動作させるソフトに必要な最低限のライブラリやファイルだけを用意する方法です。 フルツリーのjailを構築するには、基本的にはjail(8)のマニュアル(以下、man)に書いてあるとおりに実行します。 FreeBSD 日本語マニュアル検索から"jail"で検索すると、jpmanプロジェクトが日本語に翻訳したmanをブラウザで読むことができます。

ミニツリーのjailの構築法についてはthin jailの作り方を参照してください。

フルツリーのjailとは

フルツリーのjailはシステムのほとんどのファイルを使って、FreeBSD環境を構築することを指します。マシンを物理的に1台追加したように運用することが出来ます。

説明を実践的にするため、jail(8)のmanにおける"/here/is/the/jail"という記述を、この記事では"/usr/local/jail1"という実際に構築するディレクトリ名で説明します。 さらにmanの手順よりさらに踏み込んで、フルツリーで構築したjail環境からjailには不必要なファイルを削除することにします。

フルツリーjailの構築方法

ソースの準備

/usr/srcにシステムのソースを準備します。 ソースがインストールされていない場合。/stand/sysinstallを実行して"Configure→Distributions→src→All"を選択してCD-ROMやFTPサイトなどからインストールしてください。 最新版のソースをインストールするためにCVSupを使用することを推奨します。 「FreeBSDハンドブック A.5. CVSup を使う」 を参照してください。 この記事では「host#」はhost環境のrootプロンプト。「jail#」はjail環境のrootプロンプトを表します。

システムのビルド

FreeBSD 4系、FreeBSD 5系共通です。以下、特に断りが無い場合は共通の手順を表します。

host# cd /usr/src
host# make buildworld

CPU環境などにもよりますが数時間程度で/usr/obj下にシステムがビルドされます。

jail環境にシステムをインストールする

まずjail環境をインストールするディレクトリを作ります。

host# mkdir -p /usr/local/jail1

DESTDIRでインストール先を指定してinstallworldします。

host# cd /usr/src
host# make installworld DESTDIR=/usr/local/jail1

/etc以下のファイルと/dev以下のデバイスファイルを作る

設定ファイルをjail環境にインストールします。また/dev以下にデバイスファイルを作ります。

FreeBSD 4系

host# cd /usr/src/etc
host# make distribution DESTDIR=/usr/local/jail1 -DNO_MAKEDEV_RUN
host# cd /usr/local/jail1/dev
host# sh MAKEDEV jail

FreeBSD 5系

host# cd /usr/src/etc
host# make distribution DESTDIR=/usr/local/jail1
host# mount_devfs devfs /usr/local/jail1/dev

ここでは一時的に全てのデバイスをjail環境にマウントしています。しかし実稼動時には後述するようにhost環境の/etc/rc.confにjail_jail1_devfs_enable="YES"と指定することでjail専用のdevfsをマウントします。

jailに不必要なファイルの削除

今までの操作により、システムのほぼ全てのファイルがjail環境にインストールされています。そのファイルの中にはハードウェアを操作するコマンドなども存在します。それらのコマンドはjailでは動作しないため、セキュリティとHDD容量の節約を考慮するのであればファイルを削除したほうが望ましいでしょう。 N. Nielsen氏のWebサイトFiles to Remove from Jailsに、jail環境に不必要なファイルのリストが公開されています。そのリストをダウンロードして利用することにします。 まずホスト環境の/rootなどのディレクトリへ一時的にダウンロードしたリストを持ってきます。そして削除作業のためjail環境のルートディレクトリにコピーします。 ホスト環境がインターネットに接続されている場合は下記のようにfetchコマンドを使用します。

FreeBSD 4系

host# cd /root
host# fetch http://memberwebs.com/nielsen/freebsd/jails/docs/jail_remove.txt
host# cp jail_remove.txt /usr/local/jail1

FreeBSD 5系

host# cd /root
host# fetch http://memberwebs.com/nielsen/freebsd/jails/docs/jail_remove_5.x.txt
host# cp jail_remove_5.x.txt /usr/local/jail1/jail_remove.txt # ←説明を簡略化するためリネームしています

Nielsen氏の削除リスト(jail_remove.txt)は、jail環境のルートディレクトリを基準に書かれているためjail環境にchrootしてから削除作業をします。 削除するファイルの中に、ファイルフラグがセットされているため削除できないファイルが2つあります。作業をする前にあらかじめchflagsコマンドでファイルフラグをクリアしておく必要があります。

host# chroot /usr/local/jail1
jail# chflags noschg /sbin/init /usr/sbin/sliplogin

そして削除リストをcatxargsrmコマンドを使ってファイルを削除します。

jail# cat jail_remove.txt | xargs rm -rf

また/etc/rmtというシンボリックリンクが消しきれていないためunlinkして消します。

jail# unlink /etc/rmt

jail環境を整える

Jail環境利用のポイント

デフォルトの起動ファイルや設定ファイルの状態ではjailに合った環境になっていません。以降では、jail環境で必要な各種の設定をしていきます。

kernelファイルを/dev/nullにリンク

カーネルファイルはjail環境では不必要なので/dev/nullとソフトリンクします。 FreeBSD 5系では/bootを消去したため、カーネルファイルに関して特に作業はいりません。

FreeBSD 4系

host# cd /usr/local/jail1
host# ln -sf dev/null kernel

一部コマンドを/usr/bin/trueにリンクする

削除リストで消したファイルの中に/etc/rc*の起動ファイルから使用されているコマンドがあります。jail環境が起動するときのエラーを抑制するため、それらのコマンドを/usr/bin/trueにハードリンクします。

FreeBSD 4系

jail# ln /usr/bin/true /sbin/mount
jail# ln /usr/bin/true /sbin/umount
jail# ln /usr/bin/true /sbin/init
jail# ln /usr/bin/true /sbin/swapon
jail# ln /usr/bin/true /sbin/swapoff

FreeBSD 5系

jail# ln /usr/bin/true /sbin/init

起動時の警告を抑制するため、空のfstabファイルを作成します。

jail# touch /etc/fstab

sendmailの警告を抑制するため/etc/mail/aliases.dbを生成します。

jail# newaliases

/etc/resolv.confをjail環境にコピーして名前解決ができるようにします。

host# cp /etc/resolv.conf /usr/local/jail1/etc/

(jail環境の起動が極端に遅い場合はresolv.confで指定されているDNSサーバーへの名前解決が出来ていない場合が考えられます)

jail環境のroot管理者パスワードを設定します。

jail# passwd root
Changing local password for root
New Password: ←パスワード入力
Retype New Password: ←確認のため再入力

コンピューターの内蔵時計をUTCではなくローカルタイムに合わせる場合、/etc/wall_cmos_clockを作成し、タイムゾーンを設定します。

jail# touch /etc/wall_cmos_clock 
jail# ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

エラーを抑制するため、jail環境の/etc/syslog.confの/dev/consoleへの出力をコメントアウトします。

host# diff /usr/local/jail1/etc/syslog.conf.orig /usr/local/jail1/etc/syslog.conf
8c8
< *.err;kern.debug;auth.notice;mail.crit                /dev/console
---
>> #*.err;kern.debug;auth.notice;mail.crit               /dev/console

/etc/crontabの編集

/etc/crontabにあるadjkerntzの実行はjail環境では不用なのでコメントアウトします。atrunも使用するつもりが無ければコメントアウトします。

host# diff /usr/local/jail1/etc/crontab.orig /usr/local/jail1/etc/crontab
11c11
< */5   *       *       *       *       root    /usr/libexec/atrun
---
>> #*/5  *       *       *       *       root    /usr/libexec/atrun
24c24
< 1,31  0-5     *       *       *       root    adjkerntz -a
---
>> #1,31 0-5     *       *       *       root    adjkerntz -a

jail環境に/etc/rc.confを設定する

jail環境専用のrc.confを設定します。 この設定例ではjail環境のsendmailとsshdを起動しています。 sendmailはcronからのメールを送信するため。 jail環境のrootへのメールを自分のアドレスで受け取りたい場合は、jail環境に/root/.forwardというファイルを作成し、メールアドレスを記入しておきます。 sshdはjail環境にログインするために起動しています。 sshdを起動しない場合はsshd_enable="NO"と書き換えてください。 FreeBSD 5.x系であればhost環境から

host# jexec 1 /bin/csh

というようにjexecコマンドを使用すればjail環境に入ることが出来るのでsshdを立ち上げる必要はありません。(詳細はjexecのmanを参照してください) tcp_keepaliveなどはjailから制御ができないsysctl MIBの操作に対するエラーを抑制するために指定します。

FreeBSD 4系

/etc/rc.conf (jail)

network_interfaces=""
portmap_enable="NO"
inetd_enable="NO"
sendmail_enable="NO"
sendmail_submit_enable="YES"
sendmail_outbound_enable="NO"
sendmail_msp_queue_enable="YES"
sshd_enable="YES"
sshd_flags="-4"
syslogd_flags="-ss"
tcp_keepalive="NO"
tcp_extensions="NO"
cron_flags="-J 15"

FreeBSD 5系

/etc/rc.conf (jail)

network_interfaces=""
rpcbind_enable="NO"
sendmail_enable="NO"
sendmail_submit_enable="YES"
sendmail_outbound_enable="NO"
sendmail_msp_queue_enable="YES"
sshd_enable="NO"
sshd_flags="-4"
syslogd_flags="-ss"
tcp_keepalive="NO"
tcp_extensions="NO"
cron_flags="-J 15"

jail環境のperiodicを設定する

FreeBSD 4系

/etc/periodic.conf (jail)

daily_uuclean_enable="NO"
daily_status_disks_enable="NO"
daily_status_uucp_enable="NO"
daily_status_network_enable="NO"
daily_status_security_noamd="YES"
weekly_uucp_enable="NO"
weekly_catman_enable="NO"
daily_status_security_chkmounts_enable="NO"
daily_status_security_ipfdenied_enable="NO"
daily_status_security_ipfwdenied_enable="NO"
daily_status_security_ipfwlimit_enable="NO"
daily_status_security_ip6fwdenied_enable="NO"
daily_status_security_ip6fwlimit_enable="NO"

FreeBSD 5系

/etc/periodic.conf (jail)

daily_status_disks_enable="NO"
daily_status_network_enable="NO"
daily_status_security_noamd="YES"
daily_status_security_chkmounts_enable="NO"
daily_status_security_ipfdenied_enable="NO"
daily_status_security_ipfwdenied_enable="NO"
daily_status_security_ipfwlimit_enable="NO"
daily_status_security_pfdenied_enable="NO"
daily_status_security_ip6fwdenied_enable="NO"
daily_status_security_ip6fwlimit_enable="NO"
daily_status_security_kernelmsg_enable="NO"

mount_nullを使用したportsツリーの導入

jail環境へソフトをインストールするためにportsツリーを導入します。 ただソフトをインストールするだけであれば、jail環境にportsツリーを導入する必要はありません。その場合、ftpサーバー等で公開されているpackageを使い、jail環境でpkg_addコマンドを使ってインストールします。しかしportsツリーを導入しておくと、host環境と同じようにソフトを管理することができます。またjail環境でもsysutils/portupgradeを使うことで、ソフトのアップデート作業を容易に実行することができます。 host環境にある/usr/portsディレクトリをjail環境へ単純にコピーすることでもportsツリーを導入することは出来ます。しかしHDD容量を圧迫することとjail環境のportsツリーを更新する手間が増えるというデメリットがあります。 そこでmount_null(8)を使用してjail環境にhost環境のportsツリーをマウントすることにします(FreeBSD 5系では同機能のコマンド名がmount_nullfs(8)になります。以下、FreeBSD 5系の場合はコマンド名を読みかえてください)。 またmount_null(8)のオプションにro(リードオンリー)を指定することにより、jail環境へ読み込み専用でマウントすることが可能になります。これによってjail環境からhost環境の/usr/portsを変更できないようにすることが可能です。

mount_nullを使用するためには、カーネル設定ファイルに

options     NULLFS

を追加してカーネルを再構築して再起動するか、kldload(8)でnull.koモジュールを読み込む必要があります。

jail環境のports環境整備

jail環境のportsディレクトリを作成する。

host# mkdir -p /usr/local/jail1/usr/ports

portsツリーを使ってソフトをインストールする時は、作業ディレクトリ(WRKDIR)とソース保存ディレクトリ(DISTDIR)への書き込み権限が必要になります。前述のように/usr/portsを読み込み専用でマウントした場合、デフォルト設定ではそれらのディレクトリに書き込みができずビルドが失敗します。その場合、書き込みが可能な/var/tmpをWRKDIRに設定して、/var/tmp/usr/ports/distfilesをDISTDIRに設定します。jail環境の/etc/make.confに指定します。

/etc/make.conf (jail)

WRKDIRPREFIX=/var/tmp
DISTDIR=/var/tmp/usr/ports/distfiles
WITHOUT_IPV6="yes"

jail環境ではIPv6が使えないのでWITHOUT_IPV6="yes"も指定しておくといいでしょう。

マウントポイントの設定

host環境の/etc/fstabにjail環境のportsツリーのマウントポイントを指定します。jailから書き込みが出来ないようにオプションにroを追加します。またportsツリーをマウントする必要があるのは、ソフトウェアのインストール時やアップデートする場合に限られています。そのため通常の運用時はportsツリーをマウントしないようにnoautoオプションも合わせて指定しておきます。 fstabに指定しなくても

mount_null -r /usr/ports /usr/local/jail1/usr/ports

と入力することで同様の作業が出来ます。しかしfstabに明記することでコマンド操作ミスを防ぐ効果もあります。

FreeBSD 4系

/etc/fstab (host)

/usr/ports  /usr/local/jail1/usr/ports  null ro,noauto  0   0

FreeBSD 5系

/etc/fstab (host)

/usr/ports  /usr/local/jail1/usr/ports  nullfs ro,noauto    0   0

設定が完了したら実際にjail環境にportsツリーをマウントします。

host# mount /usr/local/jail1/usr/ports

これでjail環境でportsツリーを使ってhost環境と同様にソフトをインストールしたりアップデートすることができます。

jailの起動

セキュリティの確保

host環境でカーネルパラメーターの設定をしないと、jail環境でroot権限があればhostnameを変更することができてしまいます。セキュリティを確保するために/etc/sysctl.confを設定することにします。

/etc/sysctl.conf (host)

jail.set_hostname_allowed=0
jail.sysvipc_allowed=0

FreeBSD 5系の場合は後述する「起動ファイルの設定」において/etc/rc.confを設定することで同様の設定が出来ます。

ネットワークインターフェースの設定

まずインターフェースにjail環境用のIPアドレスをaliasで追加します。(fxp0は使用しているマシンのネットワークカードによって変化します)。netmaskの値が255.255.255.255になることに気をつけてください。

/etc/rc.conf (host)

ifconfig_fxp0="inet 192.168.1.1 netmask 255.255.255.0"
ifconfig_fxp0_alias0="inet 192.168.1.2 netmask 255.255.255.255"

起動スクリプト

FreeBSD 4系

FreeBSD 4系列はシステムにjail用の起動ファイルが用意されていません。 そこでportsのsysutils/jailadminをインストールして使用することにします。

host# cd /usr/ports/sysutils/jailadmin
host# make install

そしてhost環境の/usr/local/etc/jailadmin.confを下記のように設定します。

/usr/local/etc/jailadmin.conf (host)

jaildir=/usr/local
maxparallel=5
debug=1
group_all=jail1
jail1
    ip: 192.168.1.2
    hostname: jail1.example.jp

設定が出来たらzzz-jail.shスクリプトを実行して起動します。

host# /usr/local/etc/rc.d/zzz-jail.sh start

FreeBSD 5系

FreeBSD 5系列の場合は、システムの起動ファイルである/etc/rc.d/jailを使用してjailを起動します。

/etc/rc.conf (host)

jail_enable="YES"
jail_list="jail1"
jail_set_hostname_allow="NO"
jail_socket_unixiproute_only="YES"
jail_sysvipc_allow="NO"
jail_stop_jailer="NO" # sysutils/jailerを使う場合はYES
jail_jail1_rootdir="/usr/local/jail1"
jail_jail1_hostname="jail1.example.jp"
jail_jail1_ip="192.168.1.2"
jail_jail1_exec="/bin/sh /etc/rc"
jail_jail1_devfs_enable="YES"
jail_jail1_fdescfs_enable="NO"
jail_jail1_procfs_enable="NO"

jail環境内でpsコマンドなどを使う場合はjail_jail1_procfs_enable="YES"を指定してprocfsをjailにマウントします。

host# /etc/rc.d/jail start

jail環境とインターネットのアクセス

NATルーターが存在するネットワークにhost環境が接続されている場合、jail環境からはNATルーターを使ってインターネットへアクセスができます。 host環境自体がインターネットルーターである場合は、host環境に適切にNATを設定することでjail環境から同様にアクセスできるようになります。 jail環境にインストールしたWebサーバー等を、グローバルIPでインターネット側へサービスを提供することもできます。その場合、host環境でipfwやIPFilterなどを設定して、グローバルIPへのパケットをjail環境へ転送する必要があります。

jail環境のアップデートとメンテナンス

FreeBSDセキュリティ勧告が出てシステムをアップデートした場合は、jail環境もアップデートします。 host環境をアップデートした時に、同時にjail環境も作業することを推奨します。

フルツリーjailの場合

前述の「jail環境にシステムをインストールする」と同様の手順でアップデートしたシステムをインストールします。

host# cd /usr/src
host# make update buildworld
host# make installworld DESTDIR=/usr/local/jail1

mergemasterの-Dオプションでjail環境を指定して/etc設定ファイルのアップデート作業をします。

host# mergemaster -D /usr/local/jail1 -t /usr/local/jail1/var/tmp/temproot

その後、前述の「jailに不用なファイルの削除」の作業を実行します。

portsでインストールしたソフトのメンテナンス

host環境の/usr/portsをmount_null(8)でjail環境にマウントしてportupgradeコマンドを使ってアップデートします。

jail# portupgrade www/apache2

jailに関するツール・コマンド

jailに関するコマンド

  • jls(8) jail環境の一覧を表示する。

  • jexec(8) jail環境で指定したコマンドを実行する。

jailに関するports

sysutils/jailadmin FreeBSD 4系で有用な起動スクリプト。WITH_SNMPを指定してビルドすればsnmpによるjailの監視ができる。
sysutils/jailctl jail環境の構築・アップデート・バックアップとリストア・起動などをコントロールするシェルスクリプト。かなり便利でオススメ。
sysutils/jailer jail環境に導入することでjailの起動や停止などを管理できるツール。使用する場合はホスト環境の/etc/rc.confに`jail_stop_jailer="YES"`を指定する。
sysutils/jailuser chroot環境を構築するUNIX系OS汎用のソフト。FreeBSD固有のjail機能とは関係が無い。ミニツリーを構築するのに便利。
sysutils/jailutils jail環境を操作するツールを数種類まとめたもの。sysutils/jailerと連携してjail環境を管理できる。
sysutils/jkill jail環境とjail内で動作しているプロセスをkillできるPerlスクリプト。FreeBSD 4系向け。
sysutils/jps プロセスを表示するpsのラッパーとなるPerlスクリプト。jailerなどのツールを導入する必要がない。
sysutils/jtop 上位プロセスのリストを表示するtopのラッパーとなるPerlスクリプト。jailerなどのツールを導入する必要がない。

参照文献

Web(英文)

Web(日本語)

書籍

Permanent link | Trackback | | このエントリーを含むはてなブックマーク livedoor Clip View blog reactions del.icio.us

otsune posted at 17:13 in
WriteBacks

2004-12-03

BitTorrentを使ってFreeBSDのISOイメージファイルをダウンロードする

BitTorrentとは?

BitTorrentはファイルを転送するプロトコルです。ダウンロードを分散することで一つのサーバーにアクセスが集中しないように設計されています。 FreeBSD 5.4RのISOイメージをBitTorrentで配布する実験が行われているようです。 http://people.freebsd.org/~kensmith/5.4-torrent/

FreeBSD 6.0RのISOイメージ用torrentファイルは各ftpサーバーのtorrents以下にミラーされています。 ftp://ftp.jp.freebsd.org/pub/FreeBSD/torrents/

外から接続できるようにport 6881を開放する

BitTorrentはダウンロードをしているホストが同時に他のホストへのアップロードを行います。 6881-6889までのポートのうちどれかを外部から接続できるようにしておきましょう。

net/ctorrent

コンソールで動作するクライアントとしてnet/ctorrentがオススメです。 Home of CTorrent, the linux console torrent clientが公式サイトです。

# cd /usr/ports/net/ctorrent
# make install clean

net/py-bittorrent-core

Pythonで書かれたBitTorrentクライアントです。 WITHOUT_GUIでビルドされるmeta portsなのでコンソールで動作します。

# cd /usr/ports/net/py-bittorrent-core
# make install clean

ダウンロードする

ctorrentの場合

ftp://ftp.jp.freebsd.org/pub/FreeBSD/torrents/6.0-RELEASE/の.torrentファイルを使用してダウンロードします。 例として6.0-RELEASE-i386-disc1.torrentを使う場合を説明しましょう。

ctorrentの場合は

fetch ftp://ftp.jp.freebsd.org/pub/FreeBSD/torrents/6.0-RELEASE/6.0-RELEASE-i386-disc1.torrent

として.torrentファイルをダウンロードしておきます。そして

# ctorrent 6.0-RELEASE-i386-disc1.torrent

と実行するとダウンロードが始まります。

py-bittorrent-coreの場合

# btdownloadcurses.py --url ¥
ftp://ftp.jp.freebsd.org/pub/FreeBSD/torrents/6.0-RELEASE/6.0-RELEASE-i386-disc1.torrent

と--urlオプションでtorrentファイルが公開されているurlを直接指定してダウンロードできます。

ダウンロードが終わっても

しばらく実行しておくことで、他のホストへのアップロードを続けることができます。


更新日 $Date: 2005/11/04 10:19:43 $

Permanent link | Trackback | | このエントリーを含むはてなブックマーク livedoor Clip View blog reactions del.icio.us

otsune posted at 02:37 in
WriteBacks

2004-11-30

thin jailの作り方

thin jailとは?

thin jailは俗にミニツリーjailとも呼ばれています。 ミニツリーのjailは最低限のファイルだけを使ってApacheやBINDなど一つのソフトだけが動作するようにjail環境を構築することを指します。単機能の小型サーバーを追加したように運用できます。 フルツリーの場合はmake installworldによって、システムの全てのコマンドをインストールしますが、ミニツリーの場合は必要最小限のディレクトリとコマンドだけをインストールします。 例として「/usr/local/jail2」にwww/apache2が動作するミニツリーを構築する手順を説明します。textproc/expat2も依存関係で必要になります。

ミニツリーの構築

まずミニツリーのディレクトリを作ります。

host# mkdir -p /usr/local/jail2

ディレクトリの作成

そしてBSD.minijail.distというmtreeファイルを作成します。そのファイルを指定してmtreeコマンドを実行してディレクトリを作成します。

host# mtree -deU -f BSD.minijail.dist -p /usr/local/jail2

BSD.minijail.dist

/set type=dir uname=root gname=wheel mode=0755
.
    bin
    ..
    dev
    ..
    etc
    ..
    proc            mode=0555
    ..
    sbin
    ..
    tmp             mode=01777
    ..
    usr
        bin
        ..
        include
        ..
        lib
        ..
        libexec
        ..
        ports
        ..
        sbin
        ..
        local
        ..
    ..
    var
        db
            pkg
            ..
        ..
        log
        ..
        run
        ..
        spool
        ..
        tmp         mode=01777
        ..
    ..
..

最小限のコマンドをインストール

www/apache2の動作に必要なコマンドだけをミニツリーjail環境にインストールします。 ここではManuel Kasper氏の[miniBSD - reducing FreeBSD] (http://neon1.net/misc/minibsd.html)で提供されているmkmini.plというPerlスクリプトを使用します。

host# fetch http://neon1.net/misc/minibsd/mkmini.pl

まずファイルの一覧をmini_apache2.filesとして用意します。bin/[bin/testのように実体が同じで名前だけが違うファイルは、セミコロンで区切って一行にまとめて記述します。

mkmini.plを実行してコマンドをミニツリー環境にインストールします。

host# perl mkmini.pl mini_apache2.files / /usr/local/jail2

mini_apache2.files

/etc/group
/etc/host.conf
/etc/localtime
/etc/master.passwd
/etc/passwd
/etc/resolv.conf
/etc/services
bin/[:bin/test
bin/cat
bin/chmod
bin/cp
bin/csh:/bin/tcsh
bin/echo
bin/link:bin/ln
bin/ls
bin/mkdir
bin/mv
bin/pwd:bin/realpath
bin/rm:bin/unlink
bin/rmdir
bin/sh
sbin/ldconfig
sbin/nologin
usr/bin/awk
usr/bin/bunzip2:usr/bin/bzcat:usr/bin/bzip2
usr/bin/chgrp:usr/sbin/chown
usr/bin/cmp
usr/bin/gunzip:usr/bin/gzcat:usr/bin/gzip
usr/bin/egrep:usr/bin/fgrep:usr/bin/grep
usr/bin/find
usr/bin/sed
usr/bin/tar
usr/bin/true
usr/bin/uname
usr/sbin/mtree
usr/sbin/pw
usr/sbin/pwd_mkdb
usr/share/misc/termcap
usr/libexec/ld-elf.so.1

ライブラリのインストール

ライブラリのコピーは同じWebサイトにあるmklibs.plというPerlスクリプトを使用します。 mklibs.plを実行して、ミニツリーjail環境に必要なライブラリをリストアップしてjail.libsというファイルに出力します。そのファイルを使用して再びmkmini.plを使用してライブラリをインストールします。

host# fetch http://neon1.net/misc/minibsd/mklibs.pl
host# perl mklibs.pl /usr/local/jail2 > jail.libs
host# perl mkmini.pl jail.libs / /usr/local/jail2

/etc以下のファイルを設定する

/etc/hostsにjailで使うホスト名を指定します。

/etc/hosts (jail)

192.168.1.3 localhost
192.168.1.3 jail2.example.jp

アカウント設定

必要最小限のアカウントを/etc/master.passwdに記述します。また/etc/groupも同様に設定します。ホスト環境からコピーしたものを削除することをお勧めします。

記述が出来たらホスト環境のpwd_mkdbコマンドを実行してpasswd,pwd.db,spwd.dbの3つのファイルを作成します.

host# pwd_mkdb -p -d /usr/local/jail2/etc /usr/local/jail2/etc/master.passwd

/etc/master.passwd (jail)

root:*:0:0::0:0:Charlie &:/root:/sbin/nologin
toor:*:0:0::0:0:Bourne-again Superuser:/root:
daemon:*:1:1::0:0:Owner of many system processes:/root:/sbin/nologin
operator:*:2:5::0:0:System &:/:/sbin/nologin
bin:*:3:7::0:0:Binaries Commands and Source:/:/sbin/nologin
kmem:*:5:65533::0:0:KMem Sandbox:/:/sbin/nologin
man:*:9:9::0:0:Mister Man Pages:/usr/share/man:/sbin/nologin
www:*:80:80::0:0:World Wide Web Owner:/nonexistent:/sbin/nologin
nobody:*:65534:65534::0:0:Unprivileged user:/nonexistent:/sbin/nologin

/etc/group (jail)

wheel:*:0:root
daemon:*:1:daemon
kmem:*:2:root
sys:*:3:root
tty:*:4:root
bin:*:7:
man:*:9:
www:*:80:
nogroup:*:65533:
nobody:*:65534:

デバイスファイルの作成

/dev以下にデバイスファイルを作ります。

FreeBSD 4系

host# cp /dev/MAKEDEV /usr/local/jail2/dev/
host# cd /usr/local/jail2/dev
host# sh MAKEDEV jail

FreeBSD 5系

ホスト環境の/etc/rc.confにjail_jail2_devfs_enable="YES"と指定することでjail専用のdevfsをマウントします。

packageの準備

ミニツリー環境にインストールするためにホスト環境でwww/apache2のpackageを作成します。jailではIPv6が使用できないためビルド時にWITHOUT_IPV6を指定します。またhttpsを使用しないのであればWITHOUT_SSLも指定します。 まず依存portsであるconverters/libiconv,textproc/expat2,sysutils/rc_subrを先に作成し、最後にwww/apache2を作成します。 ホスト環境でwww/apache2を使う場合は、フルツリー環境のjailを構築してpackageを構築することをオススメします。

host# cd /usr/ports/converters/libiconv
host# make package
host# cd /usr/ports/textproc/expat2
host# make package
host# cd /usr/ports/sysutils/rc_subr
host# make package
host# cd /usr/ports/www/apache2
host# make -DWITHOUT_IPV6 -DWITHOUT_SSL package

jail環境にpackageでインストール

(この項目は書きかけです)

環境変数PKG_DBDIRを一時的にミニツリーjail環境の/var/db/pkgに設定します。 /usr/ports/packages/All/に作成されたpackageを使って、ミニツリーjail環境にインストールします。

host# setenv PKG_DBDIR /usr/local/jail2/var/db/pkg
host# cd /usr/ports/packages/All

pkg_addコマンドのpオプションでjail環境の/usr/localを指定し、packageをインストールします。

host# pkg_add -p /usr/local/jail2/usr/local rc_subr-1.31.tgz
host# pkg_add -p /usr/local/jail2/usr/local libiconv-1.9.2_1.tgz
host# pkg_add -p /usr/local/jail2/usr/local expat-1.95.8.tgz
host# pkg_add -p /usr/local/jail2/usr/local apache-2.0.52_1.tgz

共有ライブラリの検索パスを設定する

この時点のミニツリーjail環境は/var/run/ld-elf.so.hintsが存在しないため、ソフトがライブラリを見つけられずにエラーが出ます。エラーを解消するためにldconfigコマンドを使用します。

host# chroot /usr/local/jail2 ldconfig /usr/lib /usr/local/lib

/etc/rc起動ファイルを設定する

ミニツリーjail環境でApacheを起動するために/etc/rcにリストのようにコマンドを指定します。ホスト環境で作成してjail環境にコピーして設置します。

/etc/rc (jail)

#!/bin/sh
/usr/local/sbin/httpd -k start

参考リンク

HK Technical Note コンパクトなJail環境の構築

Permanent link | Trackback | | このエントリーを含むはてなブックマーク livedoor Clip View blog reactions del.icio.us

otsune posted at 19:45 in
WriteBacks

/etc/make.confの設定例

Last updated $Date: 2006/04/24 16:53:49 $

/etc/make.conf

ホスト固有の設定をするために/etc/make.confで環境変数を指定しましょう。 デフォルト値は/usr/share/example/etc/defaults/make.confを参考にしてください。

コンパイラの最適化の設定

最適化レベルは特に指定しなくても大丈夫です。CFLAGSは/usr/share/mk/sys.mkで、COPTFLAGSは/usr/src/sys/conf/kern.pre.mkで適切に設定されます。過激に細かくオプションをつけるとビルド出来なかったり、OpenSSHが接続できなかったりします。

また使用しているプロセッサの種類をdmesgで確認して、/usr/share/mk/bsd.cpu.mkを参考にCPUTYPEを設定します。

/etc/make.conf

CPUTYPE=    pentium4
#CFLAGS=    -O2 -fno-strict-aliasing -pipe
#COPTFLAGS= -O2 -fno-strict-aliasing -pipe

cvsupの設定

/usr/share/examples/cvsup/以下にサンプルファイルが入っていますので、それを/usr/sup/などにコピーします。

# mkdir -p /usr/sup
# cp -p /usr/share/examples/cvsup/*-supfile /usr/sup/
# cp -p /usr/share/examples/cvsup/refuse /usr/sup/

最近のADSLや光回線などの速度が速い回線を使っている場合は、ports-supfileとstandard-supfileの中にある圧縮を指定する部分をコメントアウトします。cvsupサーバーの負担が軽くなります。

/usr/sup/{ports,standard}-supfile

#*default compress

/etc/make.conf

SUP_UPDATE=     yes
SUP=            /usr/local/bin/cvsup
SUPFLAGS=       -Z -g -L 2
SUPHOST=        cvsup4.jp.freebsd.org
SUPFILE=        /usr/sup/standard-supfile
PORTSSUPFILE=   /usr/sup/ports-supfile
DOCSUPFILE=     /usr/sup/doc-supfile

SUPHOSTは Statistics for CVSup serversで負荷の低いサーバーを見て決めてください。

またはsysutils/fastest_cvsupをインストールして

# fastest_cvsup -c jp

でping値の低い近いサーバーを計測して決めても良いと思います。

ccache の設定

ccacheと/usr/local/share/doc/ccache/ccache-howto-freebsd.txtを参照。

/etc/make.conf

.if (!empty(.CURDIR:M/usr/src*) || !empty(.CURDIR:M/usr/obj*)) && !defined(NOCCACHE)
CC=/usr/local/libexec/ccache/world-cc
CXX=/usr/local/libexec/ccache/world-c++
.endif

distfilesサイトの設定

ローカルLANにdistfilesキャッシュホストを構築した場合にMASTER_SITE_OVERRIDEを指定するとソースコードのダウンロード負荷を減らすことが出来ます。

/etc/make.conf

MASTER_SITE_OVERRIDE=¥
    http://ports.example.jp/ports/distfiles/${DIST_SUBDIR}/

ports.example.jpは環境にあわせて書き換えてください。 定期的にportsclean -Dを実行して古いソースコードを削除することをオススメします。

/usr/portsをNFSでマウントする場合

/usr/portsをNFSで公開して、LAN内のホストでNFSマウントすることでportsツリーを共有することができます。 /etc/exportsに下記のように記入して、/etc/rc.confでnfs_server_enable="YES"を指定してNFSサーバーを起動します。

/etc/exportsの例

/usr/ports -alldirs -network 192.168.1.0 -mask 255.255.255.0

その場合マウントした各ホストは、ビルド中にファイルロックで問題が出ることがあるので、/usr/portsをreadonly(読み込みのみ)でマウントすることをオススメします。 readonlyでマウントした場合、ビルドするために/urs/ports以外の書き込みできるディレクトリをWRKDIRPREFIXで指定する必要があります。 またソースコードをfetchする必要があるときにdistfilesディレクトリが書き込みできる必要があります。それはDISTDIRで指定します。

/etc/fstabの例

192.168.1.1:/usr/ports  /usr/ports  nfs ro,bg   0   0

/etc/make.conf

WRKDIRPREFIX=   /var/tmp
#DISTDIR=   /var/tmp/usr/ports/distfiles/
Permanent link | Trackback | | このエントリーを含むはてなブックマーク livedoor Clip View blog reactions del.icio.us

otsune posted at 03:31 in
WriteBacks

packages & distfilesサーバーの構築

packagesサーバーとは

portsを管理するときに、いちいちソースからコンパイルをするのは時間がかかります。 そこでpackagesを代表ホスト1台で作成して、他のホストはそのpackagesをインストールすることにします。

packagesサーバーにはCPUやHDDの速度が速いマシンを選択するのが良いでしょう。

packagesディレクトリを用意する

mkdir -p /usr/ports/packages

/etc/make.conf

DEPENDS_TARGET=package 
FORCE_PACKAGE=yes

p5-FreeBSD-Portindex

portindex参照。

net/cvsup-mirror

portsツリーの同期をするために多数のホストでcvsupを使用するのであれば、packagesサーバーをcvsupミラーサーバーとして設定することで外部へのトラフィックをへらすことが出来ます。

あらかじめfastest_cvsup -c jpでホストから一番速いcvsupサーバーを探しておきます。

次にcvsup-mirrorをインストールします。

#portinstall net/cvsup-mirror

インストールの段階で対話的に設定していくことでcvsupサーバーが稼動します。 /etc/crontabに更新スクリプトが追加されるので、rootのcrontab -eに設定を移動することにします。 また普段の更新はupdate.sh -sで-sオプションをつけることで負荷を減らすことが出来ます。 この例では8時と20時に-s付きで更新して、週に1度だけupdate.shをするように設定しています。

crontab

1   8,20    *   *   0-5 /usr/local/etc/cvsup/update.sh -s \
> /dev/null
1   20  *   *   6   /usr/local/etc/cvsup/update.sh -s \
> /dev/null
1   8   *   *   6   /usr/local/etc/cvsup/update.sh \
> /dev/null

ccacheを使う

ccache参照。 ccacheを使用するとビルドに失敗するportsは/usr/local/etc/pkgtools.confのMAKE_ARGSにNOCCACHE=yを指定しておく。

毎日実行すること

  • portindexで/usr/ports/INDEXの生成
  • portsdb -uで/usr/ports/INDEX.dbの生成
  • portupgrade -aFでアップデートされたportsのdistfilesをfetchしておく
  • portupgrade -apでアップデートされたportsのビルド
  • portsclean -DPで古いdistfilesとpackagesの削除

INDEXとINDEX.dbを圧縮する

bzip2で圧縮して転送ファイルサイズを減らします。

cd /usr/ports
/usr/bin/bzip2 -fk /usr/ports/INDEX.db
/usr/bin/bzip2 -fk /usr/ports/INDEX

www/apache2でpackagesを公開する

Webサーバーとしてapache2をインストールする。

#portinstall www/apache2

/usr/local/etc/apache2/httpd.confにディレクティブを追加する。

/usr/local/etc/apache2/httpd.conf

Alias /ports/ "/usr/ports/"
<Directory "/usr/ports">
    Options Indexes MultiViews
    AllowOverride None
    Order allow,deny
    Allow from all
</Directory>

クライアントを設定する

INDEXとINDEX.dbをfetchする。スクリプトファイルにしてperiodicやcrontabから自動実行してもよい。

cd /usr/ports
fetch http://ports.example.jp/ports/INDEX.db.bz2 > /dev/null && \
/usr/bin/bunzip2 -f INDEX.db.bz2
fetch http://ports.example.jp/ports/INDEX.bz2 > /dev/null && \
/usr/bin/bunzip2 -f INDEX.bz2

/etc/make.confに下記のように設定する。ports.example.jpはpackagesサーバーのホスト名に変えること。

/usr/local/etc/pkgtools.confのPKG_SITESの項目にもpackagesサーバーのホスト名を追加しておく。

/etc/make.conf

MASTER_SITE_OVERRIDE=http://ports.example.jp/ports/distfiles/${DIST_SUBDIR}/

/usr/local/etc/pkgtools.conf

PKG_SITES = [
'http://ports.example.jp/ports/',
    pkg_site_mirror(),
]

クライアント側のアップデート

portupgrade -PP hogehogeでpackagesサーバーで作られたバイナリpackageを使用してアップデートできます。(hogehogeには実際のports名を指定してください) INDEX.dbをfetchして更新してあると、portversion -vL=でアップデートされたportsを確認できます。

参考にした資料

  • FreeBSD Press No.10

更新日 $Date: 2004/12/22 18:03:41 $

Permanent link | Trackback | | このエントリーを含むはてなブックマーク livedoor Clip View blog reactions del.icio.us

otsune posted at 03:13 in
WriteBacks

2004-11-29

p5-FreeBSD-Portindexを使う

portindexとは?

portindexはportsdb -Uの代替コマンドです。 以前はcd /usr/ports && make index(/usr/ports/Tools/make_indexを実行しています)やportsdb -Uが/usr/ports/INDEXを生成するコマンドでした。 ファイル生成の高速化のためにportindexが開発されたようです。

なぜportindexを使うのか?

portsの管理のためにsysutils/portupgradeを使用している人は多いと思います。 portupgradeはportsの情報を認識するため、INDEXからINDEX.dbというデータベースを生成します。/usr/ports/INDEXというテキストファイルは、そのまま検索などの用途に使用するには非効率なためです。 INDEXを生成するにはportsdb -Uというコマンドを使います。しかし、コマンドを実行するたびに毎回/usr/ports以下を全てスキャンするので、かなり時間がかかります。 そこでcvsupでアップデートされたportsツリーだけを指定して、高速にデータベースを更新するportindexが作られました。

使わなくても何とかなる?

http://www.FreeBSD.org/ports/INDEX.bz2が24時間サイクルで更新されているそうです。 通常は下記のように

# cd /usr/ports
# make fetchindex

すれば問題は無いでしょう。 /etc/make.confなどにMASTER_SITE_INDEXを設定することでwww.FreeBSD.org以外のホストを指定することも可能です。

インストール

portsからインストールします。

# cd /usr/ports/sysutils/p5-FreeBSD-Portindex
# make install clean
# rehash

portupgradeを使っているのであれば

# portinstall sysutils/p5-FreeBSD-Portindex

でも構いません。

初期データベースを作成します。高速なマシンでも数時間ほどかかるようです。

# cache-init

初期データベースが作られれば、あとは更新されたportsだけをcache-updateコマンドでアップデートすれば一瞬でデータベースを更新できます。

設定

/etc/daily.localやcrontab -eや/usr/local/etc/periodic/daily/999.portindexなどにスクリプトを記入します。 /etc/make.confでcvsupする設定が出来ている場合は

cd /usr/ports && script /tmp/cvsup.out make update

でも構いません。 /usr/sup/ports-supfileのSUPHOSTは設定して置いてください。 portupgradeのpkgtools.confで

ENV['PORTS_INDEX'] ||= ENV['PORTSDIR'] + '/INDEX.local'

などとローカルINDEXを指定している場合はportindexの引数をあわせて変更してください。

#!/bin/sh -f
#
cd /usr/ports
script /tmp/cvsup.out \
        /usr/local/bin/cvsup -g -L2  \
        /usr/sup/ports-supfile
/usr/local/bin/cache-update -i /tmp/cvsup.out
/usr/local/bin/portindex -o /usr/ports/INDEX
/usr/local/sbin/portsdb -u
#/usr/bin/bzip2 -fk /usr/ports/INDEX.db
#/usr/bin/bzip2 -fk /usr/ports/INDEX

bzip2で圧縮することは、1台のホストでINDEXを生成して他ホストへ転送する場合に有用です。

/usr/portsをApacheで公開する

生成するホストをports.example.jpとした場合、Apacheなどで/usr/ports/を公開します。 /usr/local/etc/apache/http.confで

Alias /ports "/usr/ports"
<Directory "/usr/ports">
    Options None
    AllowOverride None
    Order allow,deny
    Allow from 192.168.1.0/24
    Allow from 192.168.2.0/24
    Deny from All
</Directory>

というディレクティヴを指定して公開します。AllowはLANの環境に合わせて制限してください。

/usr/portsを直接公開したくないのであれば/etc/make.confで

PACKAGES=   /usr/local/www/ports/
DISTDIR=    /usr/local/www/ports/distfiles

と指定することで、ビルドしたpackagesとdistfilesをどこに保存するか指定できる。 その場合はhttpd.confのディレクティヴを

Alias /ports "/usr/local/www/data/ports"
<Directory "/usr/local/www/data/ports">
    Allow from All
</Directory>

などと指定する。

各ホストのINDEXの更新

各ホストは

# cd /usr/ports
# make update
# fetch http://ports.example.jp/ports/INDEX.db.bz2 \
# > /dev/null && /usr/bin/bunzip2 -f INDEX.db.bz2
# fetch http://ports.example.jp/ports/INDEX.local.bz2 \
# > /dev/null && /usr/bin/bunzip2 -f INDEX.local.bz2

というスクリプトを実行することでINDEXなどが更新できます。

参考

FreeBSD::Portindex

Permanent link | Trackback | | このエントリーを含むはてなブックマーク livedoor Clip View blog reactions del.icio.us

otsune posted at 13:03 in
WriteBacks

ccacheとdistccでビルドを高速に

Last updated $Date: 2006/07/03 06:49:13 $

ccacheとdistcc

カーネル再構築の時や、開発中など同じソースコードを何度もビルドする事が良くあります。ccacheを使うとコンパイラのプリプロセスした結果を保存して、再利用することができます。

distccを使うとネットワーク上の複数のホストでビルドを分担することができます。ccahceと同時に使用できます。(各ホストでコンパイラのバージョンをあわせておく必要があります)

インストール

portupgradeを使ってインストールする。普通にportsからmake installしても良い。

# portinstall devel/ccache devel/distcc

cacheディレクトリの設定

デフォルトでは${HOME}/.ccacheにキャッシュするので、余裕のあるディレクトリを指定する。 ここでは/usr/local/var/.ccacheを使用する場合を説明する。

# mkdir -p /usr/local/var/.ccache

ディレクトリはCCACHE_DIR環境変数で指定する。

CCACHE_DIR=/usr/local/var/.ccache

distccのホストを指定

DISTCC_HOSTS環境変数でビルドを割り振るホストを指定します。 名前解決できるホスト名かIPアドレスを列記しましょう。 割り振り先のホストではdistccdをあらかじめ起動しておく必要があります。/etc/rc.confにdistccd_enable="YES"を設定しておきます。(最近のバージョンではssh経由での動作も出来るようです) CCACHE_PREFIXでdistccを指定することでccacheと同時に使用できます。

環境変数の指定

/etc/make.confに記入する。

.if (!empty(.CURDIR:M/usr/src*) || !empty(.CURDIR:M/usr/obj*)) && !defined(NOCCACHE)
CC=/usr/local/libexec/ccache/world-cc
CXX=/usr/local/libexec/ccache/world-c++
.endif

/etc/csh.cshrc

setenv PATH /usr/local/libexec/ccache/:$PATH
setenv CCACHE_PATH /usr/bin:/usr/local/bin
setenv CCACHE_DIR /usr/local/var/.ccache
setenv CCACHE_LOGFILE /var/log/ccache.log
#To use distcc
CCACHE_PREFIX /usr/local/bin/distcc
DISTCC_HOSTS 'localhost host1 host2 host3'

host1 host2 host3は自分の環境に合わせて。詳しくはdistccのマニュアルを参照。

ビルドしてみる

この設定が出来た状態で、普通にportsやカーネルをmake buildkernelすれば使用できます。 distccを使う場合は

# cd /usr/src
# make -j4 buildkernel

というふうに-jオプションを指定するか、MAKEOPTS=4などと環境変数に指定して並列にビルドすると効率的です。

参考url

ccache

distcc

dW : Linux : distccでコンパイル時間を削減する

Permanent link | Trackback | | このエントリーを含むはてなブックマーク livedoor Clip View blog reactions del.icio.us

otsune posted at 06:57 in
WriteBacks
TrackBack ping me at
http://www.otsune.com/bsd/ports/ccache_distcc.
Post a comment

writeback message: