%post
. /usr/lib/util-vserver/util-vserver-vars
-VROOT=$VROOTDIR/vserver-reference
-# Pause vcached
-service vcached stop
-
-# Remove old installation first
-if [ -d $VROOT ] ; then
- if grep -q $VROOT/proc /proc/mounts ; then
- umount $VROOT/proc
- fi
- if grep -q $VROOT/dev/pts /proc/mounts ; then
- umount $VROOT/dev/pts
- fi
- chattr -R -i $VROOT
- rm -rf $VROOT
-fi
-
-$PKGLIBDIR/install-pre.sh vserver-reference
+# Make /vservers
+mkdir -p $VROOTDIR
+chmod 000 $VROOTDIR
+chattr +t $VROOTDIR
+
+# Build image in /vservers/.vtmp
+mkdir -p $VROOTDIR/.vtmp
+VROOT=$(mktemp -d $VROOTDIR/.vtmp/vserver-reference.XXXXXX)
+
+# Make /vservers/.vtmp/vserver-reference.XXXXXX
+mkdir -p $VROOT
+chattr -t $VROOT
+chmod 755 $VROOT
+
+# Clean up before exiting if anything goes wrong
+set -e
+trap "umount $VROOT/proc ; umount $VROOT/dev/pts ; chattr -R -i $VROOT ; rm -rf $VROOT" EXIT
+
+MAKEDEV ()
+{
+ rm -rf $VROOT/dev
+ mkdir -p $VROOT/dev
+ mknod -m 666 $VROOT/dev/null c 1 3
+ mknod -m 666 $VROOT/dev/zero c 1 5
+ mknod -m 666 $VROOT/dev/full c 1 7
+ mknod -m 644 $VROOT/dev/random c 1 8
+ mknod -m 644 $VROOT/dev/urandom c 1 9
+ mknod -m 666 $VROOT/dev/tty c 5 0
+ mknod -m 666 $VROOT/dev/ptmx c 5 2
+ touch $VROOT/dev/hdv1
+}
+
+# Initialize /dev in reference image
+MAKEDEV
# Mount /dev/pts in reference image
mkdir -p $VROOT/dev/pts
mkdir -p $VROOT/proc
mount -t proc none $VROOT/proc
+# Create a dummy /etc/fstab in reference image
+mkdir -p $VROOT/etc
+cat > $VROOT/etc/fstab <<EOF
+# This fake fstab exists only to please df and linuxconf.
+/dev/hdv1 / ext2 defaults 1 1
+EOF
+
# Prevent all locales from being installed in reference image
mkdir -p $VROOT/etc/rpm
cat > $VROOT/etc/rpm/macros <<EOF
fi
rmdir $TMP
+# Clean up /dev in reference image
+umount $VROOT/dev/pts
+MAKEDEV
+
+# Disable all services in reference image
+chroot $VROOT /bin/sh -c "chkconfig --list | awk '{ print \$1 }' | xargs -i chkconfig {} off"
+
# Copy configuration files from host to reference image
for file in /etc/hosts /etc/resolv.conf /etc/yum.conf ; do
if [ -f $file ] ; then
# Clean up
umount $VROOT/proc
-umount $VROOT/dev/pts
-$PKGLIBDIR/install-post.sh vserver-reference
+# Reset trap
+trap - EXIT
-# Disable all services in reference image
-chroot $VROOT /bin/sh -c "chkconfig --list | awk '{ print \$1 }' | xargs -i chkconfig {} off"
+# Swap them when complete
+mv $VROOT $VROOTDIR
+if [ -d $VROOTDIR/vserver-reference ] ; then
+ mv $VROOTDIR/vserver-reference $VROOT
+ # Let vcached clean it up later
+fi
+mv $VROOTDIR/$(basename $VROOT) $VROOTDIR/vserver-reference
+
+%postun
+. /usr/lib/util-vserver/util-vserver-vars
-# Restart vcached
-service vcached start
+mkdir -p $VROOTDIR/.vtmp
+TMP=$(mktemp -d $VROOTDIR/.vtmp/vserver-reference.XXXXXX)
+if [ -d $VROOTDIR/vserver-reference ] ; then
+ mv $VROOTDIR/vserver-reference $TMP
+ # Let vcached clean it up later
+fi
%files
%defattr(-,root,root)