Page suivante Page précédente Table des matières

4. Scripts shell

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. J'utilise le répertoire /virtual/domaine1.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 faire des liens, afin qu'une seule copie de chaque binaire soit présente. Le systeme de fichiers que j'utilise prend un peu plus de 2Mo. Le script essaye de copier tous les fichiers du système de fichiers principal pour que ce soit le plus identique possible.

Voici un fichier virtfs d'exemple :

#!/bin/bash

echo '$Revision: 1.49 $'

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: $leadingdir): "
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 Création de $newdir
mkdir -p $newdir

echo Création de bin
cp -pdR /bin $newdir

echo Création de dev
cp -pdR /dev $newdir

echo Création de dev/log
ln -f /virtual/log $newdir/dev/log

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

echo Création de etc/skel
mkdir -p $newdir/etc/skel

echo Création 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 Création de home/c/crc
mkdir -p $newdir/home/c/crc
chown crc.users $newdir/home/c/crc

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

echo Création de proc
mkdir -p $newdir/proc

echo Création de sbin
cp -pdR /sbin $newdir

echo Création de tmp
mkdir -p -m 0777 $newdir/tmp
chmod +t $newdir/tmp

echo Création de usr
mkdir -p $newdir/usr

echo Création de usr/bin
cp -pdR /usr/bin $newdir/usr

echo Création de usr/lib
mkdir -p $newdir/usr/lib

echo Création de usr/lib/locale
cp -pdR /usr/lib/locale $newdir/usr/lib

echo Création de usr/lib/terminfo
cp -pdR /usr/lib/terminfo $newdir/usr/lib

echo Création de usr/lib/zoneinfo
cp -pdR /usr/lib/zoneinfo $newdir/usr/lib

echo Création de usr/lib/\*.so\*
cp -pdR /usr/lib/*.so* $newdir/usr/lib

echo Création de usr/sbin
cp -pdR /usr/sbin $newdir/usr

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

echo Création de var
mkdir -p $newdir/var

echo Création de var/lock
cp -pdR /var/lock $newdir/var

echo Création de var/log
mkdir -p $newdir/var/log

echo Création de var/log/wtmp
cp /dev/null $newdir/var/log/wtmp

echo Création de var/run
cp -pdR /var/run $newdir/var

echo Création de var/run/utmp
cp /dev/null $newdir/var/run/utmp

echo Création de var/spool
cp -pdR /var/spool $newdir/var

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

echo Création 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 Création de var/www/master
mkdir -p $newdir/var/www/master
chown webmast.www $newdir/var/www/master

echo Création 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 utiliser chroot sur ce répertoire puis lancer la commande. J'ai écrit un script shell nommé virtexec se chargeant de ces opérations, pour n'importe quelle commande :

#!/bin/sh

echo '$Revision: 1.49 $'

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.49 $'

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

echo bname: $BNAME

echo realbname: $REALBNAME

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

echo Changement de répertoire 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/local/bin/virtexec /usr/local/bin/virtpasswd
ln -s /usr/local/bin/virtexec /usr/local/bin/virtvi
ln -s /usr/local/bin/virtexec /usr/local/bin/virtpico
ln -s /usr/local/bin/virtexec /usr/local/bin/virtemacs
ln -s /usr/local/bin/virtexec /usr/local/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 file d'attente de mail sur votre système virtuel. Vous pouvez créer autant de liens vers virtexec que vous le 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, ainsi que les binaires.

4.3 Notes

J'installe tous les scripts dans /usr/local/bin. Tout ce que je ne désire pas mettre sur le système de fichiers 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 :


Page suivante Page précédente Table des matières