Annotation of src/distrib/miniroot/upgrade.sh, Revision 1.20.12.1
1.1 pk 1: #!/bin/sh
1.20.12.1! tron 2: # $NetBSD$
1.1 pk 3: #
1.20.12.1! tron 4: # Copyright (c) 1996-2000,2006 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.12 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: ROOTDISK="" # filled in below
44:
1.6 pk 45: trap "unmount_fs -fast /tmp/fstab.shadow > /dev/null 2>&1; rm -f /tmp/fstab.shadow" 0
1.1 pk 46:
47: MODE="upgrade"
48:
49: # include machine-dependent functions
50: # The following functions must be provided:
1.3 leo 51: # md_copy_kernel() - copy a kernel to the installed disk
1.1 pk 52: # md_get_diskdevs() - return available disk devices
53: # md_get_cddevs() - return available CD-ROM devices
54: # md_get_ifdevs() - return available network interfaces
1.3 leo 55: # md_get_partition_range() - return range of valid partition letters
1.1 pk 56: # md_installboot() - install boot-blocks on disk
57: # md_labeldisk() - put label on a disk
58: # md_welcome_banner() - display friendly message
59: # md_not_going_to_install() - display friendly message
60: # md_congrats() - display friendly message
1.20 pk 61: # md_set_term - set terminal type
62: # md_makerootwritable - what it says
63: # optional:
64: # md_upgrade_prep_needed - variable: set if you md_prepare_upgrade()
65: # md_prepare_upgrade - any machine dependent preparations
1.20.12.1! tron 66: # md_view_labels_possible - variable: md_view_labels defined
! 67: # md_view_labels - peek at preexisting disk labels, to
! 68: # better identify disks
1.3 leo 69:
1.19 sjg 70: # we need to make sure .'s below work if this directory is not in $PATH
71: # dirname may not be available but expr is
72: Mydir=`expr $0 : '^\(.*\)/[^/]*$'`
73: Mydir=`cd ${Mydir:-.}; pwd`
74:
75: # this is the most likely place to find the binary sets
76: # so save them having to type it in
77: Default_sets_dir=$Mydir/../../binary/sets
78:
1.3 leo 79: # include machine dependent subroutines
1.19 sjg 80: . $Mydir/install.md
1.1 pk 81:
82: # include common subroutines
1.19 sjg 83: . $Mydir/install.sub
1.1 pk 84:
1.8 jtc 85: # which sets?
1.17 is 86: THESETS="$UPGRSETS $MDSETS"
1.8 jtc 87:
1.9 pk 88: # Files that moved between 1.2 and 1.3
1.13 pk 89: RELOCATED_FILES_13="${RELOCATED_FILES_13} /sbin/dumpfs /usr/sbin/dumpfs"
90: RELOCATED_FILES_13="${RELOCATED_FILES_13} /sbin/dumplfs /usr/sbin/dumplfs"
91: RELOCATED_FILES_13="${RELOCATED_FILES_13} /sbin/nfsd /usr/sbin/nfsd"
92: RELOCATED_FILES_13="${RELOCATED_FILES_13} /sbin/nfsiod /usr/sbin/nfsiod"
1.11 pk 93: RELOCATED_FILES_13="${RELOCATED_FILES_13} /sbin/mountd /usr/sbin/mountd"
1.13 pk 94: RELOCATED_FILES_13="${RELOCATED_FILES_13} /sbin/quotacheck /usr/sbin/quotacheck"
1.14 pk 95: RELOCATED_FILES_13="${RELOCATED_FILES_13} /sbin/rtquery /usr/sbin/rtquery"
1.18 pk 96:
97: # Files that moved between 1.3 and 1.4
98: RELOCATED_FILES_14="${RELOCATED_FILES_14} /sbin/newlfs /sbin/newfs_lfs"
99: RELOCATED_FILES_14="${RELOCATED_FILES_14} /usr/games/chess /usr/games/chess"
100: RELOCATED_FILES_14="${RELOCATED_FILES_14} /usr/games/hide/chess /usr/games/hide/chess"
101: RELOCATED_FILES_14="${RELOCATED_FILES_14} /usr/share/games/gnuchess.book /usr/share/games/gnuchess.book"
102: RELOCATED_FILES_14="${RELOCATED_FILES_14} /usr/share/games/atc/ATC_scores /usr/share/games/atc/ATC_scores"
103: RELOCATED_FILES_14="${RELOCATED_FILES_14} /usr/share/games/atc/ATC_scores /usr/share/games/atc/ATC_scores"
104: RELOCATED_FILES_14="${RELOCATED_FILES_14} /usr/lib/libamu.a /usr/lib/libamu.a"
105: RELOCATED_FILES_14="${RELOCATED_FILES_14} /usr/lib/libamu_p.a /usr/lib/libamu_p.a"
106: RELOCATED_FILES_14="${RELOCATED_FILES_14} /usr/lib/libamu_pic.a /usr/lib/libamu_pic.a"
107: RELOCATED_FILES_14="${RELOCATED_FILES_14} /usr/lib/libbfd.a /usr/lib/libbfd.a"
108: RELOCATED_FILES_14="${RELOCATED_FILES_14} /usr/lib/libbfd_pic.a /usr/lib/libbfd_pic.a"
109: RELOCATED_FILES_14="${RELOCATED_FILES_14} /usr/lib/libg++.a /usr/lib/libg++.a"
110: RELOCATED_FILES_14="${RELOCATED_FILES_14} /usr/lib/libg++_p.a /usr/lib/libg++_p.a"
111: RELOCATED_FILES_14="${RELOCATED_FILES_14} /usr/lib/libg++_pic.a /usr/lib/libg++_pic.a"
112:
113: RELOCATED_FILES_14="${RELOCATED_FILES_14} /usr/sbin/gettable /usr/sbin/gettable"
114: RELOCATED_FILES_14="${RELOCATED_FILES_14} /usr/sbin/dig /usr/bin/dig"
115: RELOCATED_FILES_14="${RELOCATED_FILES_14} /usr/sbin/dnsquery /usr/bin/dnsquery"
116: RELOCATED_FILES_14="${RELOCATED_FILES_14} /usr/sbin/htable /usr/bin/htable"
117: RELOCATED_FILES_14="${RELOCATED_FILES_14} /usr/sbin/htable /usr/sbin/htable"
118: RELOCATED_FILES_14="${RELOCATED_FILES_14} /usr/sbin/nslookup /usr/sbin/nslookup"
1.9 pk 119:
120: rm_relocated_files()
121: {
122: # ($n, $(n+1)): pairs of (old,new) locations of relocated files
123: while [ $# -ge 2 ]; do
124: if [ -f "$2" ]; then
125: echo Removing "$1";
126: rm -f "$1"
127: fi
128: shift 2
129: done
130: }
131:
1.1 pk 132: # Good {morning,afternoon,evening,night}.
133: md_welcome_banner
134: echo -n "Proceed with upgrade? [n] "
135: getresp "n"
136: case "$resp" in
137: y*|Y*)
138: echo "Cool! Let's get to it..."
139: ;;
140: *)
141: md_not_going_to_install
142: exit
143: ;;
144: esac
145:
146: # Deal with terminal issues
147: md_set_term
148:
149: # XXX Work around vnode aliasing bug (thanks for the tip, Chris...)
150: ls -l /dev > /dev/null 2>&1
151:
1.8 jtc 152: # Make sure we can write files (at least in /tmp)
153: # This might make an MFS mount on /tmp, or it may
154: # just re-mount the root with read-write enabled.
155: md_makerootwritable
1.1 pk 156:
1.20.12.1! tron 157: test "$md_view_labels_possible" && md_view_labels
! 158:
1.1 pk 159: while [ "X${ROOTDISK}" = "X" ]; do
160: getrootdisk
161: done
162:
163: # Assume partition 'a' of $ROOTDISK is for the root filesystem. Confirm
164: # this with the user. Check and mount the root filesystem.
165: resp="" # force one iteration
166: while [ "X${resp}" = "X" ]; do
167: echo -n "Root filesystem? [${ROOTDISK}a] "
168: getresp "${ROOTDISK}a"
169: _root_filesystem="/dev/`basename $resp`"
170: if [ ! -b ${_root_filesystem} ]; then
171: echo "Sorry, ${resp} is not a block device."
172: resp="" # force loop to repeat
173: fi
174: done
175:
176: echo "Checking root filesystem..."
177: if ! fsck -pf ${_root_filesystem}; then
178: echo "ERROR: can't check root filesystem!"
179: exit 1
180: fi
181:
182: echo "Mounting root filesystem..."
183: if ! mount -o ro ${_root_filesystem} /mnt; then
184: echo "ERROR: can't mount root filesystem!"
185: exit 1
186: fi
187:
188: # Grab the fstab so we can munge it for our own use.
189: if [ ! -f /mnt/etc/fstab ]; then
190: echo "ERROR: no /etc/fstab!"
191: exit 1
192: fi
193:
194: # Grab the hosts table so we can use it.
195: if [ ! -f /mnt/etc/hosts ]; then
196: echo "ERROR: no /etc/hosts!"
197: exit 1
198: fi
199: cp /mnt/etc/hosts /tmp/hosts
200:
201: # Start up the network in same/similar configuration as the installed system
202: # uses.
203: cat << \__network_config_1
204:
205: The upgrade program would now like to enable the network. It will use the
206: configuration already stored on the root filesystem. This is required
207: if you wish to use the network installation capabilities of this program.
208:
209: __network_config_1
210: echo -n "Enable network? [y] "
211: getresp "y"
212: case "$resp" in
213: y*|Y*)
214: if ! enable_network; then
215: echo "ERROR: can't enable network!"
216: exit 1
217: fi
218:
219: cat << \__network_config_2
220:
221: You will now be given the opportunity to escape to the command shell to
222: do any additional network configuration you may need. This may include
223: adding additional routes, if needed. In addition, you might take this
224: opportunity to redo the default route in the event that it failed above.
225:
226: __network_config_2
227: echo -n "Escape to shell? [n] "
228: getresp "n"
229: case "$resp" in
230: y*|Y*)
231: echo "Type 'exit' to return to upgrade."
232: sh
233: ;;
234:
235: *)
236: ;;
237: esac
238: ;;
239: *)
240: ;;
241: esac
242:
243: # Now that the network has been configured, it is safe to configure the
1.7 pk 244: # fstab. We remove all but ufs/ffs.
1.1 pk 245: (
1.7 pk 246: > /tmp/fstab
1.4 pk 247: while read _dev _mp _fstype _rest ; do
1.1 pk 248: if [ "X${_fstype}" = X"ufs" -o \
1.7 pk 249: "X${_fstype}" = X"ffs" ]; then
1.4 pk 250: if [ "X${_fstype}" = X"ufs" ]; then
251: # Convert ufs to ffs.
252: _fstype=ffs
253: fi
1.7 pk 254: echo "$_dev $_mp $_fstype $_rest" >> /tmp/fstab
1.1 pk 255: fi
256: done
1.7 pk 257: ) < /mnt/etc/fstab
1.1 pk 258:
259: echo "The fstab is configured as follows:"
260: echo ""
261: cat /tmp/fstab
262: cat << \__fstab_config_1
263:
264: You may wish to edit the fstab. For example, you may need to resolve
265: dependencies in the order which the filesystems are mounted. Note that
266: this fstab is only for installation purposes, and will not be copied into
267: the root filesystem.
268:
269: __fstab_config_1
270: echo -n "Edit the fstab? [n] "
271: getresp "n"
272: case "$resp" in
273: y*|Y*)
1.3 leo 274: ${EDITOR} /tmp/fstab
1.1 pk 275: ;;
276:
277: *)
278: ;;
279: esac
280:
281: echo ""
282: munge_fstab /tmp/fstab /tmp/fstab.shadow
283:
284: if ! umount /mnt; then
285: echo "ERROR: can't unmount previously mounted root!"
286: exit 1
287: fi
288:
289: # Check all of the filesystems.
290: check_fs /tmp/fstab.shadow
291:
292: # Mount filesystems.
293: mount_fs /tmp/fstab.shadow
1.20 pk 294:
295: # Machine dependent preparation.
296: test "$md_upgrade_prep_needed" && {
297: md_prepare_upgrade || {
298: cat << 'EOF'
299: The preparations for upgrading your machine did not complete successfully.
300:
301: EOF
302: echo -n "Continue anyway? [n]"
303: getresp "n"
304: case "$resp" in
305: y*|Y*)
306: ;;
307: *)
308: exit 1
309: ;;
310: esac
311: }
312: }
313:
1.1 pk 314:
1.6 pk 315: echo -n "Are the upgrade sets on one of your normally mounted (local) filesystems? [y] "
1.3 leo 316: getresp "y"
317: case "$resp" in
318: y*|Y*)
1.6 pk 319: get_localdir /mnt
1.3 leo 320: ;;
321: *)
322: ;;
323: esac
324:
1.1 pk 325: # Install sets.
1.6 pk 326: install_sets
1.9 pk 327:
328: # Remove files that have just been installed in a new location
329: # from the old location
330: rm_relocated_files `eval echo \\$RELOCATED_FILES_${VERSION}`
1.1 pk 331:
332: # Get timezone info
333: get_timezone
334:
335: # Fix up the fstab.
336: echo -n "Converting ufs to ffs in /etc/fstab..."
1.4 pk 337: (
338: > /tmp/fstab
339: while read _dev _mp _fstype _rest ; do
1.7 pk 340: if [ "X${_fstype}" = X"ufs" ]; then
341: # Convert ufs to ffs.
342: _fstype=ffs
1.4 pk 343: fi
1.7 pk 344: echo "$_dev $_mp $_fstype $_rest" >> /tmp/fstab
1.4 pk 345: done
346: ) < /mnt/etc/fstab
1.1 pk 347: echo "done."
348: echo -n "Would you like to edit the resulting fstab? [y] "
349: getresp "y"
350: case "$resp" in
351: y*|Y*)
1.3 leo 352: ${EDITOR} /tmp/fstab
1.1 pk 353: ;;
354:
355: *)
356: ;;
357: esac
358:
359: # Copy in configuration information and make devices in target root.
360: (
361: cd /tmp
362: for file in fstab; do
363: if [ -f $file ]; then
364: echo -n "Copying $file..."
365: cp $file /mnt/etc/$file
366: echo "done."
367: fi
368: done
369:
370: echo -n "Installing timezone link..."
371: rm -f /mnt/etc/localtime
372: ln -s /usr/share/zoneinfo/$TZ /mnt/etc/localtime
373: echo "done."
374:
375: echo -n "Making devices..."
1.6 pk 376: _pid=`twiddle`
1.1 pk 377: cd /mnt/dev
378: sh MAKEDEV all
1.6 pk 379: kill $_pid
1.1 pk 380: echo "done."
381:
1.3 leo 382: md_copy_kernel
1.1 pk 383:
384: md_installboot ${ROOTDISK}
385: )
386:
387: unmount_fs /tmp/fstab.shadow
388:
389: # Pat on the back.
390: md_congrats
391:
392: # ALL DONE!
393: exit 0
CVSweb <webmaster@jp.NetBSD.org>