Vserver tools
Revision as of 21:35, 24 November 2010 by <bdi>PhilippeTeuwen</bdi> (talk | contribs) (Reverted edits by Etegohy (Talk) to last revision by PhilippeTeuwen)
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: GPLv3 or later
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: GPLv3 or later
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
# To change the limit on-the-fly simply rename the link and execute
# ./vdlimit_<newsize> pre-stop <servername>;./vdlimit_<newsize> post-start <servername>;
# Copyright Philippe Teuwen <phil_at_teuwen.org>
# License: GPLv3 or later
# 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/