1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
|
#!/bin/sh -x
# This is an example script for diskless-booted systems over NFS.
# In order to make the script working properly, you need to adjust
# the parameters below and you also aready need to have booted
# your root environment over NFS, either by an initrd/initramfs
# or by your specific OS NFS-boot method (e.g. see
# ${path_to_linux_sources}/Documentation/nfsroot.txt).
# Furtheremore, this script expectes your NFS-server to export
# /unionfs/hosts (MUST be read-write) and
# /unionfs/groups/default (read-only is sufficient).
# You then also MUST have the directory /unionfs/host and
# /unionfs/groups/default with these
# subdirectories: bin etc lib lib32 root sbin usr var
#
# All of this is only an example, of course, and may be easily changed.
#
# On my systems this script is then executed as the very first init-script,
# thus before any other init script is executed. On debian/ubuntu this
# can be done by copying this script to /etc/init.d/unionfs-fuse and then
# by creating a link /etc/rcS.d/S01a_unionfs-fuse -> ../init.d/unionfs-fuse.
#
# NOTE: It is generally advisable to monitor the very first boot process of
# a client using a serial cable, SOL (ipmi) or serial netconsole.
#
# LICENSE: new BSD license, see LICENSE file for details.
# Copyright: Bernd Schubert <bernd-schubert@gmx.de>
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/opt/local/bin:/opt/local/sbin
NET="192.168.1."
NFS_SERV="192.168.55.86"
NFS_OPT="-otcp,nfsvers=3,port=2049,rsize=8192,wsize=8192,nolock"
FUSE_OPT="-o default_permissions -o allow_other -o use_ino -o nonempty -o suid"
UNION_OPT="-o cow -o noinitgroups"
UPATH="/unionfs"
UBIN="unionfs-fuse"
IP=`ip addr show |grep $NET | sed -e s'/^.*inet //' |sed -e s'/\/24 brd.*$//'`
[ -z "$IP" ] && exit 0
if [ "$IP" = "$NFS_SERV" ]; then
# The nfs server shall not create a union of itself, abort!
echo "This system is the nfs-server, I won't mount myself!"
exit 1
fi
# allow more open files, reminder: everything in /etc and /var is opened by
# ${UPATH} e.g. with fontconfig caching the default of 1024 open file can be
# too small
ulimit -n 16384
mount -n -t proc proc /proc
mount -n -t sysfs sysfs /sys
mount -t tmpfs -o size=8192 tmpfs /tmp
modprobe fuse
# for the portmapper we need localhost
ifconfig lo 127.0.0.1
/etc/init.d/portmap start
# we cannot convice fuse not to write to /etc/mtab, but /etc/mtab is still
# write protected, so a workaround
#touch /${UPATH}/tmp/mtab
#mount -n --bind /${UPATH}/tmp/mtab /etc/mtab
# test if hosts dir is already there and if not create it
mount -n -t nfs $NFS_OPT ${NFS_SERV}:/${UPATH}/hosts /${UPATH}/host
# make sure the directories really do exist
mkdir -p /${UPATH}/host/${IP}
mkdir -p /${UPATH}/host/${IP}
umount -n /${UPATH}/host
# the client specific files
mount -n -t nfs $NFS_OPT ${NFS_SERV}:/$UPATH/groups/default /$UPATH/group
mount -n -t nfs $NFS_OPT ${NFS_SERV}:/${UPATH}/hosts/${IP} /${UPATH}/host
mkdir -p /${UPATH}/host/root
mount -n -omode=0655 -t tmpfs tmpfs /${UPATH}/host/root
unionmount()
{
dir=$1
mkdir -p /${UPATH}/host/$dir
mount --bind /$dir /$UPATH/common/$dir
host="/${UPATH}/host/${dir}=RW"
group="/${UPATH}/group/${dir}=RO"
common="/$UPATH/common/${dir}=RO"
$UBIN $FUSE_OPT $UNION_OPT ${host}:${group}:${common} /$UPATH/union/$dir
mount --bind /$UPATH/union/$dir /$dir
}
for i in etc var lib lib32 bin sbin usr root; do
unionmount $i
done
# re-read inittab
init q
umount /tmp
|