次のページ 前のページ 目次へ

4. 仮想スクリプト(Virt scripts)

4.1 virtfs

各ドメインはそれぞれのディレクトリ構造を持っています。 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

4.2 virtexec

仮想環境でコマンドを実行するにはそのディレクトリへ 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)を必要とするときは 仮想ファイルシステム上になければなりません。バイナリファイルも同様に 仮想ファイルシステム上になければなりません。

4.3 virtfsとvirtexecに関する注意

著者は全てのスクリプトを/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にシンボリックリンクをはっているプログラムは

です。


次のページ 前のページ 目次へ