Vserver tools
Jump to navigation
Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
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/