はじめに

FreeBSDでは、jailと呼ばれる仕組みを利用することにより、FreeBSD環境上に仮想のFreeBSD環境を複数構築することが出来ます。

jailはUNIXに古くから存在するchrootを発展させたもので、ホスト環境(以下、便宜上「jailer」と呼びます)上に構築したjail環境(以下、便宜上「prisoner」と呼びます)は、ホスト環境とは別に動作するFreeBSDマシンとして振舞います。

prisonerからはjailerおよび並列する別のprisonerに直接アタッチすることが出来ないため、システム管理者がシステムの一部の権利を他者に委譲しなくてはならない場合等に有効な解決策となります。

このように非常に便利なjailですが、prisonerが自分自身を再起動することはできず、システムを再起動させることに慣れたユーザにとっては何かと不便です。

このページでは、prisonerを自分自身の契機で再起動させる方法について説明します。

実現の方法

jailは、jailerとprisoner間でファイルシステムを共有するため、prisonerのファイルシステムをjailer側から参照することができます。
この性質を利用して、「prisonerのファイルシステム上に特定のファイルがあれば、当該prisonerを再起動させる」仕組みを構築します。

prisoner上の再起動要求を検出するスクリプト

今回は、prisonerのルート「/」に「.restart」というファイルがある場合に、当該のprisonerを再起動させるような環境を構築してみます。

まず最初に、jailerに下記のようなシェルスクリプトを用意します。

再起動が必要なprisonerの検出&再起動スクリプト
#!/bin/sh

jail_root='/home/jail/';
jail_restart_target='';

check()
{
	if [ -e ${jail_root}/${1}/.restart ]
	then
		rm ${jail_root}/${1}/.restart
		jail_restart_target="${jail_restart_target}${1} "
	fi
}

check 'prisoner1'
check 'prisoner2'
check 'prisoner3'
check 'prisoner4'

if [ '' != "${jail_restart_target}" ]
then
	/etc/rc.d/jail restart ${jail_restart_target} 1> /dev/null 2> /dev/null
fi

上記の例では、「/home/jail」下に4つのprisoner、「prisoner1」「prisoner2」「prisoner3」「prisoner4」が存在する場合のスクリプトです。
それぞれのルートディレクトリに「.restart」があるかチェックし、あれば文字列「jail_restart_target」に追加、最後にまとめて「/etc/rc.d/jail」で再起動させます。

このシェルスクリプトを、「/root/bin/jail_restart.sh」として保存し(場所はどこでも構いません、以下の説明の便宜上このディレクトリにしています)、rootが実行できるように実行権限を付与してください。

cronの設定

次に、このスクリプトが一定時間感覚ごとに実行されるようします。
以下のようにしてcronタブを編集してください。

「crontab」の実行
$ crontab -u root -e

エディタが起動しますので、そこで以下のように記述してください。

「crontab」の編集
PATH=/bin:/sbin:/usr/bin:/usr/sbin

*/5     *       *       *       *       /root/bin/jail_restart.sh

上記の例では、5分に一回、「/root/bin/jail_restart.sh」を実行させます。
prisoner上で「/.restart」を作成すれば、平均待ち時間2分30秒でシステムを再起動させることができます。

また、上記のPATHについては、必ず記述するようにしてください。
「/etc/rc.d/jail」は内部で「umount」等、いくつかの外部コマンドを呼び出すため、この記述がないと、「/etc/rc.d/jail」は外部コマンドの呼び出しに失敗し、prisonerがうまく再起動しません。(私も15分程嵌りました)

prisoner側からの再起動要求

上記の設定が完了したら、実際にprisoner側からシステムを再起動させてみます。
以下のようにして「/.restart」を作成してください。

「/.restart」の作成
$ touch /.restart

cronにより「/root/bin/jail_restart.sh」が実行されれば、prisonerが再起動される筈です。


あなたの探し物は見つかりましたか?
まさにこれだ
参考になった
ちょっと違う
これじゃない

何かメッセージがあればお願いします

このメッセージを非公開にする

ご注意

・頂いたメッセージは管理者のチェックの後、公開されます。
・メッセージの公開を希望されない場合には、「このメッセージを非公開にする」にチェックを入れてください。
・管理者が不適切と判断したメッセージは公開しませんので、予めご了承ください。


まだ評価がありません

表示できるメッセージはありません。