Hi x2go folks,
I would like to suggest a solution to make x2gothinclientsystem less invasive.
Instead of mounting a ramdisk and removing/symlinking some files and directories (which might be a Debian packaging policy violation) it might be smarter to mount a read only root filesystem and transparently overlay it with a tempfs.
I can this be achieved?
a) Install aufs modules in the clients' chroot environment. Aufs modules are part of Squeeze's default kernel.
b) Add "aufs" to /etc/initramfs-tools/modules.
c) Set "BOOT=aufs" in /etc/initramfs-tools/initramfs.conf.
d) Add a "magic" script (see attachment) named "aufs" to /etc/initramfs-tools/scripts
e) Call update-initramfs -u inside the chroot.
The "aufs" script is based on Debian's /usr/share/initramfs-tools/scripts/nfs script.
The attached script provides a three layer file root filesystem.
ro nfsroot/master (generic thinclients' chroot) ro nfsroot/<ip-address> (individual thinclient's configuration overriding master) rw tempfs (simulates a fully rw root file system)
Pros:
Cons:
Any feedback is appreciated.
Michael
-- EDV-Serviceteam Annika & Michael Hierweck GbR Egerstraße 53, 44225 Dortmund (Germany) http://www.edv-serviceteam.net
# NFS filesystem mounting -*- shell-script -*-
# FIXME This needs error checking
retry_nr=0
# parse nfs bootargs and mount nfs do_nfsmount() {
configure_networking
# get nfs root from dhcp
if [ "x${NFSROOT}" = "xauto" ]; then
# check if server ip is part of dhcp root-path
if [ "${ROOTPATH#*:}" = "${ROOTPATH}" ]; then
NFSROOT=${ROOTSERVER}:${ROOTPATH}
else
NFSROOT=${ROOTPATH}
fi
# nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>]
elif [ -n "${NFSROOT}" ]; then
# nfs options are an optional arg
if [ "${NFSROOT#*,}" != "${NFSROOT}" ]; then
NFSOPTS="-o ${NFSROOT#*,}"
fi
NFSROOT=${NFSROOT%%,*}
if [ "${NFSROOT#*:}" = "$NFSROOT" ]; then
NFSROOT=${ROOTSERVER}:${NFSROOT}
fi
fi
if [ -z "${NFSOPTS}" ]; then
NFSOPTS="-o retrans=10"
fi
[ "$quiet" != "y" ] && log_begin_msg "Running /scripts/nfs-premount"
run_scripts /scripts/nfs-premount
[ "$quiet" != "y" ] && log_end_msg
if [ ${readonly} = y ]; then
roflag="-o ro"
else
roflag="-o rw"
fi
mkdir -p /aufs-root
mkdir -p /aufs-conf
mkdir -p /aufs-temp
nfsmount -o nolock ${roflag} ${NFSOPTS} ${NFSROOT}/master /aufs-root
nfsmount -o nolock ${roflag} ${NFSOPTS} ${NFSROOT}/config/${IPV4ADDR} /aufs-conf
mount -t tmpfs tmpfs /aufs-temp
mount -t aufs -o dirs=/aufs-temp=rw:/aufs-conf=ro:/aufs-root=ro aufs ${rootmnt}
}
# NFS root mounting mountroot() { [ "$quiet" != "y" ] && log_begin_msg "Running /scripts/nfs-top" run_scripts /scripts/nfs-top [ "$quiet" != "y" ] && log_end_msg
modprobe nfs
# For DHCP
modprobe af_packet
wait_for_udev 10
# Default delay is around 180s
# FIXME: add usplash_write info
if [ -z "${ROOTDELAY}" ]; then
delay=180
else
delay=${ROOTDELAY}
fi
# loop until nfsmount succeds
while [ ${retry_nr} -lt ${delay} ] && [ ! -e ${rootmnt}${init} ]; do
[ ${retry_nr} -gt 0 ] && \
[ "$quiet" != "y" ] && log_begin_msg "Retrying nfs mount"
do_nfsmount
retry_nr=$(( ${retry_nr} + 1 ))
[ ! -e ${rootmnt}${init} ] && /bin/sleep 1
[ ${retry_nr} -gt 0 ] && [ "$quiet" != "y" ] && log_end_msg
done
[ "$quiet" != "y" ] && log_begin_msg "Running /scripts/nfs-bottom"
run_scripts /scripts/nfs-bottom
[ "$quiet" != "y" ] && log_end_msg
}