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