forked from arnobroekhof/flashboot
-
Notifications
You must be signed in to change notification settings - Fork 0
/
build-usbinstallimage.sh
executable file
·195 lines (164 loc) · 5.25 KB
/
build-usbinstallimage.sh
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
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
#!/bin/sh
# Update for each new release
SHORTREL="50"
LONGREL="5.0"
# Update ARC for the architecture to use
ARC=i386
#ARC=amd64
# Change if ftp.eu.openbsd.org is not the best place to get your files from
URLBASE="http://ftp.eu.openbsd.org/pub/OpenBSD/${LONGREL}"
# Another mirror
#URLBASE="http://ftp.netbsd.se/OpenBSD/${LONGREL}"
# No need to change anything below this line for new OS releases!
CWD=`pwd`
SUDO=sudo
DEVICE=vnd0
DEVICECD=vnd1
SOURCECD=install${SHORTREL}.iso
MOUNTPOINT=/mnt/image
MOUNTPOINTCD=/mnt/cd
TEMPFILE=/tmp/build-diskimage.tmp.$$
KERNELFILE=${KERNELFILE:-${MOUNTPOINTCD}/${LONGREL}/${ARC}/bsd.rd}
DISTSTUFF=diststuff
# drive geometry information
# 489 MB cards
totalsize=1001952 # "total sectors:"
bytessec=512 # "bytes/sector:"
sectorstrack=63 # "sectors/track:"
sectorscylinder=1008 # "sectors/cylinder:"
trackscylinder=16 # "tracks/cylinder:"
cylinders=994 # "cylinders:"
# Don't start without a imagefile as a parameter
if [ "$1" = "" ]; then
echo "usage: $0 imagefile"
exit 1
fi
IMAGEFILE=$1
# Make directory for dist stuff
mkdir -p ${DISTSTUFF}/${ARC}
echo ""
echo "Downloading SHA256..."
if [ ! -f ${DISTSTUFF}/${ARC}/SHA256 ] ; then
echo "Needed SHA256, didn't find it in current dir so downloading..."
ftp -o ${DISTSTUFF}/${ARC}/SHA256 ${URLBASE}/${ARC}/SHA256
else
echo "SHA256 already exist, don't need to download it again"
fi
echo ""
echo "Downloading ${SOURCECD}..."
if [ ! -f ${DISTSTUFF}/${ARC}/${SOURCECD} ] ; then
echo "Needed ${SOURCECD}, didn't find it in current dir so downloading..."
ftp -o ${DISTSTUFF}/${ARC}/${SOURCECD} ${URLBASE}/${ARC}/${SOURCECD}
else
echo "${SOURCECD} already exist, don't need to download it again"
fi
echo ""
echo "Calculating sha256 checksum of ${SOURCECD} to verify against SHA256 file..."
cd ${DISTSTUFF}/${ARC}
if [ "$(cat "SHA256" | grep "${SOURCECD}")" = "$(sha256 "${SOURCECD}")" ]; then
echo "checksum match!"
else
echo "sha256 sum of ${SOURCECD} does not match, please verifiy!"
exit 1
fi
cd ${CWD}
echo ""
echo "Cleanup if something failed the last time... (ignore any not currently mounted and Device not configured warnings)"
${SUDO} umount $MOUNTPOINT
${SUDO} vnconfig -u $DEVICE
${SUDO} umount $MOUNTPOINTCD
${SUDO} vnconfig -u $DEVICECD
echo ""
echo "Creating an image file, if one doesn't exist..."
if [ ! -f $IMAGEFILE ] ; then
dd if=/dev/zero of=$IMAGEFILE bs=$bytessec count=$totalsize
fi
echo ""
echo "Mounting the imagefile as a device..."
${SUDO} vnconfig -c $DEVICE $IMAGEFILE
echo ""
echo "Running fdisk... (Ignore any sysctl(machdep.bios.diskinfo): Device not configured warnings)"
${SUDO} fdisk -c $cylinders -h $trackscylinder -s $sectorstrack -f /usr/mdec/mbr -e $DEVICE << __EOC >/dev/null
reinit
update
write
quit
__EOC
let asize=$totalsize-$sectorstrack
echo "type: SCSI" >> $TEMPFILE
echo "disk: vnd device" >> $TEMPFILE
echo "label: fictitious" >> $TEMPFILE
echo "flags:" >> $TEMPFILE
echo "bytes/sector: ${bytessec}" >> $TEMPFILE
echo "sectors/track: ${sectorstrack}" >> $TEMPFILE
echo "tracks/cylinder: ${trackscylinder}" >> $TEMPFILE
echo "sectors/cylinder: ${sectorscylinder}" >> $TEMPFILE
echo "cylinders: ${cylinders}" >> $TEMPFILE
echo "total sectors: ${totalsize}" >> $TEMPFILE
echo "rpm: 3600" >> $TEMPFILE
echo "interleave: 1" >> $TEMPFILE
echo "trackskew: 0" >> $TEMPFILE
echo "cylinderskew: 0" >> $TEMPFILE
echo "headswitch: 0 " >> $TEMPFILE
echo "track-to-track seek: 0 " >> $TEMPFILE
echo "drivedata: 0 " >> $TEMPFILE
echo "" >> $TEMPFILE
echo "16 partitions:" >> $TEMPFILE
echo "a: $asize $sectorstrack 4.2BSD 2048 16384 16" >> $TEMPFILE
echo "c: $totalsize 0 unused 0 0" >> $TEMPFILE
echo ""
echo "Installing disklabel..."
${SUDO} disklabel -R $DEVICE $TEMPFILE
rm $TEMPFILE
echo ""
echo "Creating new filesystem..."
${SUDO} newfs -q /dev/r${DEVICE}a
echo ""
echo "Mounting destination to ${MOUNTPOINT}..."
if [ -d ${MOUNTPOINT} ]; then
${SUDO} rm -r ${MOUNTPOINT}
fi
${SUDO} mkdir -p ${MOUNTPOINT}
if ! ${SUDO} mount -o async /dev/${DEVICE}a ${MOUNTPOINT}; then
echo Mount failed..
exit
fi
echo ""
echo "Mounting the install iso as a device..."
${SUDO} vnconfig $DEVICECD ${DISTSTUFF}/${ARC}/${SOURCECD}
echo ""
echo "Mouting install cd to ${MOUNTPOINTCD}..."
if [ -d ${MOUNTPOINTCD} ]; then
${SUDO} rm -r ${MOUNTPOINTCD}
fi
${SUDO} mkdir -p ${MOUNTPOINTCD}
if ! ${SUDO} mount -t cd9660 /dev/${DEVICECD}c ${MOUNTPOINTCD}; then
echo Mount failed..
exit
fi
echo ""
echo "Copying bsd kernel and boot blocks..."
${SUDO} cp /usr/mdec/boot ${MOUNTPOINT}/boot
${SUDO} cp ${KERNELFILE} ${MOUNTPOINT}/bsd
echo ""
echo "Installing boot blocks..."
${SUDO} /usr/mdec/installboot ${MOUNTPOINT}/boot /usr/mdec/biosboot ${DEVICE}
echo ""
echo "Copying files"
${SUDO} cp -R ${MOUNTPOINTCD}/* ${MOUNTPOINT}
echo ""
echo "Unmounting and cleaning up..."
${SUDO} umount $MOUNTPOINT
${SUDO} vnconfig -u $DEVICE
${SUDO} umount $MOUNTPOINTCD
${SUDO} vnconfig -u $DEVICECD
${SUDO} rm -r ${MOUNTPOINT}
${SUDO} rm -r ${MOUNTPOINTCD}
echo ""
echo "gzipping ${IMAGEFILE} to ${IMAGEFILE}.gz..."
gzip ${IMAGEFILE}
echo ""
echo "And we are done..."
echo "Use \"gunzip -c ${IMAGEFILE}.gz | dd of=/dev/sd0c\" on unix to write to flash"
echo "On Windows you can use http://m0n0.ch/wall/physdiskwrite.php"
echo "Both these utilities allow the gzipped image to be used directly."