]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - share/examples/diskless/clone_root
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / share / examples / diskless / clone_root
1 #!/bin/sh
2 #
3 # (C) 2001 Luigi Rizzo, Gabriele Cecchetti
4 #       <Standard BSD copyright>
5 # Revised 2001.04.16
6 #
7 # $FreeBSD$
8 #
9 # clone root filesystem for diskless root stuff
10 #
11 # usage
12 #       clone_root all          to do a full copy (e.g. bin, sbin...)
13 #       clone_root update       to recreate /var (including devices)
14 #       clone_root              to copy /conf and password-related files
15 #
16 # This script assumes that you use a shared readonly root and /usr
17 # partition. The script creates a partial clone of the root partition,
18 # and puts it into ${DEST} (defaults to /diskless_root ) on the server,
19 # where it is read.
20 #
21 # To run a diskless install you need to do the following:
22 #
23 # create /conf/default/etc/fstab
24 #    this will replace the standard /etc/fstab and should contain
25 #    as a minimum the following lines
26 #    ${SERVER}:${DEST} /     nfs    ro 0 0
27 #    ${SERVER}:/usr    /usr  nfs    ro 0 0
28 #    proc              /proc procfs rw 0 0
29 #
30 # create /conf/default/etc/rc.conf
31 #    this will replace the standard rc.conf and should contain
32 #    the startup options for the diskless client. Most likely
33 #    you will not need to set hostname and ifconfig_* because these
34 #    will be already set by the startup code. You will also
35 #    probably need to set local_startup="" so that the server's
36 #    local startup files will not be used.
37 #
38 # create a kernel config file in /sys/i386/conf/DISKLESS with
39 #       options MD_ROOT
40 #       options BOOTP
41 #       options BOOTP_NFSROOT
42 #       options BOOTP_COMPAT
43 # and do a full build of the kernel.
44 # If you use the firewall, remember to default to open or your kernel
45 # will not be able to send/receive the bootp packets.
46 #
47 # On the server:
48 # enable NFS server and set /etc/exports as
49 #       ${DEST} -maproot=0 -alldirs <list of diskless clients>
50 #       /usr -alldirs
51 #
52 # enable bootpd by uncommenting the bootps line in /etc/inetd.conf
53 # and putting at least the following entries in /etc/bootptab:
54 #  .default:\
55 #       hn:ht=1:vm=rfc1048:\
56 #       :sm=255.255.255.0:\
57 #       :sa=${SERVER}:\
58 #       :gw=${GATEWAY}:\
59 #       :rp="${SERVER}:${DEST}":
60 #
61 #  client1:ha=0123456789ab:tc=.default
62 #
63 # and make sure that client1 is listed in /etc/hosts
64
65 # VARIABLES:
66 #       some manual init is needed here.
67 # DEST  the diskless_root dir (goes into /etc/bootptab and /etc/exports
68 #       on the server)
69 DEST=/diskless_root
70
71 # you should not touch these vars:
72 # SYSDIRS       system directories and mountpoints
73 # DIRS          mountpoints (empty dirs)
74 # PWFILES       files related to passwords
75 # TOCOPY        files and dirs to copy from root partition
76
77 SYSDIRS="dev proc root usr var"
78 DIRS="cdrom home mnt"
79 PWFILES="master.passwd passwd spwd.db pwd.db"
80 TOCOPY="bin boot compat etc modules sbin stand sys"
81
82 init_diskless_root() {
83         echo "Cleaning old diskless root ($DEST)"
84         cd /
85         rm -rf ${DEST} && echo "Old diskless root removed."
86         echo "Creating $DEST..."
87         mkdir -p $DEST && echo "New diskless root created."
88         echo "+++ Now copy original tree from / ..."
89         ex=""
90         (cd / ; tar -clf - ${TOCOPY} ) | (cd $DEST; tar xvf - )
91         #(cd / ; find -x dev | cpio -o -H newc ) | \
92         #       (cd $DEST; cpio -i -H newc -d )
93         echo "+++ Fixing permissions on some objects"
94         chmod 555 $DEST/sbin/init
95 }
96
97 update_conf_and_pw() {
98         echo "+++ Copying files in /conf and password files"
99         (cd ${DEST} ; rm -rf conf )
100         (cd / ; tar clf - conf ) | (cd ${DEST}; tar xvf - )
101         mkdir -p ${DEST}/conf/etc       # used to mount things
102         (cd /etc ; tar cvf - ${PWFILES} ) | (cd ${DEST}/etc ; tar xf - )
103 }
104
105 update() {
106         echo "+++ update: create mountpoints and device entries, kernel"
107         for i in ${SYSDIRS} ${DIRS}
108         do
109             rm -r -f ${DEST}/$i
110             mkdir -p ${DEST}/$i && chown root:wheel ${DEST}/$i && echo -n "$i "
111         done
112         echo "."
113         ln -s /var/tmp ${DEST}/tmp
114         echo "+++ Copying kernel from /sys/compile/DISKLESS"
115         cp /sys/compile/DISKLESS/kernel $DEST/kernel
116         echo "."
117 }
118
119
120 # Main entry point
121 case $1 in
122         all)    # clean and reinstall the whole diskless_root
123                 init_diskless_root
124                 update
125                 update_conf_and_pw
126                 ;;
127
128         update) # clean and rebuild mountpoints and device entries
129                 update
130                 update_conf_and_pw
131                 ;;
132
133         *)      # copy /conf and password files
134                 update_conf_and_pw
135                 ;;
136 esac
137 exit 0
138 ### end of file ###