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
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.
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 :