Page suivantePage précédenteTable 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.1.1.1 $'
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.1.1.1 $'
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.1.1.1 $'
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 suivantePage précédenteTable des matières