Annotation of src/distrib/miniroot/install.sh, Revision 1.19.2.1
1.1 pk 1: #!/bin/sh
1.19.2.1! is 2: # $NetBSD: install.sh,v 1.20 1999/04/12 22:17:21 is Exp $
1.1 pk 3: #
1.2 thorpej 4: # Copyright (c) 1996 The NetBSD Foundation, Inc.
1.1 pk 5: # All rights reserved.
6: #
1.2 thorpej 7: # This code is derived from software contributed to The NetBSD Foundation
8: # by Jason R. Thorpe.
9: #
1.1 pk 10: # Redistribution and use in source and binary forms, with or without
11: # modification, are permitted provided that the following conditions
12: # are met:
13: # 1. Redistributions of source code must retain the above copyright
14: # notice, this list of conditions and the following disclaimer.
15: # 2. Redistributions in binary form must reproduce the above copyright
16: # notice, this list of conditions and the following disclaimer in the
17: # documentation and/or other materials provided with the distribution.
18: # 3. All advertising materials mentioning features or use of this software
19: # must display the following acknowledgement:
1.2 thorpej 20: # This product includes software developed by the NetBSD
21: # Foundation, Inc. and its contributors.
22: # 4. Neither the name of The NetBSD Foundation nor the names of its
23: # contributors may be used to endorse or promote products derived
24: # from this software without specific prior written permission.
1.1 pk 25: #
1.2 thorpej 26: # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
27: # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
28: # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
1.17 jtc 29: # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
30: # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
1.2 thorpej 31: # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
32: # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
33: # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
34: # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35: # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36: # POSSIBILITY OF SUCH DAMAGE.
1.1 pk 37: #
38:
39: # NetBSD installation script.
40: # In a perfect world, this would be a nice C program, with a reasonable
41: # user interface.
42:
43: FILESYSTEMS="/tmp/filesystems" # used thoughout
44: FQDN="" # domain name
45:
46: trap "umount /tmp > /dev/null 2>&1" 0
47:
48: MODE="install"
49:
50: # include machine-dependent functions
51: # The following functions must be provided:
1.6 leo 52: # md_copy_kernel() - copy a kernel to the installed disk
1.1 pk 53: # md_get_diskdevs() - return available disk devices
54: # md_get_cddevs() - return available CD-ROM devices
55: # md_get_ifdevs() - return available network interfaces
1.6 leo 56: # md_get_partition_range() - return range of valid partition letters
1.1 pk 57: # md_installboot() - install boot-blocks on disk
1.12 pk 58: # md_labeldisk() - put label on a disk
1.6 leo 59: # md_prep_disklabel() - label the root disk
1.1 pk 60: # md_welcome_banner() - display friendly message
61: # md_not_going_to_install() - display friendly message
62: # md_congrats() - display friendly message
1.5 pk 63: # md_native_fstype() - native filesystem type for disk installs
64: # md_native_fsopts() - native filesystem options for disk installs
1.14 gwr 65: # md_makerootwritable() - make root writable (at least /tmp)
1.6 leo 66:
67: # include machine dependent subroutines
1.1 pk 68: . install.md
69:
70: # include common subroutines
71: . install.sub
72:
1.14 gwr 73: # which sets?
1.19.2.1! is 74: THESETS="$ALLSETS $MDSETS"
1.14 gwr 75:
1.1 pk 76: # Good {morning,afternoon,evening,night}.
77: md_welcome_banner
78: echo -n "Proceed with installation? [n] "
79: getresp "n"
80: case "$resp" in
81: y*|Y*)
82: echo "Cool! Let's get to it..."
83: ;;
84: *)
85: md_not_going_to_install
86: exit
87: ;;
88: esac
89:
90: # XXX Work around vnode aliasing bug (thanks for the tip, Chris...)
91: ls -l /dev > /dev/null 2>&1
92:
93: # Deal with terminal issues
94: md_set_term
95:
96: # Get timezone info
97: get_timezone
98:
1.14 gwr 99: # Make sure we can write files (at least in /tmp)
100: # This might make an MFS mount on /tmp, or it may
101: # just re-mount the root with read-write enabled.
102: md_makerootwritable
1.1 pk 103:
104: # Install the shadowed disktab file; lets us write to it for temporary
105: # purposes without mounting the miniroot read-write.
106: cp /etc/disktab.shadow /tmp/disktab.shadow
107:
108: while [ "X${ROOTDISK}" = "X" ]; do
109: getrootdisk
110: done
111:
1.9 thorpej 112: # Deal with disklabels, including editing the root disklabel
113: # and labeling additional disks. This is machine-dependent since
114: # some platforms may not be able to provide this functionality.
115: md_prep_disklabel ${ROOTDISK}
1.1 pk 116:
117: # Assume partition 'a' of $ROOTDISK is for the root filesystem. Loop and
118: # get the rest.
119: # XXX ASSUMES THAT THE USER DOESN'T PROVIDE BOGUS INPUT.
120: cat << \__get_filesystems_1
121:
122: You will now have the opportunity to enter filesystem information.
123: You will be prompted for device name and mount point (full path,
124: including the prepending '/' character).
125:
126: Note that these do not have to be in any particular order. You will
127: be given the opportunity to edit the resulting 'fstab' file before
128: any of the filesystems are mounted. At that time you will be able
129: to resolve any filesystem order dependencies.
130:
131: __get_filesystems_1
132:
133: echo "The following will be used for the root filesystem:"
134: echo " ${ROOTDISK}a /"
135:
136: echo "${ROOTDISK}a /" > ${FILESYSTEMS}
137:
138: resp="X" # force at least one iteration
139: while [ "X$resp" != X"done" ]; do
140: echo ""
1.19 is 141: echo -n "Device name? [RETURN if you already entered all devices] "
1.1 pk 142: getresp "done"
143: case "$resp" in
144: done)
145: ;;
146:
147: *)
148: _device_name=`basename $resp`
149:
150: # force at least one iteration
151: _first_char="X"
152: while [ "X${_first_char}" != X"/" ]; do
153: echo -n "Mount point? "
154: getresp ""
155: _mount_point=$resp
156: if [ "X${_mount_point}" = X"/" ]; then
157: # Invalid response; no multiple roots
158: _first_char="X"
159: else
1.3 pk 160: _first_char=`firstchar ${_mount_point}`
1.1 pk 161: fi
162: done
1.4 pk 163: echo "${_device_name} ${_mount_point}" >> ${FILESYSTEMS}
1.1 pk 164: resp="X" # force loop to repeat
165: ;;
166: esac
167: done
168:
1.18 pk 169: # configure swap
170: resp="" # force at least one iteration
171: while [ "X${resp}" = X"" ]; do
172: echo -n "Ok to configure ${ROOTDISK}b as a swap device? [] "
173: getresp ""
174: case "$resp" in
175: y*|Y*)
176: echo "${ROOTDISK}b swap" >> ${FILESYSTEMS}
177: ;;
178: n*|N*)
179: ;;
180: *) ;;
181: esac
182: done
183:
184:
1.1 pk 185: echo ""
186: echo "You have configured the following devices and mount points:"
187: echo ""
188: cat ${FILESYSTEMS}
189: echo ""
190: echo "Filesystems will now be created on these devices. If you made any"
191: echo -n "mistakes, you may edit this now. Edit? [n] "
192: getresp "n"
193: case "$resp" in
194: y*|Y*)
1.5 pk 195: ${EDITOR} ${FILESYSTEMS}
1.1 pk 196: ;;
197: *)
198: ;;
199: esac
200:
201: # Loop though the file, place filesystems on each device.
202: echo "Creating filesystems..."
203: (
1.18 pk 204: while read _device_name _mp; do
205: if [ "$_mp" != "swap" ]; then
206: newfs /dev/r${_device_name}
207: echo ""
208: fi
1.1 pk 209: done
210: ) < ${FILESYSTEMS}
211:
212: # Get network configuration information, and store it for placement in the
213: # root filesystem later.
214: cat << \__network_config_1
215: You will now be given the opportunity to configure the network. This will
216: be useful if you need to transfer the installation sets via FTP or NFS.
217: Even if you choose not to transfer installation sets that way, this
218: information will be preserved and copied into the new root filesystem.
219:
220: Note, enter all symbolic host names WITHOUT the domain name appended.
221: I.e. use 'hostname' NOT 'hostname.domain.name'.
222:
223: __network_config_1
224: echo -n "Configure the network? [y] "
225: getresp "y"
226: case "$resp" in
227: y*|Y*)
228: resp="" # force at least one iteration
1.8 pk 229: if [ -f /etc/myname ]; then
230: resp=`cat /etc/myname`
231: fi
232: echo -n "Enter system hostname: [$resp] "
1.1 pk 233: while [ "X${resp}" = X"" ]; do
1.8 pk 234: getresp "$resp"
1.1 pk 235: done
236: hostname $resp
237: echo $resp > /tmp/myname
238:
239: echo -n "Enter DNS domain name: "
240: resp="" # force at least one iteration
241: while [ "X${resp}" = X"" ]; do
242: getresp ""
243: done
244: FQDN=$resp
245:
246: configurenetwork
247:
248: echo -n "Enter IP address of default route: [none] "
249: getresp "none"
250: if [ "X${resp}" != X"none" ]; then
251: route delete default > /dev/null 2>&1
252: if route add default $resp > /dev/null ; then
253: echo $resp > /tmp/mygate
254: fi
255: fi
256:
257: echo -n "Enter IP address of primary nameserver: [none] "
258: getresp "none"
259: if [ "X${resp}" != X"none" ]; then
260: echo "domain $FQDN" > /tmp/resolv.conf
261: echo "nameserver $resp" >> /tmp/resolv.conf
262: echo "search $FQDN" >> /tmp/resolv.conf
263:
264: echo -n "Would you like to use the nameserver now? [y] "
265: getresp "y"
266: case "$resp" in
267: y*|Y*)
268: cp /tmp/resolv.conf \
269: /tmp/resolv.conf.shadow
270: ;;
271:
272: *)
273: ;;
274: esac
275: fi
276:
277: echo ""
278: echo "The host table is as follows:"
279: echo ""
280: cat /tmp/hosts
281: echo ""
282: echo "You may want to edit the host table in the event that"
283: echo "you need to mount an NFS server."
284: echo -n "Would you like to edit the host table? [n] "
285: getresp "n"
286: case "$resp" in
287: y*|Y*)
1.5 pk 288: ${EDITOR} /tmp/hosts
1.1 pk 289: ;;
290:
291: *)
292: ;;
293: esac
294:
295: cat << \__network_config_2
296:
297: You will now be given the opportunity to escape to the command shell to
298: do any additional network configuration you may need. This may include
299: adding additional routes, if needed. In addition, you might take this
300: opportunity to redo the default route in the event that it failed above.
301: If you do change the default route, and wish for that change to carry over
302: to the installed system, execute the following command at the shell
303: prompt:
304:
305: echo <ip_address_of_gateway> > /tmp/mygate
306:
307: where <ip_address_of_gateway> is the IP address of the default router.
308:
309: __network_config_2
310: echo -n "Escape to shell? [n] "
311: getresp "n"
312: case "$resp" in
313: y*|Y*)
314: echo "Type 'exit' to return to install."
315: sh
316: ;;
317:
318: *)
319: ;;
320: esac
321: ;;
322: *)
323: ;;
324: esac
325:
326: # Now that the network has been configured, it is safe to configure the
327: # fstab.
1.4 pk 328: (
329: while read _dev _mp; do
1.18 pk 330: if [ "$_mp" = "/" ]; then
1.4 pk 331: echo /dev/$_dev $_mp ffs rw 1 1
1.18 pk 332: elif [ "$_mp" = "swap" ]; then
333: echo /dev/$_dev none swap sw 0 0
1.4 pk 334: else
335: echo /dev/$_dev $_mp ffs rw 1 2
336: fi
337: done
338: ) < ${FILESYSTEMS} > /tmp/fstab
1.1 pk 339:
340: echo "The fstab is configured as follows:"
341: echo ""
342: cat /tmp/fstab
343: cat << \__fstab_config_1
344:
345: You may wish to edit the fstab. For example, you may need to resolve
346: dependencies in the order which the filesystems are mounted. You may
347: also wish to take this opportunity to place NFS mounts in the fstab.
348: This would be especially useful if you plan to keep '/usr' on an NFS
349: server.
350:
351: __fstab_config_1
352: echo -n "Edit the fstab? [n] "
353: getresp "n"
354: case "$resp" in
355: y*|Y*)
1.5 pk 356: ${EDITOR} /tmp/fstab
1.1 pk 357: ;;
358:
359: *)
360: ;;
361: esac
362:
363: echo ""
364: munge_fstab /tmp/fstab /tmp/fstab.shadow
365: mount_fs /tmp/fstab.shadow
366:
1.10 pk 367: mount | while read line; do
368: set -- $line
369: if [ "$2" = "/" -a "$3" = "nfs" ]; then
370: echo "You appear to be running diskless."
371: echo -n "Are the install sets on one of your currently mounted filesystems? [n] "
372: getresp "n"
373: case "$resp" in
374: y*|Y*)
375: get_localdir
376: ;;
377: *)
378: ;;
379: esac
380: fi
381: done
382:
1.19.2.1! is 383: install_sets
1.1 pk 384:
385: # Copy in configuration information and make devices in target root.
386: (
387: cd /tmp
1.15 pk 388: for file in fstab ifconfig.* hosts myname mygate resolv.conf; do
1.1 pk 389: if [ -f $file ]; then
390: echo -n "Copying $file..."
391: cp $file /mnt/etc/$file
392: echo "done."
393: fi
394: done
1.16 pk 395:
396: # Enable rc.conf
397: if [ -e /mnt/etc/rc.conf ]; then
398: cp /mnt/etc/rc.conf /tmp
399: sed 's/^rc_configured=NO/rc_configured=YES/' /tmp/rc.conf \
400: > /mnt/etc/rc.conf
401: fi
1.1 pk 402:
1.6 leo 403: # If no zoneinfo on the installfs, give them a second chance
404: if [ ! -e /usr/share/zoneinfo ]; then
405: get_timezone
406: fi
407: if [ ! -e /mnt/usr/share/zoneinfo ]; then
408: echo "Cannot install timezone link..."
409: else
410: echo -n "Installing timezone link..."
411: rm -f /mnt/etc/localtime
412: ln -s /usr/share/zoneinfo/$TZ /mnt/etc/localtime
413: echo "done."
414: fi
415: if [ ! -x /mnt/dev/MAKEDEV ]; then
416: echo "No /dev/MAKEDEV installed, something is wrong here..."
417: else
418: echo -n "Making devices..."
419: pid=`twiddle`
420: cd /mnt/dev
421: sh MAKEDEV all
422: kill $pid
423: echo "done."
424: fi
425: md_copy_kernel
1.1 pk 426:
427: md_installboot ${ROOTDISK}
428: )
429:
430: unmount_fs /tmp/fstab.shadow
431:
432: # Pat on the back.
433: md_congrats
434:
435: # ALL DONE!
436: exit 0
CVSweb <webmaster@jp.NetBSD.org>