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