Previous Next Table of Contents

4. Scripts utiles

4.1 virtfs

Chaque domaine doit avoir une arborescence de répertoires. Puisque vous utilisez chroot, vous aurez besoin de copies multiples des librairies, binaires, fichiers de configuration, etc... partagés. J'utilise le répertoire /virtual/domaine.com pour chaque domaine que je crée. Je comprends bien que cela représente du gaspillage d'espace disque, mais l'espace disque est meilleur marché qu'une nouvelle machine ou que des cartes réseau. Si vous désirez réellement sauver de l'espace disque, vous pouvez lier les fichiers entre eux, afin qu'une seule copie de chaque binaire soit présente.

Voici un fichier virtfs d'exemple :

#!/bin/bash

echo '$Revision: 1.19 $'

echo -n "Saisissez le nom de domaine : "
read domain

if [ "$domain" = "" ]
then
        echo Vous n'avez rien saisi : on arrête là
        exit 0
fi

leadingdir=/virtual

echo -n "Saisissez le nom du répertoire contenant les domaines (défaut: $default): "
read ans

if [ "$ans" != "" ]
then
        leadingdir=$ans
fi 

newdir=$leadingdir/$domain

if [ -d "$newdir" ]
then
        echo Le répertoire $newdir existe déjà
        exit 0
else
        echo Nouveau répertoire : $newdir
fi

echo Creation de $newdir
mkdir -p $newdir

echo Creation de bin
cp -pdR /bin $newdir

echo Creation de dev
cp -pdR /dev $newdir

echo Creation de dev/log
ln -f /virtual/log $newdir/dev/log

echo Creation d'etc
mkdir -p $newdir/etc
for i in /etc/* 
do 
        if [ -d "$i" ]
        then 
                continue
        fi
        cp -pd $i $newdir/etc
done

echo Creation de etc/skel
mkdir -p $newdir/etc/skel

echo Creation de 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 
do 
        mkdir -p $newdir/home/$i
done

echo Creation de home/c/crc
mkdir -p $newdir/home/c/crc
chown crc.users $newdir/home/c/crc

echo Creation de lib
mkdir -p $newdir/lib
for i in /lib/* 
do 
        if [ -d "$i" ]
        then 
                continue
        fi
        cp -pd $i $newdir/lib
done

echo Creation de proc
mkdir -p $newdir/proc

echo Creation de sbin
cp -pdR /sbin $newdir

echo Creation de tmp
mkdir -p -m 0777 $newdir/tmp
chmod +t $newdir/tmp

echo Creation de usr
mkdir -p $newdir/usr

echo Creation de usr/bin
cp -pdR /usr/bin $newdir/usr

echo Creation de usr/lib
mkdir -p $newdir/usr/lib

echo Creation de usr/lib/locale
cp -pdR /usr/lib/locale $newdir/usr/lib

echo Creation de usr/lib/terminfo
cp -pdR /usr/lib/terminfo $newdir/usr/lib

echo Creation de usr/lib/zoneinfo
cp -pdR /usr/lib/zoneinfo $newdir/usr/lib

echo Creation de usr/lib/\*.so\*
cp -pdR /usr/lib/*.so* $newdir/usr/lib

echo Creation de usr/sbin
cp -pdR /usr/sbin $newdir/usr

echo Lien de usr/tmp vers /tmp
ln -s /tmp $newdir/usr/tmp

echo Creation de var
mkdir -p $newdir/var

echo Creation de var/lock
cp -pdR /var/lock $newdir/var

echo Creation de var/log
mkdir -p $newdir/var/log

echo Creation de var/log/wtmp
cp /dev/null $newdir/var/log/wtmp

echo Creation de var/run
cp -pdR /var/run $newdir/var

echo Creation de var/run/utmp
cp /dev/null $newdir/var/run/utmp

echo Creation de var/spool
cp -pdR /var/spool $newdir/var

echo Lien de var/tmp vers /tmp
ln -s /tmp $newdir/var/tmp 

echo Creation de var/www/html
mkdir -p $newdir/var/www/html
chown webmast.www $newdir/var/www/html
chmod g+s $newdir/var/www/html

echo Creation de var/www/master
mkdir -p $newdir/var/www/master
chown webmast.www $newdir/var/www/master

echo Creation de var/www/server
mkdir -p $newdir/var/www/server
chown webmast.www $newdir/var/www/server

exit 0

4.2 virtexec

Afin d'exécuter des commandes dans un environnement virtuel, vous devez utilise chroot sur ce répertoire puis lancer la commande. J'ai écris un script shell nommé virtexec se chargeant de ces opérations, pour n'importe quelle commande :

#!/bin/sh

echo '$Revision: 1.19 $'

BNAME=`basename $0`
FIRST4CHAR=`echo $BNAME | cut -c1-4`
REALBNAME=`echo $BNAME | cut -c5-`

if [ "$BNAME" = "virtexec" ]
then
        echo Vous ne pouvez pas lancer virtexec directement. Il FAUT un lien symbolique
        exit 0
fi

if [ "$FIRST4CHAR" != "virt" ]
then
        echo Le lien ne pointe pas sur une fonction virtuelle
        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 Je ne trouve pas d'environnement virtuel
        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.19 $'

if [ ! -d "$newdir" ]
then
        echo Le nouveau repertoire $newdir N'EXISTE PAS
        exit 0
else
        echo Nouveau repertoire : $newdir
fi

echo bname: $BNAME

echo realbname: $REALBNAME

if [ "$*" = "" ]
then
        echo argumentss: aucun
else
        echo args: $*
fi

echo Changement de repertoire vers $newdir
cd $newdir

echo Lancement de $REALBNAME

chroot $newdir $REALBNAME $*

exit 0

Veuillez noter que vous devez disposer du programme dialog sur votre système pour que ce script fonctionne. Pour utiliser virtexec, créez un lien symbolique d'un programme vers celui-ci. Par exemple :

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

A présent, si vous tapez virtvi ou virtpasswd ou encore virtmailq, cela vous permettra d'éditer un fichier, changer le mot de passe d'un utilisateur, ou vérifier la queue de mail sur votre système virtuel. Vous pouvez créer autant de liens vers virtexec que vous désirez. Cependant, notez bien que si votre programme nécessite une librairie partagée, celle-ci doit se trouver sur le système de fichiers virtuel. Le binaire doit exister sur le système de fichiers virtuel également.

4.3 Notes à propos de virtfs et virtexec

J'installe tous les scripts dans /usr/bin. Tout ce que je ne désire pas mettre sur un système de fichier virtuel, je le place dans /usr/local. Le script ne touche à rien dans ce répertoire lors de la copie. Les fichiers ne devant pas chevaucher plusieurs systèmes de fichiers virtuels doivent être supprimés. Par exemple, ssh est installé sur mon système, et je n'ai pas voulu que les clefs privées soient disponibles sur tous les systèmes de fichier. J'ai donc supprimé le fichier des systèmes de fichiers virtuels après avoir lancé virtfs. Je change également le resolv.conf et supprime tout ce qui contient le nom d'un autre domaine, pour des raisons légales. Par exemple, les fichiers /etc/hosts et /etc/HOSTNAME.

Les programmes pour lesquels je fais un lien symbolique vers virtexec sont :


Previous Next Table of Contents