install.md revision 1.7 1 #!/bin/sh
2 #
3 # $NetBSD: install.md,v 1.7 2002/03/17 05:41:10 gmcgarry Exp $
4 #
5 # Copyright (c) 1996 The NetBSD Foundation, Inc.
6 # All rights reserved.
7 #
8 # This code is derived from software contributed to The NetBSD Foundation
9 # by Jason R. Thorpe.
10 #
11 # Redistribution and use in source and binary forms, with or without
12 # modification, are permitted provided that the following conditions
13 # are met:
14 # 1. Redistributions of source code must retain the above copyright
15 # notice, this list of conditions and the following disclaimer.
16 # 2. Redistributions in binary form must reproduce the above copyright
17 # notice, this list of conditions and the following disclaimer in the
18 # documentation and/or other materials provided with the distribution.
19 # 3. All advertising materials mentioning features or use of this software
20 # must display the following acknowledgement:
21 # This product includes software developed by the NetBSD
22 # Foundation, Inc. and its contributors.
23 # 4. Neither the name of The NetBSD Foundation nor the names of its
24 # contributors may be used to endorse or promote products derived
25 # from this software without specific prior written permission.
26 #
27 # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
28 # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
29 # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
30 # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
31 # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
32 # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
33 # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
34 # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
35 # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
36 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
37 # POSSIBILITY OF SUCH DAMAGE.
38 #
39
40 #
41 # machine dependent section of installation/upgrade script
42 #
43
44 # Machine-dependent install sets
45 MDSETS=""
46
47 md_set_term() {
48 if [ ! -z "$TERM" ]; then
49 return
50 fi
51 echo -n "Specify terminal type [hp300h]: "
52 getresp "hp300h"
53 TERM="$resp"
54 export TERM
55 # XXX call tset?
56 }
57
58 md_makerootwritable() {
59 # Was: do_mfs_mount "/tmp" "2048"
60 # /tmp is the mount point
61 # 2048 is the size in DEV_BIZE blocks
62
63 umount /tmp > /dev/null 2>&1
64 if ! mount_mfs -s 2048 swap /tmp ; then
65 cat << \__mfs_failed_1
66
67 FATAL ERROR: Can't mount the memory filesystem.
68
69 __mfs_failed_1
70 exit
71 fi
72
73 # Bleh. Give mount_mfs a chance to DTRT.
74 sleep 2
75 }
76
77 md_get_diskdevs() {
78 # return available disk devices
79 dmesg | grep "^rd[0-9]*:." | cut -d":" -f1 | sort -u
80 dmesg | grep "^sd[0-9]*:.*cylinders" | cut -d":" -f1 | sort -u
81 }
82
83 md_get_cddevs() {
84 # return available CD-ROM devices
85 dmesg | grep "sd[0-9]*:.*CD-ROM" | cut -d":" -f1 | sort -u
86 }
87
88 md_get_ifdevs() {
89 # return available network interfaces
90 dmesg | grep "^le[0-9]*:" | cut -d":" -f1 | sort -u
91 }
92
93 md_installboot() {
94 # $1 is the root disk
95
96 echo -n "Installing boot block..."
97 disklabel -W ${1}
98 disklabel -B ${1}
99 echo "done."
100 }
101
102 md_checkfordisklabel() {
103 # $1 is the disk to check
104
105 disklabel -r $1 > /dev/null 2> /tmp/checkfordisklabel
106 if grep "no disk label" /tmp/checkfordisklabel; then
107 rval="1"
108 elif grep "disk label corrupted" /tmp/checkfordisklabel; then
109 rval="2"
110 else
111 rval="0"
112 fi
113
114 rm -f /tmp/checkfordisklabel
115 }
116
117 hp300_init_label_scsi_disk() {
118 # $1 is the disk to label
119
120 # Name the disks we install in the temporary fstab.
121 if [ "X${_disk_instance}" = "X" ]; then
122 _disk_instance="0"
123 else
124 _disk_instance=`expr $_disk_instance + 1`
125 fi
126 _cur_disk_name="install-disk-${_disk_instance}"
127
128 # Get geometry information from the user.
129 more << \__scsi_label_1
130
131 You will need to provide some information about your disk's geometry.
132 Geometry info for SCSI disks was printed at boot time. If that information
133 is not available, use the information provided in your disk's manual.
134 Please note that the geometry printed at boot time is preferred.
135
136 IMPORTANT NOTE: due to a limitation in the disklabel(8) program, the
137 number of cylinders on the disk will be increased by 1 so that the initial
138 label can be placed on disk for editing. When the disklabel editor appears,
139 make absolutely certain you subtract 1 from the total number of cylinders,
140 and adjust the size of partition 'c' such that:
141
142 size = (sectors per track) * (tracks per cyl) * (total cylinders)
143
144 Note that the disklabel editor will be run twice; once to set the size of
145 partition 'c' and correct the geometry, and again so that you may correctly
146 edit the partition map. This is to work around the afore mentioned
147 limitation in disklabel(8). Apologies offered in advance.
148
149 __scsi_label_1
150
151 # Give the opportunity to review the boot messages.
152 echo -n "Review boot messages now? [y] "
153 getresp "y"
154 case "$resp" in
155 y*|Y*)
156 (echo ""; dmesg; echo "") | more
157 ;;
158
159 *)
160 ;;
161 esac
162
163 echo ""
164 echo -n "Number of bytes per disk sector? [512] "
165 getresp "512"
166 _secsize="$resp"
167
168 resp="" # force one iteration
169 while [ "X${resp}" = "X" ]; do
170 echo -n "Number of cylinders? "
171 getresp ""
172 done
173 _cylinders="$resp"
174 _fudge_cyl=`expr $_cylinders + 1`
175
176 resp="" # force one iteration
177 while [ "X${resp}" = "X" ]; do
178 echo -n "Number of tracks (heads)? "
179 getresp ""
180 done
181 _tracks_per_cyl="$resp"
182
183 resp="" # force one iteration
184 while [ "X${resp}" = "X" ]; do
185 echo -n "Number of disk sectors (blocks)? "
186 getresp ""
187 done
188 _nsectors="$resp"
189
190 # Calculate some values we need.
191 _sec_per_cyl=`expr $_nsectors / $_cylinders`
192 _sec_per_track=`expr $_sec_per_cyl / $_tracks_per_cyl`
193 _new_c_size=`expr $_sec_per_track \* $_tracks_per_cyl \* $_cylinders`
194
195 # Emit a disktab entry, suitable for getting started.
196 # What we have is a `c' partition with the total number of
197 # blocks, and an `a' partition with 1 sector; just large enough
198 # to open. Don't ask.
199 echo "" >> /etc/disktab
200 echo "# Created by install" >> /etc/disktab
201 echo "${_cur_disk_name}:\\" >> /etc/disktab
202 echo -n " :ty=winchester:ns#${_sec_per_track}:" >> /etc/disktab
203 echo "nt#${_tracks_per_cyl}:nc#${_fudge_cyl}:\\" >> /etc/disktab
204 echo " :pa#1:\\" >> /etc/disktab
205 echo " :pc#${_nsectors}:" >> /etc/disktab
206
207 # Ok, here's what we need to do. First of all, we install
208 # this initial label by opening the `c' partition of the disk
209 # and using the `-r' flag for disklabel(8). However, because
210 # of limitations in disklabel(8), we've had to fudge the number
211 # of cylinders up 1 so that disklabel(8) doesn't complain about
212 # `c' running past the end of the disk, which can be quite
213 # common even with OEM HP drives! So, we've given ourselves
214 # an `a' partition, which is the minimum needed to open the disk
215 # so that we can perform the DIOCWDLABEL ioctl. So, once the
216 # initial label is installed, we open the `a' partition so that
217 # we can fix up the number of cylinders and make the size of
218 # `c' come out to (ncyl * ntracks_per_cyl * nsec_per_track).
219 # After that's done, we re-open `c' and let the user actually
220 # edit the partition table. It's horrible, I know. Bleh.
221
222 disklabel -W ${1}
223 if ! disklabel -w -r ${1} ${_cur_disk_name}; then
224 echo ""
225 echo "ERROR: can't bootstrap disklabel!"
226 rval="1"
227 return
228 fi
229
230 echo ""
231 echo "The disklabel editor will now start. During this phase, you"
232 echo "must reset the 'cylinders' value to ${_cylinders}, and adjust"
233 echo "the size of partition 'c' to ${_new_c_size}. Do not modify"
234 echo "the partition map at this time. You will have the opportunity"
235 echo "to do so in a moment."
236 echo ""
237 echo -n "Press <return> to continue. "
238 getresp ""
239
240 disklabel -W ${1}
241 if ! disklabel -e /dev/r${1}a; then
242 echo ""
243 echo "ERROR: can't fixup geometry!"
244 rval="1"
245 return
246 fi
247
248 cat << \__explain_motives_2
249
250 Now that you have corrected the geometry of your disk, you may edit the
251 partition map. Don't forget to fill in the fsize (frag size), bsize
252 (filesystem block size), and cpg (cylinders per group) values. If you
253 are unsure what these should be, use:
254
255 fsize: 1024
256 bsize: 4096
257 cpg: 16
258
259 __explain_motives_2
260 echo -n "Press <return> to continue. "
261 getresp ""
262
263 rval="0"
264 return
265 }
266
267 hp300_init_label_hpib_disk() {
268 # $1 is the disk to label
269
270 # We look though the boot messages attempting to find
271 # the model number for the provided disk.
272 _hpib_disktype=""
273 if dmesg | grep "${1}: " > /dev/null 2>&1; then
274 _hpib_disktype=HP`dmesg | grep "${1}: " | sort -u | \
275 awk '{print $2}'`
276 fi
277 if [ "X${_hpib_disktype}" = "X" ]; then
278 echo ""
279 echo "ERROR: $1 doesn't appear to exist?!"
280 rval="1"
281 return
282 fi
283
284 # Peer through /etc/disktab to see if the disk has a "default"
285 # layout. If it doesn't, we have to treat it like a SCSI disk;
286 # i.e. prompt for geometry, and create a default to place
287 # on the disk.
288 if ! grep "${_hpib_disktype}[:|]" /etc/disktab > /dev/null \
289 2>&1; then
290 echo ""
291 echo "WARNING: can't find defaults for $1 ($_hpib_disktype)"
292 echo ""
293 hp300_init_label_scsi_disk $1
294 return
295 fi
296
297 # We've found the defaults. Now use them to place an initial
298 # disklabel on the disk.
299 # XXX What kind of ugliness to we have to deal with to get around
300 # XXX stupidity on the part of disklabel semantics?
301 disklabel -W ${1}
302 if ! disklabel -r -w ${1} $_hpib_disktype; then
303 # Error message displayed by disklabel(8)
304 echo ""
305 echo "ERROR: can't install default label!"
306 echo ""
307 echo -n "Try a different method? [y] "
308 getresp "y"
309 case "$resp" in
310 y*|Y*)
311 hp300_init_label_scsi_disk $1
312 return
313 ;;
314
315 *)
316 rval="1"
317 return
318 ;;
319 esac
320 fi
321
322 rval="0"
323 return
324 }
325
326 md_labeldisk() {
327 # $1 is the disk to label
328
329 # Check to see if there is a disklabel present on the device.
330 # If so, we can just edit it. If not, we must first install
331 # a default label.
332 md_checkfordisklabel $1
333 case "$rval" in
334 0)
335 # Go ahead and just edit the disklabel.
336 disklabel -W $1
337 disklabel -e $1
338 ;;
339
340 *)
341 echo -n "No disklabel present, installing a default for type: "
342 case "$1" in
343 rd*)
344 echo "HP-IB"
345 hp300_init_label_hpib_disk $1
346 ;;
347
348 sd*)
349 echo "SCSI"
350 hp300_init_label_scsi_disk $1
351 ;;
352
353 *)
354 # Shouldn't happen, but...
355 echo "unknown?! Giving up."
356 return;
357 ;;
358 esac
359
360 # Check to see if installing the default was
361 # successful. If so, go ahead and pop into the
362 # disklabel editor.
363 if [ "X${rval}" != X"0" ]; then
364 echo "Sorry, can't label this disk."
365 echo ""
366 return;
367 fi
368
369 # We have some defaults installed. Pop into
370 # the disklabel editor.
371 disklabel -W $1
372 if ! disklabel -e $1; then
373 echo ""
374 echo "ERROR: couldn't set partition map for $1"
375 echo ""
376 fi
377 esac
378 }
379
380 md_prep_disklabel() {
381 # $1 is the root disk
382
383 # Make sure there's a disklabel there. If there isn't, puke after
384 # disklabel prints the error message.
385 md_checkfordisklabel $1
386 case "$resp" in
387 1)
388 cat << \__md_prep_disklabel_1
389
390 FATAL ERROR: There is no disklabel present on the root disk! You must
391 label the disk with SYS_INST before continuing.
392
393 __md_prep_disklabel_1
394 exit
395 ;;
396
397 2)
398 cat << \__md_prep_disklabel_2
399
400 FATAL ERROR: The disklabel on the root disk is corrupted! You must
401 re-label the disk with SYS_INST before continuing.
402
403 __md_prep_disklabel_2
404 exit
405 ;;
406
407 *)
408 ;;
409 esac
410
411 # Give the user the opportinuty to edit the root disklabel.
412 cat << \__md_prep_disklabel_3
413
414 You have already placed a disklabel onto the target root disk.
415 However, due to the limitations of the standalone program used
416 you may want to edit that label to change partition type information.
417 You will be given the opporunity to do that now. Note that you may
418 not change the size or location of any presently open partition.
419
420 __md_prep_disklabel_3
421 echo -n "Do you wish to edit the root disklabel? [y] "
422 getresp "y"
423 case "$resp" in
424 y*|Y*)
425 disklabel -W $1
426 disklabel -e $1
427 ;;
428
429 *)
430 ;;
431 esac
432
433 cat << \__md_prep_disklabel_4
434
435 You will now be given the opportunity to place disklabels on any additional
436 disks on your system.
437 __md_prep_disklabel_4
438
439 _DKDEVS=`rmel ${ROOTDISK} ${_DKDEVS}`
440 resp="X" # force at least one iteration
441 while [ "X$resp" != X"done" ]; do
442 labelmoredisks
443 done
444 }
445
446 md_copy_kernel() {
447 echo -n "Copying kernel..."
448 cp -p /netbsd /mnt/netbsd
449 echo "done."
450
451 cat << __md_copy_kernel_1
452
453 The INSTALL kernel from the miniroot has been copied to your root disk.
454 It has minimal facilities enabled. The first thing you should do after
455 installation is install an appropriate kernel for your machine (such as
456 the GENERIC kernel).
457
458 __md_copy_kernel_1
459 echo -n "Press <return> to continue. "
460 getresp ""
461 }
462
463 # Note, while they might not seem machine-dependent, the
464 # welcome banner and the punt message may contain information
465 # and/or instructions specific to the type of machine.
466
467 md_welcome_banner() {
468 (
469 echo ""
470 echo "Welcome to the NetBSD/hp300 ${VERSION} installation program."
471 cat << \__welcome_banner_1
472
473 This program is designed to help you install NetBSD on your system in a
474 simple and rational way. You'll be asked several questions, and it would
475 probably be useful to have your disk's hardware manual, the installation
476 notes, and a calculator handy.
477
478 In particular, you will need to know some reasonably detailed
479 information about your disk's geometry. This program can determine
480 some limited information about certain specific types of HP-IB disks.
481 If you have SCSI disks, however, prior knowledge of disk geometry
482 is absolutely essential. The kernel will attempt to display geometry
483 information for SCSI disks during boot, if possible. If you did not
484 make it note of it before, you may wish to reboot and jot down your
485 disk's geometry before proceeding.
486
487 As with anything which modifies your hard disk's contents, this
488 program can cause SIGNIFICANT data loss, and you are advised
489 to make sure your hard drive is backed up before beginning the
490 installation process.
491
492 Default answers are displyed in brackets after the questions.
493 You can hit Control-C at any time to quit, but if you do so at a
494 prompt, you may have to hit return. Also, quitting in the middle of
495 installation may leave your system in an inconsistent state.
496
497 __welcome_banner_1
498 ) | more
499 }
500
501 md_not_going_to_install() {
502 cat << \__not_going_to_install_1
503
504 OK, then. Enter 'halt' at the prompt to halt the machine. Once the
505 machine has halted, power-cycle the system to load new boot code.
506
507 __not_going_to_install_1
508 }
509
510 md_congrats() {
511 cat << \__congratulations_1
512
513 CONGRATULATIONS! You have successfully installed NetBSD! To boot the
514 installed system, enter halt at the command prompt. Once the system has
515 halted, power-cycle the machine in order to load new boot code. Make sure
516 you boot from the root disk.
517
518 __congratulations_1
519 }
520
521 md_native_fstype() {
522 # Nothing to do.
523 }
524
525 md_native_fsopts() {
526 # Nothing to do.
527 }
528