blob: 4df83792b515a459ba5d5433e9c4cb2ca43fbc0a (
plain)
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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
|
#!/bin/sh
#
# $FreeBSD$
#
set -ex
export BLOCKSIZE=512
DISKLABEL=$1; shift
MACHINE=${1:+"-m $1"}; shift
FSIMG=$1; shift
RD=$1 ; shift
MNT=$1 ; shift
FSSIZE=$1 ; shift
FSPROTO=$1 ; shift
FSINODE=$1 ; shift
FSLABEL=$1 ; shift
#
# If we've been told to, compute the required file system size
# and average inode size automatically.
#
if [ ${FSSIZE} -eq 0 -a ${FSLABEL} = "auto" ]; then
roundup() echo $((($1+$2-1)-($1+$2-1)%$2))
nf=$(find ${FSPROTO} |wc -l)
sk=$(du -sk ${FSPROTO} |cut -f1)
FSINODE=$(roundup $(($sk*1024/$nf)) ${FSINODE})
FSSIZE=$(roundup $(($sk*12/10)) 1024)
fi
deadlock=20
dofs_vn () {
if [ "x$VNDEVICE" = "x" ] ; then
VNDEVICE=vn0
fi
u=`expr $VNDEVICE : 'vn\([0-9]*\)' || true`
VNDEVICE=vnn$u
rm -f /dev/*vnn*
mknod /dev/rvnn${u} c 43 `expr 65538 + $u '*' 8`
mknod /dev/rvnn${u}c c 43 `expr 2 + $u '*' 8`
mknod /dev/vnn${u} b 15 `expr 65538 + $u '*' 8`
mknod /dev/vnn${u}c b 15 `expr 2 + $u '*' 8`
while true
do
rm -f ${FSIMG}
umount /dev/${VNDEVICE} 2>/dev/null || true
umount ${MNT} 2>/dev/null || true
vnconfig -u /dev/r${VNDEVICE} 2>/dev/null || true
dd of=${FSIMG} if=/dev/zero count=${FSSIZE} bs=1k 2>/dev/null
vnconfig -s labels -c /dev/r${VNDEVICE} ${FSIMG}
trap "umount ${MNT}; vnconfig -u /dev/r${VNDEVICE}; rm -f /dev/*vnn*" EXIT
disklabel -w ${BOOT} ${VNDEVICE} ${FSLABEL}
newfs -i ${FSINODE} -o space -m 0 /dev/r${VNDEVICE}c
mount /dev/${VNDEVICE}c ${MNT}
if [ -d ${FSPROTO} ]; then
(set -e && cd ${FSPROTO} && find . -print | cpio -dump ${MNT})
else
cp -p ${FSPROTO} ${MNT}
fi
df -ki ${MNT}
set `df -ki ${MNT} | tail -1`
echo "*** Filesystem is ${FSSIZE} K, $4 left"
echo "*** ${FSINODE} bytes/inode, $7 left"
break;
done
}
dofs_md () {
while true
do
rm -f ${FSIMG}
if [ "x${MDDEVICE}" != "x" ] ; then
umount /dev/${MDDEVICE} 2>/dev/null || true
umount ${MNT} 2>/dev/null || true
mdconfig -d -u ${MDDEVICE} 2>/dev/null || true
fi
dd of=${FSIMG} if=/dev/zero count=${FSSIZE} bs=1k 2>/dev/null
MDDEVICE=`mdconfig -a -t vnode -f ${FSIMG}`
if [ ! -c /dev/${MDDEVICE} ] ; then
echo "No /dev/$MDDEVICE" 1>&2
exit 1
fi
trap "umount ${MNT}; mdconfig -d -u ${MDDEVICE}" EXIT
${DISKLABEL} ${MACHINE} -w ${BOOT} ${MDDEVICE} ${FSLABEL}
newfs -O1 -i ${FSINODE} -o space -m 0 /dev/${MDDEVICE}c
mount /dev/${MDDEVICE}c ${MNT}
if [ -d ${FSPROTO} ]; then
(set -e && cd ${FSPROTO} && find . -print | cpio -dump ${MNT})
else
cp -p ${FSPROTO} ${MNT}
fi
df -ki ${MNT}
set `df -ki ${MNT} | tail -1`
echo "*** Filesystem is ${FSSIZE} K, $4 left"
echo "*** ${FSINODE} bytes/inode, $7 left"
break;
done
}
#
# We don't have any bootblocks on ia64. Note that -B implies -r,
# so we have to specifically specify -r when we don't have -B.
# bsdlabel fails otherwise.
#
case `uname -r` in
[1-4].*)
if [ -f "${RD}/trees/base/boot/boot1" ]; then
BOOT="-B -b ${RD}/trees/base/boot/boot1"
if [ -f "${RD}/trees/base/boot/boot2" ]; then
BOOT="${BOOT} -s ${RD}/trees/base/boot/boot2"
fi
else
BOOT="-r"
fi
dofs_vn
;;
*)
if [ -f "${RD}/trees/base/boot/boot" ]; then
BOOT="-B -b ${RD}/trees/base/boot/boot"
else
BOOT="-r"
fi
dofs_md
;;
esac
|