各ドメインはそれぞれのディレクトリ構造を持っています。 chroot
を
使っているのでシェアライブラリ(shared libraries), バイナリ, conf ファイル等
の 重複したコピーが必要になります。著者は各ドメイン用の
/virtual/domain.com
を作り、それぞれにコピーして使っています。
そのため多くのディスクスペースを使いますが新しいマシンやネットワークカード
を購入するよりは安価でしょう。もしディスクスペースを節約したいのなら
それぞれのファイルをリンクすれば間に合います
(訳注:このリンクはシンボリックリンクではありません)。
ここでvirtfsスクリプトの例をあげます。
#!/bin/bash echo '$Revision: 1.2 $' 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.2 $' 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.2 $' 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にシンボリックリンクをはっているプログラムは