Expand PMF_FN_* macros.
[netbsd-mini2440.git] / distrib / alpha / instkernel / ramdisk / install.sh
blob6213dcb1d8ae2289518e7b34fa5da254f076e73b
1 #!/bin/sh
2 # $NetBSD: install.sh,v 1.5 2009/09/16 10:40:02 abs Exp $
4 # Copyright (c) 1997 Perry E. Metzger
5 # Copyright (c) 1994 Christopher G. Demetriou
6 # All rights reserved.
7 #
8 # Redistribution and use in source and binary forms, with or without
9 # modification, are permitted provided that the following conditions
10 # are met:
11 # 1. Redistributions of source code must retain the above copyright
12 # notice, this list of conditions and the following disclaimer.
13 # 2. Redistributions in binary form must reproduce the above copyright
14 # notice, this list of conditions and the following disclaimer in the
15 # documentation and/or other materials provided with the distribution.
16 # 3. All advertising materials mentioning features or use of this software
17 # must display the following acknowledgement:
18 # This product includes software developed for the
19 # NetBSD Project. See http://www.NetBSD.org/ for
20 # information about NetBSD.
21 # 4. The name of the author may not be used to endorse or promote products
22 # derived from this software without specific prior written permission.
24 # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
25 # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
26 # OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
27 # IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
28 # INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
29 # NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
30 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
31 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
33 # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35 # <<Id: LICENSE,v 1.2 2000/06/14 15:57:33 cgd Exp>>
37 # NetBSD installation script.
38 # In a perfect world, this would be a nice C program, with a reasonable
39 # user interface.
41 DT=/etc/disktab # /etc/disktab
42 FSTABDIR=/mnt/etc # /mnt/etc
43 #DONTDOIT=echo
44 ASYNC="-o async"
46 FSTAB=${FSTABDIR}/fstab
48 getresp() {
49 read resp
50 if [ "X$resp" = "X" ]; then
51 resp=$1
55 echo "Welcome to the original NetBSD/alpha installation program."
56 echo ""
57 echo "This version of the program has been largely replaced by the new
58 echo "sysinst utility. Both programs are on this installation media set.
59 echo -n "Type the return key to continue..."
60 getresp
61 echo "This program is designed to help you put NetBSD on your hard disk,"
62 echo "in a simple and rational way. You'll be asked several questions,"
63 echo "and it would probably be useful to have your disk's hardware"
64 echo "manual, the installation notes, and a calculator handy."
65 echo ""
66 echo "In particular, you will need to know some reasonably detailed"
67 echo "information about your disk's geometry, because there is currently"
68 echo "no way this program can figure that information out."
69 echo ""
70 echo "As with anything which modifies your hard drive's contents, this"
71 echo "program can cause SIGNIFICANT data loss, and you are advised"
72 echo "to make sure your hard drive is backed up before beginning the"
73 echo "installation process."
74 echo ""
75 echo "Default answers are displyed in brackets after the questions."
76 echo "You can hit Control-C at any time to quit, but if you do so at a"
77 echo "prompt, you may have to hit return. Also, quitting in the middle of"
78 echo "installation may leave your system in an inconsistent state."
79 echo ""
80 echo -n "Proceed with installation? [n] "
81 getresp "n"
82 case "$resp" in
83 y*|Y*)
84 echo "Cool! Let's get to it..."
87 echo ""
88 echo "OK, then. Enter 'halt' at the prompt to halt the"
89 echo "machine. Once the machine has halted, remove the"
90 echo "floppy and press any key to reboot."
91 exit
93 esac
95 echo ""
96 echo "To do the installation, you'll need to provide some information about"
97 echo "your disk."
98 echo ""
99 echo "NetBSD can be installed on ST506, ESDI, IDE, or SCSI disks."
100 echo -n "What kind of disk will you be installing on? [SCSI] "
101 getresp "SCSI"
102 case "$resp" in
103 esdi|ESDI|st506|ST506)
104 drivetype=wd
105 echo -n "Does it support _automatic_ sector remapping? [y] "
106 getresp "y"
107 case "$resp" in
108 n*|N*)
109 sect_fwd="sf:"
112 sect_fwd=""
114 esac
116 ide|IDE)
117 drivetype=wd
118 sect_fwd=""
119 type=ST506
121 scsi|SCSI)
122 drivetype=sd
123 sect_fwd=""
124 type=SCSI
126 esac
128 # find out what units are possible for that disk, and query the user.
129 driveunits=`echo /dev/${drivetype}?a | sed -e 's,/dev/\(...\)a,\1,g'`
130 if [ "X${driveunits}" = "X" ]; then
131 echo "FATAL ERROR:"
132 echo "No devices for disks of type '${drivetype}'."
133 echo "This is probably a bug in the install disks."
134 echo "Exiting install program."
135 exit
137 prefdrive=${drivetype}0
139 echo ""
140 echo "The following ${drivetype}-type disks are supported by this"
141 echo "installation procedure:"
142 echo " "${driveunits}
143 echo "Note that they may not exist in _your_ machine; the list of"
144 echo "disks in your machine was printed when the system was booting."
145 echo ""
146 while [ "X${drivename}" = "X" ]; do
147 echo -n "Which disk would like to install on? [${prefdrive}] "
148 getresp ${prefdrive}
149 otherdrives=`echo "${driveunits}" | sed -e s,${resp},,`
150 if [ "X${driveunits}" = "X${otherdrives}" ]; then
151 echo ""
152 echo "\"${resp}\" is an invalid drive name. Valid choices"
153 echo "are: "${driveunits}
154 echo ""
155 else
156 drivename=${resp}
158 done
160 echo ""
161 echo "Using disk ${drivename}."
162 echo ""
163 echo -n "What kind of disk is it? (one word please) [my${drivetype}] "
164 getresp "my${drivetype}"
165 labelname=$resp
167 echo ""
168 echo "You will now need to provide some information about your disk's"
169 echo "geometry. This should either be in the User's Manual for your disk,"
170 echo "or you should have written down what NetBSD printed when booting."
171 echo "(Note that he geometry that's printed at boot time is preferred.)"
172 echo ""
173 echo "You may choose to view the initial boot messages for your system"
174 echo "again right now if you like."
175 echo -n "View the boot messages again? [n] "
176 getresp "n"
177 case "$resp" in
178 y*|Y*)
179 dmesg | more
182 echo ""
184 esac
186 echo ""
187 echo "You will now enter the disk geometry information"
188 echo ""
190 echo -n "Number of bytes per disk sector? [512] "
191 getresp 512
192 bytes_per_sect="$resp"
194 echo -n "Number of disk cylinders? "
195 getresp
196 cyls_per_disk="$resp"
198 echo -n "Number of disk tracks (heads) per disk cylinder? "
199 getresp
200 tracks_per_cyl="$resp"
202 echo -n "Number of disk sectors per disk track? "
203 getresp
204 sects_per_track="$resp"
206 cylindersize=$(( $sects_per_track * $tracks_per_cyl ))
207 cylbytes=$(( $cylindersize * $bytes_per_sect ))
208 disksize=$(( $cylindersize * $cyls_per_disk ))
210 echo ""
211 echo "Your disk has a total of $disksize $bytes_per_sect byte sectors,"
212 echo "arranged as $cyls_per_disk cylinders which contain $cylindersize "
213 echo "sectors ($cylbytes bytes) each."
214 echo ""
215 echo "You can specify partition sizes in cylinders ('c') or sectors ('s')."
216 while [ "X${sizemult}" = "X" ]; do
217 echo -n "What units would you like to use? [cylinders] "
218 getresp cylinders
219 case "$resp" in
220 c*|C*)
221 sizemult=$cylindersize
222 sizeunit="cylinders"
224 s*|S*)
225 sizemult=1
226 sizeunit="sectors"
229 echo ""
230 echo "Enter cylinders ('c') or sectors ('s')."
232 esac
233 done
235 if [ $sizeunit = "sectors" ]; then
236 echo ""
237 echo "For best disk performance, partitions should begin and end on"
238 echo "cylinder boundaries. Wherever possible, pick sizes that are"
239 echo "multiples of the cylinder size ($cylindersize sectors)."
242 partition_sects=$disksize
243 partition=$(( $disksize / $sizemult ))
244 part_offset=0
246 badspacesec=0
247 if [ "$sect_fwd" = "sf:" ]; then
248 badspacecyl=$(( $sects_per_track + 126 ))
249 badspacecyl=$(( $badspacecyl + $cylindersize - 1 ))
250 badspacecyl=$(( $badspacecyl / $cylindersize ))
251 badspacesec=$(( $badspacecyl * $cylindersize ))
252 echo ""
253 echo -n "Using $badspacesec sectors ($badspacecyl cylinders) for the "
254 echo "bad144 bad block table"
257 sects_left=$(( $partition_sects - $badspacesec ))
258 units_left=$(( $sects_left / $sizemult ))
259 echo ""
260 echo "There are $units_left $sizeunit left to allocate."
261 echo ""
262 root=0
263 while [ $root -eq 0 ]; do
264 echo -n "Root partition size (in $sizeunit)? "
265 getresp
266 case $resp in
267 [1-9]*)
268 total=$resp
269 if [ $total -gt $units_left ]; then
270 echo -n "Root size is greater than remaining "
271 echo "free space on disk."
272 else
273 root=$resp
276 esac
277 done
278 root_offset=$part_offset
279 part_used=$(( $root + $badspacesec / $sizemult ))
280 units_left=$(( $partition - $part_used ))
281 echo ""
283 swap=0
284 while [ $swap -eq 0 ]; do
285 echo "$units_left $sizeunit remaining in NetBSD portion of disk."
286 echo -n "Swap partition size (in $sizeunit)? "
287 getresp
288 case $resp in
289 [1-9]*)
290 if [ $swap -gt $units_left ]; then
291 echo -n "Swap size is greater than remaining "
292 echo "free space on disk."
293 else
294 swap=$resp
297 esac
298 done
299 swap_offset=$(( $root_offset + $root ))
300 part_used=$(( $part_used + $swap ))
301 echo ""
303 fragsize=1024
304 blocksize=8192
306 echo "# $DT" > $DT
307 echo "" >> $DT
308 echo "$labelname|NetBSD installation generated:\\" >> $DT
309 echo " :dt=${type}:ty=winchester:\\" >> $DT
310 echo -n " :nc#${cyls_per_disk}:ns#${sects_per_track}" >> $DT
311 echo ":nt#${tracks_per_cyl}:\\" >> $DT
312 echo " :se#${bytes_per_sect}:${sect_fwd}\\" >> $DT
313 _size=$(( $root * $sizemult ))
314 _offset=$(( $root_offset * $sizemult ))
315 echo -n " :pa#${_size}:oa#${_offset}" >> $DT
316 echo ":ta=4.2BSD:ba#${blocksize}:fa#${fragsize}:\\" >> $DT
317 _size=$(( $swap * $sizemult ))
318 _offset=$(( $swap_offset * $sizemult ))
319 echo " :pb#${_size}:ob#${_offset}:tb=swap:\\" >> $DT
320 _size=$(( $partition * $sizemult ))
321 _offset=$(( $part_offset * $sizemult ))
322 echo " :pc#${_size}:oc#${_offset}:\\" >> $DT
324 echo "You will now have to enter information about any other partitions"
325 echo "to be created in the NetBSD portion of the disk. This process will"
326 echo "be complete when you've filled up all remaining space in the NetBSD"
327 echo "portion of the disk."
329 while [ $part_used -lt $partition ]; do
330 part_size=0
331 units_left=$(( $partition - $part_used ))
332 while [ $part_size -eq 0 ]; do
333 echo ""
334 echo -n "$units_left $sizeunit remaining in NetBSD portion of "
335 echo "the disk"
336 echo -n "Next partition size (in $sizeunit)? "
337 getresp
338 case $resp in
339 [1-9]*)
340 total=$(( $part_used + $resp ))
341 if [ $total -gt $partition ]; then
342 echo -n "That would make the parition"
343 echo "too large to fit!"
344 else
345 part_size=$resp
346 part_used=$total
347 part_name=""
348 while [ "$part_name" = "" ]; do
349 echo -n "Mount point? "
350 getresp
351 part_name=$resp
352 done
355 esac
356 done
357 if [ "$dname" = "" ]; then
358 dname=$part_name
359 offset=$(( $part_offset + $root + $swap ))
360 _size=$(( $part_size * $sizemult ))
361 _offset=$(( $offset * $sizemult ))
362 echo -n " :pd#${_size}:od#${_offset}" >> $DT
363 echo ":td=4.2BSD:bd#${blocksize}:fd#${fragsize}:\\" >> $DT
364 offset=$(( $offset + $part_size ))
365 elif [ "$ename" = "" ]; then
366 ename=$part_name
367 _size=$(( $part_size * $sizemult ))
368 _offset=$(( $offset * $sizemult ))
369 echo -n " :pe#${_size}:oe#${_offset}" >> $DT
370 echo ":te=4.2BSD:be#${blocksize}:fe#${fragsize}:\\" >> $DT
371 offset=$(( $offset + $part_size ))
372 elif [ "$fname" = "" ]; then
373 fname=$part_name
374 _size=$(( $part_size * $sizemult ))
375 _offset=$(( $offset * $sizemult ))
376 echo -n " :pf#${_size}:of#${_offset}" >> $DT
377 echo ":tf=4.2BSD:bf#${blocksize}:ff#${fragsize}:\\" >> $DT
378 offset=$(( $offset + $part_size ))
379 elif [ "$gname" = "" ]; then
380 gname=$part_name
381 _size=$(( $part_size * $sizemult ))
382 _offset=$(( $offset * $sizemult ))
383 echo -n " :pg#${_size}:og#${_offset}" >> $DT
384 echo ":tg=4.2BSD:bg#${blocksize}:fg#${fragsize}:\\" >> $DT
385 offset=$(( $offset + $part_size ))
386 elif [ "$hname" = "" ]; then
387 hname=$part_name
388 _size=$(( $part_size * $sizemult ))
389 _offset=$(( $offset * $sizemult ))
390 echo -n " :ph#${_size}:oh#${_offset}" >> $DT
391 echo ":th=4.2BSD:bh#${blocksize}:fh#${fragsize}:\\" >> $DT
392 part_used=$partition
394 done
395 echo >> $DT
396 sync
398 echo ""
399 echo "THIS IS YOUR LAST CHANCE!!!"
400 echo ""
401 echo -n "Are you SURE you want NetBSD installed on your hard drive? (yes/no) "
402 answer=""
403 while [ "$answer" = "" ]; do
404 getresp
405 case $resp in
406 yes|YES)
407 echo ""
408 echo "Here we go..."
409 answer=yes
411 no|NO)
412 echo ""
413 echo -n "OK, then. enter 'halt' to halt the machine. "
414 echo "Once the machine has halted,"
415 echo -n "remove the floppy, and press any key to "
416 echo "reboot."
417 exit
420 echo -n "I want a yes or no answer... well? "
422 esac
423 done
425 echo ""
426 echo -n "Labeling disk $drivename..."
427 $DONTDOIT disklabel -w -r $drivename $labelname
428 echo " done."
430 if [ "$sect_fwd" = "sf:" ]; then
431 echo -n "Initializing bad144 badblock table..."
432 $DONTDOIT bad144 $drivename 0
433 echo " done."
436 echo "Initializing root filesystem, and mounting..."
437 $DONTDOIT newfs /dev/r${drivename}a $name
438 $DONTDOIT mount -v $ASYNC /dev/${drivename}a /mnt
439 if [ "$dname" != "" ]; then
440 echo ""
441 echo "Initializing $dname filesystem, and mounting..."
442 $DONTDOIT newfs /dev/r${drivename}d $name
443 $DONTDOIT mkdir -p /mnt/$dname
444 $DONTDOIT mount -v $ASYNC /dev/${drivename}d /mnt/$dname
446 if [ "$ename" != "" ]; then
447 echo ""
448 echo "Initializing $ename filesystem, and mounting..."
449 $DONTDOIT newfs /dev/r${drivename}e $name
450 $DONTDOIT mkdir -p /mnt/$ename
451 $DONTDOIT mount -v $ASYNC /dev/${drivename}e /mnt/$ename
453 if [ "$fname" != "" ]; then
454 echo ""
455 echo "Initializing $fname filesystem, and mounting..."
456 $DONTDOIT newfs /dev/r${drivename}f $name
457 $DONTDOIT mkdir -p /mnt/$fname
458 $DONTDOIT mount -v $ASYNC /dev/${drivename}f /mnt/$fname
460 if [ "$gname" != "" ]; then
461 echo ""
462 echo "Initializing $gname filesystem, and mounting..."
463 $DONTDOIT newfs /dev/r${drivename}g $name
464 $DONTDOIT mkdir -p /mnt/$gname
465 $DONTDOIT mount -v $ASYNC /dev/${drivename}g /mnt/$gname
467 if [ "$hname" != "" ]; then
468 echo ""
469 echo "Initializing $hname filesystem, and mounting..."
470 $DONTDOIT newfs /dev/r${drivename}h $name
471 $DONTDOIT mkdir -p /mnt/$hname
472 $DONTDOIT mount -v $ASYNC /dev/${drivename}h /mnt/$hname
475 echo ""
476 echo "Populating filesystems with bootstrapping binaries and config files"
477 $DONTDOIT pax -Xrwpe . /mnt
478 $DONTDOIT cp /tmp/.hdprofile /mnt/.profile
480 echo ""
481 echo -n "Creating an fstab..."
482 echo /dev/${drivename}a / ffs rw 1 1 | sed -e s,//,/, > $FSTAB
483 echo /dev/${drivename}b none swap sw 0 0 | sed -e s,//,/, >> $FSTAB
484 if [ "$dname" != "" ]; then
485 echo /dev/${drivename}d /$dname ffs rw 1 2 | sed -e s,//,/, >> $FSTAB
487 if [ "$ename" != "" ]; then
488 echo /dev/${drivename}e /$ename ffs rw 1 2 | sed -e s,//,/, >> $FSTAB
490 if [ "$fname" != "" ]; then
491 echo /dev/${drivename}f /$fname ffs rw 1 3 | sed -e s,//,/, >> $FSTAB
493 if [ "$gname" != "" ]; then
494 echo /dev/${drivename}g /$gname ffs rw 1 4 | sed -e s,//,/, >> $FSTAB
496 if [ "$hname" != "" ]; then
497 echo /dev/${drivename}h /$hname ffs rw 1 5 | sed -e s,//,/, >> $FSTAB
499 sync
500 echo " done."
502 echo ""
503 echo -n "Installing boot blocks on $drivename..."
504 $DONTDOIT rm -f /mnt/boot
505 $DONTDOIT cp /usr/mdec/boot /mnt/boot
506 $DONTDOIT /usr/sbin/installboot /dev/r${drivename}c /usr/mdec/bootxx_ffs
507 echo " done."
510 echo ""
511 echo ""
512 echo "OK! The preliminary work of setting up your disk is now complete."
513 echo ""
514 echo "The remaining tasks are:"
515 echo ""
516 echo "To load and install the NetBSD distribution sets."
517 echo "Currently the hard drive's root filesystem is mounted on /mnt"
518 echo ""
519 echo "To copy a NetBSD kernel to the hard drive's root filesystem."
520 echo "Once accomplished, you can boot off the hard drive."
521 echo ""
522 echo "Consult the installation notes which will describe how to"
523 echo "install the distribution sets and kernel. Post-installation"
524 echo "configuration is also discussed therein."
525 echo ""
526 echo "GOOD LUCK!"
527 echo ""