Hvert domene burde få hver sin katalogstruktur. Siden du bruker chroot vil du kreve dupliserte kopier av de delte bibliotek, binærene, conf filer, osv. Jeg bruker /etc/virtual/domain1.com for hvert domene som jeg lager.
Jeg vet at det tar opp mer diskplass, men det er rimeligere enn en helt ny maskin og nettverkskort. Hvis du virkelig vil spare på diskplassen kan du hardlinke filene sammen så bare en kopi av av hver binærfil eksisterer. Filsystemet som jeg bruker tar opp litt mer enn 2 megabytes. Men likevel, dette scriptet prøver å kopiere alle filene fra hovedfilsystemet for å være så generelt som mulig.
Her er et eksempel på et virtfs script:
#!/bin/sh echo '$Revision: 1.49 $' echo -n "Enter the domain name: " read domain if [ "$domain" = "" ] then echo Nothing entered: aborting exit 0 fi leadingdir=/virtual echo -n "Enter leading dir: (Enter for default: $leadingdir): " read ans if [ "$ans" != "" ] then leadingdir=$ans fi newdir=$leadingdir/$domain if [ -d "$newdir" ] then echo New directory: $newdir: ALREADY exists exit 0 else echo New directory: $newdir fi echo Create $newdir mkdir -p $newdir echo Create bin cp -pdR /bin $newdir echo Create dev cp -pdR /dev $newdir echo Create dev/log ln -f /virtual/log $newdir/dev/log echo Create etc mkdir -p $newdir/etc for i in /etc/* do if [ -d "$i" ] then continue fi cp -pd $i $newdir/etc done echo Create etc/skel mkdir -p $newdir/etc/skel echo Create 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 Create home/c/crc mkdir -p $newdir/home/c/crc chown crc.users $newdir/home/c/crc echo Create lib mkdir -p $newdir/lib for i in /lib/* do if [ -d "$i" ] then continue fi cp -pd $i $newdir/lib done echo Create proc mkdir -p $newdir/proc echo Create sbin cp -pdR /sbin $newdir echo Create tmp mkdir -p -m 0777 $newdir/tmp chmod +t $newdir/tmp echo Create usr mkdir -p $newdir/usr echo Create usr/bin cp -pdR /usr/bin $newdir/usr echo Create usr/lib mkdir -p $newdir/usr/lib echo Create usr/lib/locale cp -pdR /usr/lib/locale $newdir/usr/lib echo Create usr/lib/terminfo cp -pdR /usr/lib/terminfo $newdir/usr/lib echo Create usr/lib/zoneinfo cp -pdR /usr/lib/zoneinfo $newdir/usr/lib echo Create usr/lib/\*.so\* cp -pdR /usr/lib/*.so* $newdir/usr/lib echo Create usr/sbin cp -pdR /usr/sbin $newdir/usr echo Linking usr/tmp ln -s /tmp $newdir/usr/tmp echo Create var mkdir -p $newdir/var echo Create var/lock cp -pdR /var/lock $newdir/var echo Create var/log mkdir -p $newdir/var/log echo Create var/log/wtmp cp /dev/null $newdir/var/log/wtmp echo Create var/run cp -pdR /var/run $newdir/var echo Create var/run/utmp cp /dev/null $newdir/var/run/utmp echo Create var/spool cp -pdR /var/spool $newdir/var echo Linking var/tmp ln -s /tmp $newdir/var/tmp echo Create var/www/html mkdir -p $newdir/var/www/html chown webmast.www $newdir/var/www/html chmod g+s $newdir/var/www/html echo Create var/www/master mkdir -p $newdir/var/www/master chown webmast.www $newdir/var/www/master echo Create var/www/server mkdir -p $newdir/var/www/server chown webmast.www $newdir/var/www/server exit 0
For å eksekvere kommandoer i et virtuelt miljø, må du chroot til den katalogen og deretter kjøre kommandoen. Jeg har skrevet et spesielt shell script kalt virtexec som gjør dette for enhver kommando:
#!/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 Cannot run virtexec directly: NEED a symlink exit 0 fi if [ "$FIRST4CHAR" != "virt" ] then echo Symlink not a virt function 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 No virtual environments exist 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 New directory: $newdir: NOT EXIST exit 0 else echo New directory: $newdir fi echo bname: $BNAME echo realbname: $REALBNAME if [ "$*" = "" ] then echo args: none else echo args: $* fi echo Changing to $newdir cd $newdir echo Running program $REALBNAME chroot $newdir $REALBNAME $* exit 0
Vær klar over at du må ha dialog programmet installert på systemet ditt for at dette skal virke. For å bruke virtexec, symlink et program til det. For eksempel:
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
Hvis du da taster virtvi eller virtpasswd eller virtmailq, vil den la deg vi et program, forandre en bruker's passord eller sjekke mail køen på et virtuelt system. Du kan lage så mange virtexec symlinker som du vil. Merk deg at hvis et program trenger et delt bibliotek, må biblioteket være i det virtuelle filsystemet akkurat som binærfilen.
Jeg installerer alle scriptene i /usr/local/bin. Alt som jeg ikke vil putte i det virtuelle filsystemet, putter jeg i /usr/local. Scriptet kopierer ingen av filene i /usr/local til det virtuelle filsystemet. Hvilke som helst filer som er viktig at de ikke krysser virtuelle filsystemer bør bli tatt vekk. For eksempel, ssh er installert på mitt system og jeg ville ikke ha den private nøkkelen for serveren liggende på alle de virtuelle filsystemene så jeg tar den vekk fra hvert virtuelt filsystem etter jeg har kjørt virtfs. Jeg forandrer også resolv.conf og tar vekk alt som har navnet til et annet domene for juridiske grunner. For eksempel, /etc/hosts og /etc/HOSTNAME.
Programmene som jeg symlinker til virtexec er: