各ドメインはそれぞれのディレクトリ構造を持っています。 chroot を
使っているのでシェアライブラリ(shared libraries), バイナリ, conf ファイル等
の 重複したコピーが必要になります。著者は各ドメイン用の
/virtual/domain.comを作り、それぞれにコピーして使っています。
そのため多くのディスクスペースを使いますが新しいマシンやネットワークカード
を購入するよりは安価でしょう。もしディスクスペースを節約したいのなら
それぞれのファイルをリンクすれば間に合います
(訳注:このリンクはシンボリックリンクではありません)。
ここでvirtfsスクリプトの例をあげます。
#!/bin/bash
echo '$Revision: 1.21 $'
echo -n "Enter the domain name: "
read domain
if [ "$domain" = "" ]
then
echo Nothing entered: aborting
exit 0
fi
leadingdir=/virtual
echo -n "Enter leading dir: (Enter for default: $leadingdir): "
read ans
if [ "$ans" != "" ]
then
leadingdir=$ans
fi
newdir=$leadingdir/$domain
if [ -d "$newdir" ]
then
echo New directory: $newdir: ALREADY exists
exit 0
else
echo New directory: $newdir
fi
echo Create $newdir
mkdir -p $newdir
echo Create bin
cp -pdR /bin $newdir
echo Create dev
cp -pdR /dev $newdir
echo Create dev/log
ln -f /virtual/log $newdir/dev/log
echo Create etc
mkdir -p $newdir/etc
for i in /etc/*
do
if [ -d "$i" ]
then
continue
fi
cp -pd $i $newdir/etc
done
echo Create etc/skel
mkdir -p $newdir/etc/skel
echo Create home
for i in a b c d e f g h i j k l m n o p q r s t u v w x y z
# (訳注:ここの[a-z]はそれぞれ設定するユーザー名に変更します)
do
mkdir -p $newdir/home/$i
done
echo Create home/c/crc
mkdir -p $newdir/home/c/crc
chown crc.users $newdir/home/c/crc
# (訳注:ここも設定したユーザーに合わせて変更して下さい)
echo Create lib
mkdir -p $newdir/lib
for i in /lib/*
do
if [ -d "$i" ]
then
continue
fi
cp -pd $i $newdir/lib
done
echo Create proc
mkdir -p $newdir/proc
echo Create sbin
cp -pdR /sbin $newdir
echo Create tmp
mkdir -p -m 0777 $newdir/tmp
chmod +t $newdir/tmp
echo Create usr
mkdir -p $newdir/usr
echo Create usr/bin
cp -pdR /usr/bin $newdir/usr
echo Create usr/lib
mkdir -p $newdir/usr/lib
echo Create usr/lib/locale
cp -pdR /usr/lib/locale $newdir/usr/lib
# (訳注:ここのディレクトリ適当に変更します)
echo Create usr/lib/terminfo
cp -pdR /usr/lib/terminfo $newdir/usr/lib
echo Create usr/lib/zoneinfo
cp -pdR /usr/lib/zoneinfo $newdir/usr/lib
echo Create usr/lib/\*.so\*
cp -pdR /usr/lib/*.so* $newdir/usr/lib
echo Create usr/sbin
cp -pdR /usr/sbin $newdir/usr
echo Linking usr/tmp
ln -s /tmp $newdir/usr/tmp
echo Create var
mkdir -p $newdir/var
echo Create var/lock
cp -pdR /var/lock $newdir/var
echo Create var/log
mkdir -p $newdir/var/log
echo Create var/log/wtmp
cp /dev/null $newdir/var/log/wtmp
echo Create var/run
cp -pdR /var/run $newdir/var
echo Create var/run/utmp
cp /dev/null $newdir/var/run/utmp
echo Create var/spool
cp -pdR /var/spool $newdir/var
echo Linking var/tmp
ln -s /tmp $newdir/var/tmp
echo Create var/www/html
mkdir -p $newdir/var/www/html
chown webmast.www $newdir/var/www/html
# (訳注:ここのchownも適当に変更しておいて下さい。以下同様)
chmod g+s $newdir/var/www/html
echo Create var/www/master
mkdir -p $newdir/var/www/master
chown webmast.www $newdir/var/www/master
echo Create var/www/server
mkdir -p $newdir/var/www/server
chown webmast.www $newdir/var/www/server
exit 0
仮想環境でコマンドを実行するにはそのディレクトリへ chroot してから
実行します。ここでコマンドを操作するvirtexecを呼び出すシェル
スクリプトを書きました。
(訳注:以下のコードを切り取って/usr/binディレクトリにコピー
します。属性の変更(chmod +x)をしておいて下さい)。
#!/bin/sh
echo '$Revision: 1.21 $'
BNAME=`basename $0`
FIRST4CHAR=`echo $BNAME | cut -c1-4`
REALBNAME=`echo $BNAME | cut -c5-`
if [ "$BNAME" = "virtexec" ]
then
echo Cannot run virtexec directly: NEED a symlink
exit 0
fi
if [ "$FIRST4CHAR" != "virt" ]
then
echo Symlink not a virt function
exit 0
fi
list=""
num=1
for i in /virtual/*
do
if [ ! -d "$i" ]
then
continue
fi
if [ "$i" = "/virtual/lost+found" ]
then
continue
fi
list="$list $i $num"
num=`expr $num + 1`
done
if [ "$list" = "" ]
then
echo No virtual environments exist
exit 0
fi
dialog --clear --title 'Virtexec' --menu Pick 20 70 12 $list 2> /tmp/menu.$$
if [ "$?" = "0" ]
then
newdir=`cat /tmp/menu.$$`
else
newdir=""
fi
tput clear
rm -f /tmp/menu.$$
echo '$Revision: 1.21 $'
if [ ! -d "$newdir" ]
then
echo New directory: $newdir: NOT EXIST
exit 0
else
echo New directory: $newdir
fi
echo bname: $BNAME
echo realbname: $REALBNAME
if [ "$*" = "" ]
then
echo args: none
else
echo args: $*
fi
echo Changing to $newdir
cd $newdir
echo Running program $REALBNAME
chroot $newdir $REALBNAME $*
exit 0
dialog プログラムがインストール
されている必要があります。注意してください。
(訳注:dialog = シェルスクリプトからダイアログボックスを開く
コマンドです。ほとんどのシステムではインストールされています)。
virtexecを使うためにシンボリックリンクをはります。例えば、
ln -s /usr/bin/virtexec /usr/bin/virtpasswd ln -s /usr/bin/virtexec /usr/bin/virtvi ln -s /usr/bin/virtexec /usr/bin/virtpico ln -s /usr/bin/virtexec /usr/bin/virtemacs ln -s /usr/bin/virtexec /usr/bin/virtmailqここで
virtvi、virtpasswd、virtmailq等と入力すればそれぞれviが起動した
り、ユーザーのパスワードが変更できたり、仮想システム上のメールキューを
チェックできたりします。必要に応じてもっと多くリンクをはることもできます。
しかしプログラムがシェアライブラリ(shared library)を必要とするときは
仮想ファイルシステム上になければなりません。バイナリファイルも同様に
仮想ファイルシステム上になければなりません。
著者は全てのスクリプトを/usr/binにインストールしています。仮想ファイル
システム上に置きたくないものは/usr/localに置いています。スクリプトは
コピーに関してなにもタッチしないようにします。
仮想ファイルシステム間でまたがらないことが重要な全てのファイルは削除しなく
てはいけません。
例えば、著者のシステムにはsshがインストールされていますが、プライベートキー
(private key)はどの仮想ファイルシステムからも見えるようにはしたくありません。
そこでvirtfsを実行した後にそれぞれの仮想ファイルシステムからプライベートキー
を削除しています。
(訳注:sshはSecure Shellのことです。secure authentication,
encryption, encrypted X11 connections, encrypted TCP/IP forwarding
をもったリモートログインプログラムで,適当なアーカイブサーバの
archives/net/ssh/ディレクトリなどから入手できます)
またresolv.conf(訳注: DNS情報など /etc/resolv.conf) も変更し
他のドメイン名があるファイルは全て移動しています。例えば
/etc/hosts や /etc/HOSTNAMEなどです。
virtexecにシンボリックリンクをはっているプログラムは