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