Vserver tools
Revision as of 21:31, 17 February 2007 by <bdi>PhilippeTeuwen</bdi> (talk | contribs)
De-unifying tool
From within a vserver, unified files cannot be directly modified.
You could face such problem when upgrading with apt-get when apt tries to make .dpkg-tmp copies for some critical(?) files
The user can of course make a copy, delete the file and re-create it but this is inconvenient therefore this tool :-)
#!/bin/bash # Copyright Philippe Teuwen <phil_at_teuwen.org> # License: GPL if [ "$1" = "-v" ]; then DEBUG=true shift else DEBUG=false fi files="$*" if [ "$files" = "" ]; then echo "Usage: $0 [-v] <file(s) to deunify>" echo " (-v for verbose mode)" exit fi for f in $files; do if [ -f "$f" ]&&[ ! -L "$f" ]; then if lsattr "$f"|cut -f1 -d " "|grep -q "....i.......E...."; then $DEBUG && echo "Deunifying file $f..." $DEBUG && echo -n "inode : " && ls -i "$f"|cut -f1 -d " " $DEBUG && echo -n "attr : " && lsattr "$f"|cut -f1 -d " " tmpfile="$(mktemp /tmp/deunify.XXXXXX)" cp -a "$f" "$tmpfile" mv -f "$tmpfile" "$f" echo "File $f deunified!" $DEBUG && echo -n "inode : " && ls -i "$f"|cut -f1 -d " " $DEBUG && echo -n "attr : " && lsattr "$f"|cut -f1 -d " " else $DEBUG && echo "Skipping file $f, already deunified..." $DEBUG && echo -n "inode : " && ls -i "$f"|cut -f1 -d " " $DEBUG && echo -n "attr : " && lsattr "$f"|cut -f1 -d " " fi else $DEBUG && echo "$f does not appear to be a regular file, skipping..." fi done
Deleting tool
Be careful with this one, of course
#!/bin/bash # Copyright Philippe Teuwen <phil_at_teuwen.org> # Lincense: GPL VSERVER=$1 vserver $VSERVER status ret=$? if [ "$ret" = 5 ]; then echo "Please specify an existing vserver!" exit 1 fi if [ "$ret" != 3 ]; then vserver $VSERVER stop fi echo Deleting /etc/vservers/$VSERVER ... rm -rf /etc/vservers/$VSERVER echo Deleting /var/run/vservers/$VSERVER ... rm -rf /var/run/vservers/$VSERVER echo Deleting symlinks in /var/run/vservers.rev/ ... ls -l /var/run/vservers.rev/|\ grep -o "[0-9]\+ -> /etc/vservers/$VSERVER"|\ cut -d ' ' -f 1|\ xargs rm -f echo -n Deleting /etc/vservers/.defaults/vdirbase/$VSERVER ... lsof|grep $VSERVER i=0 # We need to insist a bit on this one... while [[ "$i" -lt 10 ]] && ! rm -rf /etc/vservers/.defaults/vdirbase/$VSERVER >& /dev/null ; do echo -n . i=$(($i+1)) sleep 1 done echo echo Done.
Dupvserver patch
Make dupvserver usable with the new vserver config method and handle static contextes
--- dupvserver 2006-03-29 20:04:43.000000000 +0200 +++ dupvserver.new 2006-03-29 20:04:15.000000000 +0200 @@ -17,11 +17,11 @@ # Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA # 02111-1307, USA. -VSERVERS_ROOT=/vservers +VSERVERS_ROOT=/etc/vservers/.defaults/vdirbase -if [ -r /etc/vservers.conf ] ; then - . /etc/vservers.conf -fi +#if [ -r /etc/vservers.conf ] ; then +# . /etc/vservers.conf +#fi usage () { @@ -95,14 +95,14 @@ echo "ERROR: Vserver $FROM do not exist." exit 1 fi - if [ ! -r "/etc/vservers/$FROM.conf" ] ; then + if [ ! -d "/etc/vservers/$FROM" ] ; then echo "ERROR: Vserver config for $FROM do not exist." exit 1 fi - . /etc/vservers/$FROM.conf - FROMNAME=$S_HOSTNAME - FROMIP=$IPROOT - FROMDEV=$IPROOTDEV +# . /etc/vservers/$FROM.conf + FROMNAME="$(cat /etc/vservers/$FROM/name)" + FROMIP="$(cat /etc/vservers/$FROM/interfaces/0/ip)" + FROMDEV="$(cat /etc/vservers/$FROM/interfaces/0/dev)" ;; --to) TO="$2" @@ -184,16 +184,25 @@ $FINDTOREPIP" | sort -u fi -if [ ! -r /etc/vservers/$TO.conf -o "$FORCE" = "yes" ] ; then - cp /etc/vservers/$FROM.conf /etc/vservers/$TO.conf - perl -pi -e "s#$FROM#$TO#g;" \ - /etc/vservers/$TO.conf +if [ ! -d /etc/vservers/$TO -o "$FORCE" = "yes" ] ; then + mkdir /etc/vservers/$TO + cp -a /etc/vservers/$FROM/* /etc/vservers/$TO + rm /etc/vservers/$TO/run + ln -s /var/run/vservers/$TO /etc/vservers/$TO/run + rm /etc/vservers/$TO/vdir + ln -s /etc/vservers/.defaults/vdirbase/$TO /etc/vservers/$TO/vdir + find /etc/vservers/$TO -type f -exec perl -pi -e "s#$FROM#$TO#g;" {} \; if [ "$FROMIP" != "$TOIP" ] ; then - perl -pi -e "s#$FROMIP#$TOIP#g;" \ - /etc/vservers/$TO.conf + find /etc/vservers/$TO -type f -exec perl -pi -e "s#$FROMIP#$TOIP#g;" {} \; fi if [ "$FROMDEV" != "$TODEV" -a -n "$TODEV" ] ; then - perl -pi -e "s#$FROMDEV#$TODEV#g;" \ - /etc/vservers/$TO.conf + find /etc/vservers/$TO -type f -exec perl -pi -e "s#$FROMDEV#$TODEV#g;" {} \; + fi + if [ -e /etc/vservers/$TO/context ]; then + echo -n "Choose a new context: " + echo $RANDOM > /etc/vservers/$TO/context + cat /etc/vservers/$TO/context + echo "Apply new context to files..." + chxid -c $(cat /etc/vservers/$TO/context) -R $VSERVERS_ROOT/$TO fi fi
Newvserver patch
- Add better support for etch
- Prevent corruption of /etc/motd
--- newvserver 2006-03-29 20:04:28.000000000 +0200 +++ newvserver.new 2006-03-29 20:04:10.000000000 +0200 @@ -45,7 +45,7 @@ REMOVE_PACKAGES="sparc-utils,dhcp-client,lilo,makedev,pcmcia-cs,ppp,pppconfig,pppoe,pppoeconf,setserial,syslinux,fdutils,libpcap0,iptables,pciutils" # sysvinit services relating to hardware access to remove -REMOVE_LINKS="klogd hwclock.sh setserial urandom networking umountfs halt reboot mountvirtfs mountall.sh mountnfs.sh ifupdown" +REMOVE_LINKS="klogd hwclock.sh setserial urandom networking umountfs umountroot halt reboot mountvirtfs mountall.sh mountnfs.sh ifupdown" # Post installation script POST_INSTALL_SCRIPT="" @@ -384,7 +384,7 @@ fi ## use "vserver ... build" to build the new vserver -if ! /usr/sbin/vserver "$VHOST" build -m debootstrap \ +if ! vserver "$VHOST" build -m debootstrap \ --rootdir "$VROOTDIR" --hostname "$VHOST" --interface "$INTERFACE:$IP" \ -- -d "$DIST" -m "$MIRROR" \ -- $ARCH_ARGUMENT \ @@ -398,12 +398,12 @@ # Make it so that apt and friends work cat << EOF > "$VROOTDIR/$VHOST/etc/apt/sources.list" deb $MIRROR/ $DIST main non-free contrib -deb-src $MIRROR/ $DIST main non-free contrib +#deb-src $MIRROR/ $DIST main non-free contrib -deb http://non-us.debian.org/debian-non-US $DIST/non-US main contrib non-free -deb-src http://non-us.debian.org/debian-non-US $DIST/non-US main contrib non-free +#deb http://non-us.debian.org/debian-non-US $DIST/non-US main contrib non-free +#deb-src http://non-us.debian.org/debian-non-US $DIST/non-US main contrib non-free -deb http://security.debian.org $DIST/updates main contrib non-free +#deb http://security.debian.org $DIST/updates main contrib non-free EOF @@ -455,8 +455,13 @@ # uname -a > $VROOTDIR/$VHOST/etc/motd # Create a shorter motd (uname -a would give name of host-server) -echo "Debian GNU/Linux ($DIST/$(uname -m)) $VHOST.$VDOMAIN" \ - > "$VROOTDIR/$VHOST/etc/motd" +if [ -L "$VROOTDIR/$VHOST/etc/motd" ]; then + echo "Debian GNU/Linux ($DIST/$(uname -m)) $VHOST.$VDOMAIN" \ + > "$VROOTDIR/$VHOST/var/run/motd" +else + echo "Debian GNU/Linux ($DIST/$(uname -m)) $VHOST.$VDOMAIN" \ + > "$VROOTDIR/$VHOST/etc/motd" +fi # Create a dummy fstab cat << EOF > "$VROOTDIR/$VHOST/etc/fstab" @@ -526,19 +531,26 @@ dselect update -tzsetup -y +if [ "$DIST" == "etch" ]||[ "$DIST" == "sid" ]; then + tzconfig +else + tzsetup -y +fi dpkg-reconfigure passwd -tasksel +if [ "$DIST" == "woody" ]||[ "$DIST" == "sarge" ]; then + tasksel +fi if [ "$DIST" == "woody" ]; then rm -f /etc/exim/exim.conf eximconfig fi - -# because the --exclude flag doesn\'t seem to work on debootstrap -dpkg -P `echo $REMOVE_PACKAGES | sed -e 's/,/ /g'` +if [ "$DIST" == "woody" ]||[ "$DIST" == "sarge" ]; then + # because the --exclude flag doesn\'t seem to work on debootstrap + dpkg -P `echo $REMOVE_PACKAGES | sed -e 's/,/ /g'` +fi for link in $REMOVE_LINKS do
Change also the /etc/hosts to assign localhost to the public ip
Imposing disk usage limits on vservers
This will also be used to monitor easily the disk usage of the vservers
#!/bin/bash # Link this as /etc/vservers/<servername>/scripts/post-start.d script # with the desired size limit in Mb. # For example to set the limit at 10G: # ln -s /usr/local/sbin/vdlimit_ # /etc/vservers/<servername>/scripts/post-start.d/vdlimit_10240 # Copyright Philippe Teuwen <phil_at_teuwen.org> # License: GPL # version 1.0 # The script will be called from within the vserver working dir VSERVER=`pwd|sed 's/\/etc\/vservers\/\(.*\)\/vdir/\1/'` # space in Mb SPACE=$(basename $0 | sed 's/^vdlimit_//;') # 10G if not specified SPACE=${SPACE:-10240} # space in kb SPACE=$(($SPACE*1024)) INODES=$SPACE vserver $VSERVER status &>/dev/null ret=$? if [ "$ret" = 5 ]; then echo "Please specify an existing vserver!" exit 1 fi if [ "$ret" != 0 ]; then echo "Please specify a running vserver!" exit 1 fi CTX=`cat /var/run/vservers/$VSERVER` SPACE_USED=`du -sx /etc/vservers/.defaults/vdirbase/$VSERVER | awk '{print $1}'` INODES_USED=`ls -1aRi /etc/vservers/.defaults/vdirbase/$VSERVER/ 2>/dev/null |\ awk '/^[0-9]+ / { print $1 }' | sort -u | wc -l` if [ $SPACE_USED -ge $SPACE ]||[ $INODES_USED -ge $INODES ]; then echo "Vserver $VSERVER is already taking more space/inodes than what you try to limit to!" exit 1 fi /usr/sbin/vdlimit --xid $CTX \ --set space_total=$SPACE \ --set space_used=$SPACE_USED \ --set inodes_total=$INODES \ --set inodes_used=$INODES_USED \ --set reserved=5 /etc/vservers/.defaults/vdirbase/$VSERVER/