Initial import from FreeBSD RELENG_4:
[dragonfly.git] / release / scripts / doFS.sh
1 #!/bin/sh
2 #
3 # $FreeBSD: src/release/scripts/doFS.sh,v 1.24.2.12 2003/04/04 11:58:05 ru Exp $
4 #
5
6 set -e
7
8 export BLOCKSIZE=512
9
10 if [ "$1" = "-s" ]; then
11         do_size="yes"; shift
12 else
13         do_size=""
14 fi
15
16 FSIMG=$1; shift
17 RD=$1 ; shift
18 MNT=$1 ; shift
19 FSSIZE=$1 ; shift
20 FSPROTO=$1 ; shift
21 FSINODE=$1 ; shift
22 FSLABEL=$1 ; shift
23
24 BOOT1="-b ${RD}/trees/bin/boot/boot1"
25 if [ -f "${RD}/trees/bin/boot/boot2" ]; then
26         BOOT2="-s ${RD}/trees/bin/boot/boot2"
27 else
28         BOOT2=""
29 fi
30
31 deadlock=20
32
33 dofs_vn () {
34     if [ "x$VNDEVICE" = "x" ] ; then
35         VNDEVICE=vn0
36     fi
37     u=`expr $VNDEVICE : 'vn\([0-9]*\)' || true`
38     VNDEVICE=vnn$u
39
40     rm -f /dev/*vnn*
41     mknod /dev/rvnn${u} c 43 `expr 65538 + $u '*' 8`
42     mknod /dev/rvnn${u}c c 43 `expr 2 + $u '*' 8`
43     mknod /dev/vnn${u} b 15 `expr 65538 + $u '*' 8`
44     mknod /dev/vnn${u}c b 15 `expr 2 + $u '*' 8`
45
46     while true 
47     do
48         rm -f ${FSIMG}
49
50         umount /dev/${VNDEVICE} 2>/dev/null || true
51         umount ${MNT} 2>/dev/null || true
52         vnconfig -u /dev/r${VNDEVICE} 2>/dev/null || true
53
54         dd of=${FSIMG} if=/dev/zero count=${FSSIZE} bs=1k 2>/dev/null
55
56         vnconfig -s labels -c /dev/r${VNDEVICE} ${FSIMG}
57         disklabel -w -B ${BOOT1} ${BOOT2} ${VNDEVICE} ${FSLABEL}
58         newfs -i ${FSINODE} -o space -m 0 /dev/r${VNDEVICE}c
59
60         mount /dev/${VNDEVICE}c ${MNT}
61
62         if [ -d ${FSPROTO} ]; then
63                 (set -e && cd ${FSPROTO} && find . -print | cpio -dump ${MNT})
64         else
65                 cp -p ${FSPROTO} ${MNT}
66         fi
67
68         df -ki ${MNT}
69
70         set `df -ki ${MNT} | tail -1`
71
72         umount ${MNT}
73         vnconfig -u /dev/r${VNDEVICE} 2>/dev/null || true
74
75         echo "*** Filesystem is ${FSSIZE} K, $4 left"
76         echo "***     ${FSINODE} bytes/inode, $7 left"
77         if [ "${do_size}" ]; then
78                 echo ${FSSIZE} > ${FSIMG}.size
79         fi
80         break;
81     done
82
83     rm -f /dev/*vnn*
84 }
85
86 dofs_md () {
87     while true 
88     do
89         rm -f ${FSIMG}
90
91         if [ "x${MDDEVICE}" != "x" ] ; then
92                 umount /dev/${MDDEVICE} 2>/dev/null || true
93                 umount ${MNT} 2>/dev/null || true
94                 mdconfig -d -u ${MDDEVICE} 2>/dev/null || true
95         fi
96
97         dd of=${FSIMG} if=/dev/zero count=${FSSIZE} bs=1k 2>/dev/null
98
99         MDDEVICE=`mdconfig -a -t vnode -f ${FSIMG}`
100         if [ ! -c /dev/${MDDEVICE} ] ; then
101                 if [ -f /dev/MAKEDEV ] ; then
102                         ( cd /dev && sh MAKEDEV ${MDDEVICE} )
103                 else
104                         echo "No /dev/$MDDEVICE and no MAKEDEV" 1>&2
105                         exit 1
106                 fi
107         fi
108         disklabel -w -B ${BOOT1} ${BOOT2} ${MDDEVICE} ${FSLABEL}
109         newfs -i ${FSINODE} -o space -m 0 /dev/${MDDEVICE}c
110
111         mount /dev/${MDDEVICE}c ${MNT}
112
113         if [ -d ${FSPROTO} ]; then
114                 (set -e && cd ${FSPROTO} && find . -print | cpio -dump ${MNT})
115         else
116                 cp -p ${FSPROTO} ${MNT}
117         fi
118
119         df -ki ${MNT}
120
121         set `df -ki ${MNT} | tail -1`
122
123         umount ${MNT}
124         mdconfig -d -u ${MDDEVICE} 2>/dev/null || true
125
126         echo "*** Filesystem is ${FSSIZE} K, $4 left"
127         echo "***     ${FSINODE} bytes/inode, $7 left"
128         if [ "${do_size}" ]; then
129                 echo ${FSSIZE} > ${FSIMG}.size
130         fi
131         break;
132     done
133 }
134
135 case `uname -r` in
136 [1-4].*)
137         dofs_vn
138         ;;
139 *)
140         if [ ! -f "${RD}/trees/bin/boot/boot" ]; then
141                 cp -p ${RD}/trees/bin/boot/boot1 ${RD}/trees/bin/boot/boot
142                 if [ -f "${RD}/trees/bin/boot/boot2" ]; then
143                         cat ${RD}/trees/bin/boot/boot2 >> \
144                             ${RD}/trees/bin/boot/boot
145                 fi
146         fi
147         BOOT1="-b ${RD}/trees/bin/boot/boot"
148         BOOT2=""
149         dofs_md
150         ;;
151 esac