upgrade.sh revision 1.4 1 1.1 pk #!/bin/sh
2 1.4 pk # $NetBSD: upgrade.sh,v 1.4 1996/05/27 13:32:01 pk Exp $
3 1.1 pk #
4 1.2 thorpej # Copyright (c) 1996 The NetBSD Foundation, Inc.
5 1.1 pk # All rights reserved.
6 1.1 pk #
7 1.2 thorpej # This code is derived from software contributed to The NetBSD Foundation
8 1.2 thorpej # by Jason R. Thorpe.
9 1.2 thorpej #
10 1.1 pk # Redistribution and use in source and binary forms, with or without
11 1.1 pk # modification, are permitted provided that the following conditions
12 1.1 pk # are met:
13 1.1 pk # 1. Redistributions of source code must retain the above copyright
14 1.1 pk # notice, this list of conditions and the following disclaimer.
15 1.1 pk # 2. Redistributions in binary form must reproduce the above copyright
16 1.1 pk # notice, this list of conditions and the following disclaimer in the
17 1.1 pk # documentation and/or other materials provided with the distribution.
18 1.1 pk # 3. All advertising materials mentioning features or use of this software
19 1.1 pk # must display the following acknowledgement:
20 1.2 thorpej # This product includes software developed by the NetBSD
21 1.2 thorpej # Foundation, Inc. and its contributors.
22 1.2 thorpej # 4. Neither the name of The NetBSD Foundation nor the names of its
23 1.2 thorpej # contributors may be used to endorse or promote products derived
24 1.2 thorpej # from this software without specific prior written permission.
25 1.1 pk #
26 1.2 thorpej # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
27 1.2 thorpej # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
28 1.2 thorpej # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29 1.2 thorpej # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE
30 1.2 thorpej # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
31 1.2 thorpej # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
32 1.2 thorpej # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
33 1.2 thorpej # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
34 1.2 thorpej # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35 1.2 thorpej # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36 1.2 thorpej # POSSIBILITY OF SUCH DAMAGE.
37 1.1 pk #
38 1.1 pk
39 1.1 pk # NetBSD installation script.
40 1.1 pk # In a perfect world, this would be a nice C program, with a reasonable
41 1.1 pk # user interface.
42 1.1 pk
43 1.1 pk ROOTDISK="" # filled in below
44 1.3 leo RELDIR="" # Path searched for sets by install_sets
45 1.3 leo export RELDIR # on the local filesystems
46 1.1 pk
47 1.3 leo trap "umount -a > /dev/null 2>&1" 0
48 1.1 pk
49 1.1 pk MODE="upgrade"
50 1.1 pk
51 1.1 pk # include machine-dependent functions
52 1.1 pk # The following functions must be provided:
53 1.3 leo # md_copy_kernel() - copy a kernel to the installed disk
54 1.1 pk # md_get_diskdevs() - return available disk devices
55 1.1 pk # md_get_cddevs() - return available CD-ROM devices
56 1.1 pk # md_get_ifdevs() - return available network interfaces
57 1.3 leo # md_get_partition_range() - return range of valid partition letters
58 1.1 pk # md_installboot() - install boot-blocks on disk
59 1.1 pk # md_checkfordisklabel() - check for valid disklabel
60 1.1 pk # md_labeldisk() - put label on a disk
61 1.1 pk # md_welcome_banner() - display friendly message
62 1.1 pk # md_not_going_to_install() - display friendly message
63 1.1 pk # md_congrats() - display friendly message
64 1.3 leo
65 1.3 leo # include machine dependent subroutines
66 1.1 pk . install.md
67 1.1 pk
68 1.1 pk # include common subroutines
69 1.1 pk . install.sub
70 1.1 pk
71 1.3 leo # include version number
72 1.3 leo . VERSION
73 1.3 leo
74 1.3 leo get_reldir() {
75 1.3 leo while : ; do
76 1.3 leo echo -n "Enter the pathname where the sets are stored [$RELDIR] "
77 1.3 leo getresp "$RELDIR"
78 1.3 leo RELDIR=$resp
79 1.3 leo
80 1.3 leo # Allow break-out with empty response
81 1.3 leo if [ -z "$RELDIR" ]; then
82 1.3 leo echo -n "Are you sure you don't want to set the pathname? [n] "
83 1.3 leo getresp "n"
84 1.3 leo case "$resp" in
85 1.3 leo y*|Y*)
86 1.3 leo break
87 1.3 leo ;;
88 1.3 leo *)
89 1.3 leo continue
90 1.3 leo ;;
91 1.3 leo esac
92 1.3 leo fi
93 1.3 leo if [ -f "/mnt/$RELDIR/base.tar.gz" ]; then
94 1.3 leo break
95 1.3 leo else
96 1.3 leo echo -n "The directory $RELDIR does not exist, retry? [y] "
97 1.3 leo getresp "y"
98 1.3 leo case "$resp" in
99 1.3 leo y*|Y*)
100 1.3 leo ;;
101 1.3 leo *)
102 1.3 leo break
103 1.3 leo ;;
104 1.3 leo esac
105 1.3 leo fi
106 1.3 leo done
107 1.3 leo }
108 1.3 leo
109 1.1 pk # Good {morning,afternoon,evening,night}.
110 1.1 pk md_welcome_banner
111 1.1 pk echo -n "Proceed with upgrade? [n] "
112 1.1 pk getresp "n"
113 1.1 pk case "$resp" in
114 1.1 pk y*|Y*)
115 1.1 pk echo "Cool! Let's get to it..."
116 1.1 pk ;;
117 1.1 pk *)
118 1.1 pk md_not_going_to_install
119 1.1 pk exit
120 1.1 pk ;;
121 1.1 pk esac
122 1.1 pk
123 1.1 pk # Deal with terminal issues
124 1.1 pk md_set_term
125 1.1 pk
126 1.1 pk # XXX Work around vnode aliasing bug (thanks for the tip, Chris...)
127 1.1 pk ls -l /dev > /dev/null 2>&1
128 1.1 pk
129 1.1 pk # We don't like it, but it sure makes a few things a lot easier.
130 1.1 pk do_mfs_mount "/tmp" "2048"
131 1.1 pk
132 1.1 pk while [ "X${ROOTDISK}" = "X" ]; do
133 1.1 pk getrootdisk
134 1.1 pk done
135 1.1 pk
136 1.1 pk # Make sure there's a disklabel there. If there isn't, puke after
137 1.1 pk # disklabel prints the error message.
138 1.1 pk md_checkfordisklabel ${ROOTDISK}
139 1.1 pk case $rval in
140 1.1 pk 1)
141 1.1 pk cat << \__disklabel_not_present_1
142 1.1 pk
143 1.1 pk FATAL ERROR: There is no disklabel present on the root disk! You must
144 1.1 pk label the disk with SYS_INST before continuing.
145 1.1 pk
146 1.1 pk __disklabel_not_present_1
147 1.1 pk exit
148 1.1 pk ;;
149 1.1 pk
150 1.1 pk 2)
151 1.1 pk cat << \__disklabel_corrupted_1
152 1.1 pk
153 1.1 pk FATAL ERROR: The disklabel on the root disk is corrupted! You must
154 1.1 pk re-label the disk with SYS_INST before continuing.
155 1.1 pk
156 1.1 pk __disklabel_corrupted_1
157 1.1 pk exit
158 1.1 pk ;;
159 1.1 pk
160 1.1 pk *)
161 1.1 pk ;;
162 1.1 pk esac
163 1.1 pk
164 1.1 pk # Assume partition 'a' of $ROOTDISK is for the root filesystem. Confirm
165 1.1 pk # this with the user. Check and mount the root filesystem.
166 1.1 pk resp="" # force one iteration
167 1.1 pk while [ "X${resp}" = "X" ]; do
168 1.1 pk echo -n "Root filesystem? [${ROOTDISK}a] "
169 1.1 pk getresp "${ROOTDISK}a"
170 1.1 pk _root_filesystem="/dev/`basename $resp`"
171 1.1 pk if [ ! -b ${_root_filesystem} ]; then
172 1.1 pk echo "Sorry, ${resp} is not a block device."
173 1.1 pk resp="" # force loop to repeat
174 1.1 pk fi
175 1.1 pk done
176 1.1 pk
177 1.1 pk echo "Checking root filesystem..."
178 1.1 pk if ! fsck -pf ${_root_filesystem}; then
179 1.1 pk echo "ERROR: can't check root filesystem!"
180 1.1 pk exit 1
181 1.1 pk fi
182 1.1 pk
183 1.1 pk echo "Mounting root filesystem..."
184 1.1 pk if ! mount -o ro ${_root_filesystem} /mnt; then
185 1.1 pk echo "ERROR: can't mount root filesystem!"
186 1.1 pk exit 1
187 1.1 pk fi
188 1.1 pk
189 1.1 pk # Grab the fstab so we can munge it for our own use.
190 1.1 pk if [ ! -f /mnt/etc/fstab ]; then
191 1.1 pk echo "ERROR: no /etc/fstab!"
192 1.1 pk exit 1
193 1.1 pk fi
194 1.1 pk cp /mnt/etc/fstab /tmp/fstab
195 1.1 pk
196 1.1 pk # Grab the hosts table so we can use it.
197 1.1 pk if [ ! -f /mnt/etc/hosts ]; then
198 1.1 pk echo "ERROR: no /etc/hosts!"
199 1.1 pk exit 1
200 1.1 pk fi
201 1.1 pk cp /mnt/etc/hosts /tmp/hosts
202 1.1 pk
203 1.1 pk # Start up the network in same/similar configuration as the installed system
204 1.1 pk # uses.
205 1.1 pk cat << \__network_config_1
206 1.1 pk
207 1.1 pk The upgrade program would now like to enable the network. It will use the
208 1.1 pk configuration already stored on the root filesystem. This is required
209 1.1 pk if you wish to use the network installation capabilities of this program.
210 1.1 pk
211 1.1 pk __network_config_1
212 1.1 pk echo -n "Enable network? [y] "
213 1.1 pk getresp "y"
214 1.1 pk case "$resp" in
215 1.1 pk y*|Y*)
216 1.1 pk if ! enable_network; then
217 1.1 pk echo "ERROR: can't enable network!"
218 1.1 pk exit 1
219 1.1 pk fi
220 1.1 pk
221 1.1 pk cat << \__network_config_2
222 1.1 pk
223 1.1 pk You will now be given the opportunity to escape to the command shell to
224 1.1 pk do any additional network configuration you may need. This may include
225 1.1 pk adding additional routes, if needed. In addition, you might take this
226 1.1 pk opportunity to redo the default route in the event that it failed above.
227 1.1 pk
228 1.1 pk __network_config_2
229 1.1 pk echo -n "Escape to shell? [n] "
230 1.1 pk getresp "n"
231 1.1 pk case "$resp" in
232 1.1 pk y*|Y*)
233 1.1 pk echo "Type 'exit' to return to upgrade."
234 1.1 pk sh
235 1.1 pk ;;
236 1.1 pk
237 1.1 pk *)
238 1.1 pk ;;
239 1.1 pk esac
240 1.1 pk ;;
241 1.1 pk *)
242 1.1 pk ;;
243 1.1 pk esac
244 1.1 pk
245 1.1 pk # Now that the network has been configured, it is safe to configure the
246 1.1 pk # fstab. We remove all but ufs/ffs/nfs.
247 1.1 pk (
248 1.4 pk > /tmp/fstab.new
249 1.4 pk while read _dev _mp _fstype _rest ; do
250 1.1 pk if [ "X${_fstype}" = X"ufs" -o \
251 1.1 pk "X${_fstype}" = X"ffs" -o \
252 1.1 pk "X${_fstype}" = X"nfs" ]; then
253 1.4 pk if [ "X${_fstype}" = X"ufs" ]; then
254 1.4 pk # Convert ufs to ffs.
255 1.4 pk _fstype=ffs
256 1.4 pk fi
257 1.4 pk echo "$_dev $_mp $_fstype $_rest" >> /tmp/fstab.new
258 1.1 pk fi
259 1.1 pk done
260 1.1 pk ) < /tmp/fstab
261 1.1 pk
262 1.1 pk if [ ! -f /tmp/fstab.new ]; then
263 1.1 pk echo "ERROR: strange fstab!"
264 1.1 pk exit 1
265 1.1 pk fi
266 1.1 pk
267 1.1 pk rm -f /tmp/fstab.new
268 1.1 pk
269 1.1 pk echo "The fstab is configured as follows:"
270 1.1 pk echo ""
271 1.1 pk cat /tmp/fstab
272 1.1 pk cat << \__fstab_config_1
273 1.1 pk
274 1.1 pk You may wish to edit the fstab. For example, you may need to resolve
275 1.1 pk dependencies in the order which the filesystems are mounted. Note that
276 1.1 pk this fstab is only for installation purposes, and will not be copied into
277 1.1 pk the root filesystem.
278 1.1 pk
279 1.1 pk __fstab_config_1
280 1.1 pk echo -n "Edit the fstab? [n] "
281 1.1 pk getresp "n"
282 1.1 pk case "$resp" in
283 1.1 pk y*|Y*)
284 1.3 leo ${EDITOR} /tmp/fstab
285 1.1 pk ;;
286 1.1 pk
287 1.1 pk *)
288 1.1 pk ;;
289 1.1 pk esac
290 1.1 pk
291 1.1 pk echo ""
292 1.1 pk munge_fstab /tmp/fstab /tmp/fstab.shadow
293 1.1 pk
294 1.1 pk if ! umount /mnt; then
295 1.1 pk echo "ERROR: can't unmount previously mounted root!"
296 1.1 pk exit 1
297 1.1 pk fi
298 1.1 pk
299 1.1 pk # Check all of the filesystems.
300 1.1 pk check_fs /tmp/fstab.shadow
301 1.1 pk
302 1.1 pk # Mount filesystems.
303 1.1 pk mount_fs /tmp/fstab.shadow
304 1.1 pk
305 1.3 leo
306 1.3 leo echo -n "Are the upgrade sets on one of your normally mounted filesystems? [y] "
307 1.3 leo getresp "y"
308 1.3 leo case "$resp" in
309 1.3 leo y*|Y*)
310 1.3 leo get_reldir
311 1.3 leo ;;
312 1.3 leo *)
313 1.3 leo ;;
314 1.3 leo esac
315 1.3 leo
316 1.1 pk # Install sets.
317 1.1 pk install_sets $UPGRSETS
318 1.1 pk
319 1.1 pk # Get timezone info
320 1.1 pk get_timezone
321 1.1 pk
322 1.1 pk # Fix up the fstab.
323 1.1 pk echo -n "Converting ufs to ffs in /etc/fstab..."
324 1.4 pk (
325 1.4 pk > /tmp/fstab
326 1.4 pk while read _dev _mp _fstype _rest ; do
327 1.4 pk if [ "X${_fstype}" = X"ufs" -o \
328 1.4 pk "X${_fstype}" = X"ffs" -o \
329 1.4 pk "X${_fstype}" = X"nfs" ]; then
330 1.4 pk if [ "X${_fstype}" = X"ufs" ]; then
331 1.4 pk # Convert ufs to ffs.
332 1.4 pk _fstype=ffs
333 1.4 pk fi
334 1.4 pk echo "$_dev $_mp $_fstype $_rest" >> /tmp/fstab
335 1.4 pk fi
336 1.4 pk done
337 1.4 pk ) < /mnt/etc/fstab
338 1.1 pk echo "done."
339 1.1 pk echo -n "Would you like to edit the resulting fstab? [y] "
340 1.1 pk getresp "y"
341 1.1 pk case "$resp" in
342 1.1 pk y*|Y*)
343 1.3 leo ${EDITOR} /tmp/fstab
344 1.1 pk ;;
345 1.1 pk
346 1.1 pk *)
347 1.1 pk ;;
348 1.1 pk esac
349 1.1 pk
350 1.1 pk # Copy in configuration information and make devices in target root.
351 1.1 pk (
352 1.1 pk cd /tmp
353 1.1 pk for file in fstab; do
354 1.1 pk if [ -f $file ]; then
355 1.1 pk echo -n "Copying $file..."
356 1.1 pk cp $file /mnt/etc/$file
357 1.1 pk echo "done."
358 1.1 pk fi
359 1.1 pk done
360 1.1 pk
361 1.1 pk echo -n "Installing timezone link..."
362 1.1 pk rm -f /mnt/etc/localtime
363 1.1 pk ln -s /usr/share/zoneinfo/$TZ /mnt/etc/localtime
364 1.1 pk echo "done."
365 1.1 pk
366 1.1 pk echo -n "Making devices..."
367 1.1 pk pid=`twiddle`
368 1.1 pk cd /mnt/dev
369 1.1 pk sh MAKEDEV all
370 1.1 pk kill $pid
371 1.1 pk echo "done."
372 1.1 pk
373 1.3 leo md_copy_kernel
374 1.1 pk
375 1.1 pk md_installboot ${ROOTDISK}
376 1.1 pk )
377 1.1 pk
378 1.1 pk unmount_fs /tmp/fstab.shadow
379 1.1 pk
380 1.1 pk # Pat on the back.
381 1.1 pk md_congrats
382 1.1 pk
383 1.1 pk # ALL DONE!
384 1.1 pk exit 0
385