upgrade.sh revision 1.15 1 1.1 pk #!/bin/sh
2 1.15 veego # $NetBSD: upgrade.sh,v 1.15 1998/01/23 22:36:39 veego 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.12 jtc # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
30 1.12 jtc # BE 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.1 pk
45 1.6 pk trap "unmount_fs -fast /tmp/fstab.shadow > /dev/null 2>&1; rm -f /tmp/fstab.shadow" 0
46 1.1 pk
47 1.1 pk MODE="upgrade"
48 1.1 pk
49 1.1 pk # include machine-dependent functions
50 1.1 pk # The following functions must be provided:
51 1.3 leo # md_copy_kernel() - copy a kernel to the installed disk
52 1.1 pk # md_get_diskdevs() - return available disk devices
53 1.1 pk # md_get_cddevs() - return available CD-ROM devices
54 1.1 pk # md_get_ifdevs() - return available network interfaces
55 1.3 leo # md_get_partition_range() - return range of valid partition letters
56 1.1 pk # md_installboot() - install boot-blocks on disk
57 1.1 pk # md_labeldisk() - put label on a disk
58 1.1 pk # md_welcome_banner() - display friendly message
59 1.1 pk # md_not_going_to_install() - display friendly message
60 1.1 pk # md_congrats() - display friendly message
61 1.3 leo
62 1.3 leo # include machine dependent subroutines
63 1.1 pk . install.md
64 1.1 pk
65 1.1 pk # include common subroutines
66 1.1 pk . install.sub
67 1.1 pk
68 1.8 jtc # which sets?
69 1.8 jtc THESETS="$UPGRSETS"
70 1.8 jtc
71 1.9 pk # Files that moved between 1.2 and 1.3
72 1.13 pk RELOCATED_FILES_13="${RELOCATED_FILES_13} /sbin/dumpfs /usr/sbin/dumpfs"
73 1.13 pk RELOCATED_FILES_13="${RELOCATED_FILES_13} /sbin/dumplfs /usr/sbin/dumplfs"
74 1.13 pk RELOCATED_FILES_13="${RELOCATED_FILES_13} /sbin/nfsd /usr/sbin/nfsd"
75 1.13 pk RELOCATED_FILES_13="${RELOCATED_FILES_13} /sbin/nfsiod /usr/sbin/nfsiod"
76 1.11 pk RELOCATED_FILES_13="${RELOCATED_FILES_13} /sbin/mountd /usr/sbin/mountd"
77 1.13 pk RELOCATED_FILES_13="${RELOCATED_FILES_13} /sbin/quotacheck /usr/sbin/quotacheck"
78 1.14 pk RELOCATED_FILES_13="${RELOCATED_FILES_13} /sbin/rtquery /usr/sbin/rtquery"
79 1.15 veego
80 1.15 veego # Files that moved between 1.3 and 1.4
81 1.15 veego RELOCATED_FILES_14="${RELOCATED_FILES_14} /usr/sbin/ipnat /sbin/ipnat"
82 1.9 pk
83 1.9 pk rm_relocated_files()
84 1.9 pk {
85 1.9 pk # ($n, $(n+1)): pairs of (old,new) locations of relocated files
86 1.9 pk while [ $# -ge 2 ]; do
87 1.9 pk if [ -f "$2" ]; then
88 1.9 pk echo Removing "$1";
89 1.9 pk rm -f "$1"
90 1.9 pk fi
91 1.9 pk shift 2
92 1.9 pk done
93 1.9 pk }
94 1.9 pk
95 1.1 pk # Good {morning,afternoon,evening,night}.
96 1.1 pk md_welcome_banner
97 1.1 pk echo -n "Proceed with upgrade? [n] "
98 1.1 pk getresp "n"
99 1.1 pk case "$resp" in
100 1.1 pk y*|Y*)
101 1.1 pk echo "Cool! Let's get to it..."
102 1.1 pk ;;
103 1.1 pk *)
104 1.1 pk md_not_going_to_install
105 1.1 pk exit
106 1.1 pk ;;
107 1.1 pk esac
108 1.1 pk
109 1.1 pk # Deal with terminal issues
110 1.1 pk md_set_term
111 1.1 pk
112 1.1 pk # XXX Work around vnode aliasing bug (thanks for the tip, Chris...)
113 1.1 pk ls -l /dev > /dev/null 2>&1
114 1.1 pk
115 1.8 jtc # Make sure we can write files (at least in /tmp)
116 1.8 jtc # This might make an MFS mount on /tmp, or it may
117 1.8 jtc # just re-mount the root with read-write enabled.
118 1.8 jtc md_makerootwritable
119 1.1 pk
120 1.1 pk while [ "X${ROOTDISK}" = "X" ]; do
121 1.1 pk getrootdisk
122 1.1 pk done
123 1.1 pk
124 1.1 pk # Assume partition 'a' of $ROOTDISK is for the root filesystem. Confirm
125 1.1 pk # this with the user. Check and mount the root filesystem.
126 1.1 pk resp="" # force one iteration
127 1.1 pk while [ "X${resp}" = "X" ]; do
128 1.1 pk echo -n "Root filesystem? [${ROOTDISK}a] "
129 1.1 pk getresp "${ROOTDISK}a"
130 1.1 pk _root_filesystem="/dev/`basename $resp`"
131 1.1 pk if [ ! -b ${_root_filesystem} ]; then
132 1.1 pk echo "Sorry, ${resp} is not a block device."
133 1.1 pk resp="" # force loop to repeat
134 1.1 pk fi
135 1.1 pk done
136 1.1 pk
137 1.1 pk echo "Checking root filesystem..."
138 1.1 pk if ! fsck -pf ${_root_filesystem}; then
139 1.1 pk echo "ERROR: can't check root filesystem!"
140 1.1 pk exit 1
141 1.1 pk fi
142 1.1 pk
143 1.1 pk echo "Mounting root filesystem..."
144 1.1 pk if ! mount -o ro ${_root_filesystem} /mnt; then
145 1.1 pk echo "ERROR: can't mount root filesystem!"
146 1.1 pk exit 1
147 1.1 pk fi
148 1.1 pk
149 1.1 pk # Grab the fstab so we can munge it for our own use.
150 1.1 pk if [ ! -f /mnt/etc/fstab ]; then
151 1.1 pk echo "ERROR: no /etc/fstab!"
152 1.1 pk exit 1
153 1.1 pk fi
154 1.1 pk
155 1.1 pk # Grab the hosts table so we can use it.
156 1.1 pk if [ ! -f /mnt/etc/hosts ]; then
157 1.1 pk echo "ERROR: no /etc/hosts!"
158 1.1 pk exit 1
159 1.1 pk fi
160 1.1 pk cp /mnt/etc/hosts /tmp/hosts
161 1.1 pk
162 1.1 pk # Start up the network in same/similar configuration as the installed system
163 1.1 pk # uses.
164 1.1 pk cat << \__network_config_1
165 1.1 pk
166 1.1 pk The upgrade program would now like to enable the network. It will use the
167 1.1 pk configuration already stored on the root filesystem. This is required
168 1.1 pk if you wish to use the network installation capabilities of this program.
169 1.1 pk
170 1.1 pk __network_config_1
171 1.1 pk echo -n "Enable network? [y] "
172 1.1 pk getresp "y"
173 1.1 pk case "$resp" in
174 1.1 pk y*|Y*)
175 1.1 pk if ! enable_network; then
176 1.1 pk echo "ERROR: can't enable network!"
177 1.1 pk exit 1
178 1.1 pk fi
179 1.1 pk
180 1.1 pk cat << \__network_config_2
181 1.1 pk
182 1.1 pk You will now be given the opportunity to escape to the command shell to
183 1.1 pk do any additional network configuration you may need. This may include
184 1.1 pk adding additional routes, if needed. In addition, you might take this
185 1.1 pk opportunity to redo the default route in the event that it failed above.
186 1.1 pk
187 1.1 pk __network_config_2
188 1.1 pk echo -n "Escape to shell? [n] "
189 1.1 pk getresp "n"
190 1.1 pk case "$resp" in
191 1.1 pk y*|Y*)
192 1.1 pk echo "Type 'exit' to return to upgrade."
193 1.1 pk sh
194 1.1 pk ;;
195 1.1 pk
196 1.1 pk *)
197 1.1 pk ;;
198 1.1 pk esac
199 1.1 pk ;;
200 1.1 pk *)
201 1.1 pk ;;
202 1.1 pk esac
203 1.1 pk
204 1.1 pk # Now that the network has been configured, it is safe to configure the
205 1.7 pk # fstab. We remove all but ufs/ffs.
206 1.1 pk (
207 1.7 pk > /tmp/fstab
208 1.4 pk while read _dev _mp _fstype _rest ; do
209 1.1 pk if [ "X${_fstype}" = X"ufs" -o \
210 1.7 pk "X${_fstype}" = X"ffs" ]; then
211 1.4 pk if [ "X${_fstype}" = X"ufs" ]; then
212 1.4 pk # Convert ufs to ffs.
213 1.4 pk _fstype=ffs
214 1.4 pk fi
215 1.7 pk echo "$_dev $_mp $_fstype $_rest" >> /tmp/fstab
216 1.1 pk fi
217 1.1 pk done
218 1.7 pk ) < /mnt/etc/fstab
219 1.1 pk
220 1.1 pk echo "The fstab is configured as follows:"
221 1.1 pk echo ""
222 1.1 pk cat /tmp/fstab
223 1.1 pk cat << \__fstab_config_1
224 1.1 pk
225 1.1 pk You may wish to edit the fstab. For example, you may need to resolve
226 1.1 pk dependencies in the order which the filesystems are mounted. Note that
227 1.1 pk this fstab is only for installation purposes, and will not be copied into
228 1.1 pk the root filesystem.
229 1.1 pk
230 1.1 pk __fstab_config_1
231 1.1 pk echo -n "Edit the fstab? [n] "
232 1.1 pk getresp "n"
233 1.1 pk case "$resp" in
234 1.1 pk y*|Y*)
235 1.3 leo ${EDITOR} /tmp/fstab
236 1.1 pk ;;
237 1.1 pk
238 1.1 pk *)
239 1.1 pk ;;
240 1.1 pk esac
241 1.1 pk
242 1.1 pk echo ""
243 1.1 pk munge_fstab /tmp/fstab /tmp/fstab.shadow
244 1.1 pk
245 1.1 pk if ! umount /mnt; then
246 1.1 pk echo "ERROR: can't unmount previously mounted root!"
247 1.1 pk exit 1
248 1.1 pk fi
249 1.1 pk
250 1.1 pk # Check all of the filesystems.
251 1.1 pk check_fs /tmp/fstab.shadow
252 1.1 pk
253 1.1 pk # Mount filesystems.
254 1.1 pk mount_fs /tmp/fstab.shadow
255 1.1 pk
256 1.6 pk echo -n "Are the upgrade sets on one of your normally mounted (local) filesystems? [y] "
257 1.3 leo getresp "y"
258 1.3 leo case "$resp" in
259 1.3 leo y*|Y*)
260 1.6 pk get_localdir /mnt
261 1.3 leo ;;
262 1.3 leo *)
263 1.3 leo ;;
264 1.3 leo esac
265 1.3 leo
266 1.1 pk # Install sets.
267 1.6 pk install_sets
268 1.9 pk
269 1.9 pk # Remove files that have just been installed in a new location
270 1.9 pk # from the old location
271 1.9 pk rm_relocated_files `eval echo \\$RELOCATED_FILES_${VERSION}`
272 1.1 pk
273 1.1 pk # Get timezone info
274 1.1 pk get_timezone
275 1.1 pk
276 1.1 pk # Fix up the fstab.
277 1.1 pk echo -n "Converting ufs to ffs in /etc/fstab..."
278 1.4 pk (
279 1.4 pk > /tmp/fstab
280 1.4 pk while read _dev _mp _fstype _rest ; do
281 1.7 pk if [ "X${_fstype}" = X"ufs" ]; then
282 1.7 pk # Convert ufs to ffs.
283 1.7 pk _fstype=ffs
284 1.4 pk fi
285 1.7 pk echo "$_dev $_mp $_fstype $_rest" >> /tmp/fstab
286 1.4 pk done
287 1.4 pk ) < /mnt/etc/fstab
288 1.1 pk echo "done."
289 1.1 pk echo -n "Would you like to edit the resulting fstab? [y] "
290 1.1 pk getresp "y"
291 1.1 pk case "$resp" in
292 1.1 pk y*|Y*)
293 1.3 leo ${EDITOR} /tmp/fstab
294 1.1 pk ;;
295 1.1 pk
296 1.1 pk *)
297 1.1 pk ;;
298 1.1 pk esac
299 1.1 pk
300 1.1 pk # Copy in configuration information and make devices in target root.
301 1.1 pk (
302 1.1 pk cd /tmp
303 1.1 pk for file in fstab; do
304 1.1 pk if [ -f $file ]; then
305 1.1 pk echo -n "Copying $file..."
306 1.1 pk cp $file /mnt/etc/$file
307 1.1 pk echo "done."
308 1.1 pk fi
309 1.1 pk done
310 1.1 pk
311 1.1 pk echo -n "Installing timezone link..."
312 1.1 pk rm -f /mnt/etc/localtime
313 1.1 pk ln -s /usr/share/zoneinfo/$TZ /mnt/etc/localtime
314 1.1 pk echo "done."
315 1.1 pk
316 1.1 pk echo -n "Making devices..."
317 1.6 pk _pid=`twiddle`
318 1.1 pk cd /mnt/dev
319 1.1 pk sh MAKEDEV all
320 1.6 pk kill $_pid
321 1.1 pk echo "done."
322 1.1 pk
323 1.3 leo md_copy_kernel
324 1.1 pk
325 1.1 pk md_installboot ${ROOTDISK}
326 1.1 pk )
327 1.1 pk
328 1.1 pk unmount_fs /tmp/fstab.shadow
329 1.1 pk
330 1.1 pk # Pat on the back.
331 1.1 pk md_congrats
332 1.1 pk
333 1.1 pk # ALL DONE!
334 1.1 pk exit 0
335