upgrade.sh revision 1.8 1 1.1 pk #!/bin/sh
2 1.8 jtc # $NetBSD: upgrade.sh,v 1.8 1996/10/09 00:13:36 jtc 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.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.1 pk # Good {morning,afternoon,evening,night}.
72 1.1 pk md_welcome_banner
73 1.1 pk echo -n "Proceed with upgrade? [n] "
74 1.1 pk getresp "n"
75 1.1 pk case "$resp" in
76 1.1 pk y*|Y*)
77 1.1 pk echo "Cool! Let's get to it..."
78 1.1 pk ;;
79 1.1 pk *)
80 1.1 pk md_not_going_to_install
81 1.1 pk exit
82 1.1 pk ;;
83 1.1 pk esac
84 1.1 pk
85 1.1 pk # Deal with terminal issues
86 1.1 pk md_set_term
87 1.1 pk
88 1.1 pk # XXX Work around vnode aliasing bug (thanks for the tip, Chris...)
89 1.1 pk ls -l /dev > /dev/null 2>&1
90 1.1 pk
91 1.8 jtc # Make sure we can write files (at least in /tmp)
92 1.8 jtc # This might make an MFS mount on /tmp, or it may
93 1.8 jtc # just re-mount the root with read-write enabled.
94 1.8 jtc md_makerootwritable
95 1.1 pk
96 1.1 pk while [ "X${ROOTDISK}" = "X" ]; do
97 1.1 pk getrootdisk
98 1.1 pk done
99 1.1 pk
100 1.1 pk # Assume partition 'a' of $ROOTDISK is for the root filesystem. Confirm
101 1.1 pk # this with the user. Check and mount the root filesystem.
102 1.1 pk resp="" # force one iteration
103 1.1 pk while [ "X${resp}" = "X" ]; do
104 1.1 pk echo -n "Root filesystem? [${ROOTDISK}a] "
105 1.1 pk getresp "${ROOTDISK}a"
106 1.1 pk _root_filesystem="/dev/`basename $resp`"
107 1.1 pk if [ ! -b ${_root_filesystem} ]; then
108 1.1 pk echo "Sorry, ${resp} is not a block device."
109 1.1 pk resp="" # force loop to repeat
110 1.1 pk fi
111 1.1 pk done
112 1.1 pk
113 1.1 pk echo "Checking root filesystem..."
114 1.1 pk if ! fsck -pf ${_root_filesystem}; then
115 1.1 pk echo "ERROR: can't check root filesystem!"
116 1.1 pk exit 1
117 1.1 pk fi
118 1.1 pk
119 1.1 pk echo "Mounting root filesystem..."
120 1.1 pk if ! mount -o ro ${_root_filesystem} /mnt; then
121 1.1 pk echo "ERROR: can't mount root filesystem!"
122 1.1 pk exit 1
123 1.1 pk fi
124 1.1 pk
125 1.1 pk # Grab the fstab so we can munge it for our own use.
126 1.1 pk if [ ! -f /mnt/etc/fstab ]; then
127 1.1 pk echo "ERROR: no /etc/fstab!"
128 1.1 pk exit 1
129 1.1 pk fi
130 1.1 pk
131 1.1 pk # Grab the hosts table so we can use it.
132 1.1 pk if [ ! -f /mnt/etc/hosts ]; then
133 1.1 pk echo "ERROR: no /etc/hosts!"
134 1.1 pk exit 1
135 1.1 pk fi
136 1.1 pk cp /mnt/etc/hosts /tmp/hosts
137 1.1 pk
138 1.1 pk # Start up the network in same/similar configuration as the installed system
139 1.1 pk # uses.
140 1.1 pk cat << \__network_config_1
141 1.1 pk
142 1.1 pk The upgrade program would now like to enable the network. It will use the
143 1.1 pk configuration already stored on the root filesystem. This is required
144 1.1 pk if you wish to use the network installation capabilities of this program.
145 1.1 pk
146 1.1 pk __network_config_1
147 1.1 pk echo -n "Enable network? [y] "
148 1.1 pk getresp "y"
149 1.1 pk case "$resp" in
150 1.1 pk y*|Y*)
151 1.1 pk if ! enable_network; then
152 1.1 pk echo "ERROR: can't enable network!"
153 1.1 pk exit 1
154 1.1 pk fi
155 1.1 pk
156 1.1 pk cat << \__network_config_2
157 1.1 pk
158 1.1 pk You will now be given the opportunity to escape to the command shell to
159 1.1 pk do any additional network configuration you may need. This may include
160 1.1 pk adding additional routes, if needed. In addition, you might take this
161 1.1 pk opportunity to redo the default route in the event that it failed above.
162 1.1 pk
163 1.1 pk __network_config_2
164 1.1 pk echo -n "Escape to shell? [n] "
165 1.1 pk getresp "n"
166 1.1 pk case "$resp" in
167 1.1 pk y*|Y*)
168 1.1 pk echo "Type 'exit' to return to upgrade."
169 1.1 pk sh
170 1.1 pk ;;
171 1.1 pk
172 1.1 pk *)
173 1.1 pk ;;
174 1.1 pk esac
175 1.1 pk ;;
176 1.1 pk *)
177 1.1 pk ;;
178 1.1 pk esac
179 1.1 pk
180 1.1 pk # Now that the network has been configured, it is safe to configure the
181 1.7 pk # fstab. We remove all but ufs/ffs.
182 1.1 pk (
183 1.7 pk > /tmp/fstab
184 1.4 pk while read _dev _mp _fstype _rest ; do
185 1.1 pk if [ "X${_fstype}" = X"ufs" -o \
186 1.7 pk "X${_fstype}" = X"ffs" ]; then
187 1.4 pk if [ "X${_fstype}" = X"ufs" ]; then
188 1.4 pk # Convert ufs to ffs.
189 1.4 pk _fstype=ffs
190 1.4 pk fi
191 1.7 pk echo "$_dev $_mp $_fstype $_rest" >> /tmp/fstab
192 1.1 pk fi
193 1.1 pk done
194 1.7 pk ) < /mnt/etc/fstab
195 1.1 pk
196 1.1 pk echo "The fstab is configured as follows:"
197 1.1 pk echo ""
198 1.1 pk cat /tmp/fstab
199 1.1 pk cat << \__fstab_config_1
200 1.1 pk
201 1.1 pk You may wish to edit the fstab. For example, you may need to resolve
202 1.1 pk dependencies in the order which the filesystems are mounted. Note that
203 1.1 pk this fstab is only for installation purposes, and will not be copied into
204 1.1 pk the root filesystem.
205 1.1 pk
206 1.1 pk __fstab_config_1
207 1.1 pk echo -n "Edit the fstab? [n] "
208 1.1 pk getresp "n"
209 1.1 pk case "$resp" in
210 1.1 pk y*|Y*)
211 1.3 leo ${EDITOR} /tmp/fstab
212 1.1 pk ;;
213 1.1 pk
214 1.1 pk *)
215 1.1 pk ;;
216 1.1 pk esac
217 1.1 pk
218 1.1 pk echo ""
219 1.1 pk munge_fstab /tmp/fstab /tmp/fstab.shadow
220 1.1 pk
221 1.1 pk if ! umount /mnt; then
222 1.1 pk echo "ERROR: can't unmount previously mounted root!"
223 1.1 pk exit 1
224 1.1 pk fi
225 1.1 pk
226 1.1 pk # Check all of the filesystems.
227 1.1 pk check_fs /tmp/fstab.shadow
228 1.1 pk
229 1.1 pk # Mount filesystems.
230 1.1 pk mount_fs /tmp/fstab.shadow
231 1.1 pk
232 1.6 pk echo -n "Are the upgrade sets on one of your normally mounted (local) filesystems? [y] "
233 1.3 leo getresp "y"
234 1.3 leo case "$resp" in
235 1.3 leo y*|Y*)
236 1.6 pk get_localdir /mnt
237 1.3 leo ;;
238 1.3 leo *)
239 1.3 leo ;;
240 1.3 leo esac
241 1.3 leo
242 1.1 pk # Install sets.
243 1.6 pk install_sets
244 1.1 pk
245 1.1 pk # Get timezone info
246 1.1 pk get_timezone
247 1.1 pk
248 1.1 pk # Fix up the fstab.
249 1.1 pk echo -n "Converting ufs to ffs in /etc/fstab..."
250 1.4 pk (
251 1.4 pk > /tmp/fstab
252 1.4 pk while read _dev _mp _fstype _rest ; do
253 1.7 pk if [ "X${_fstype}" = X"ufs" ]; then
254 1.7 pk # Convert ufs to ffs.
255 1.7 pk _fstype=ffs
256 1.4 pk fi
257 1.7 pk echo "$_dev $_mp $_fstype $_rest" >> /tmp/fstab
258 1.4 pk done
259 1.4 pk ) < /mnt/etc/fstab
260 1.1 pk echo "done."
261 1.1 pk echo -n "Would you like to edit the resulting fstab? [y] "
262 1.1 pk getresp "y"
263 1.1 pk case "$resp" in
264 1.1 pk y*|Y*)
265 1.3 leo ${EDITOR} /tmp/fstab
266 1.1 pk ;;
267 1.1 pk
268 1.1 pk *)
269 1.1 pk ;;
270 1.1 pk esac
271 1.1 pk
272 1.1 pk # Copy in configuration information and make devices in target root.
273 1.1 pk (
274 1.1 pk cd /tmp
275 1.1 pk for file in fstab; do
276 1.1 pk if [ -f $file ]; then
277 1.1 pk echo -n "Copying $file..."
278 1.1 pk cp $file /mnt/etc/$file
279 1.1 pk echo "done."
280 1.1 pk fi
281 1.1 pk done
282 1.1 pk
283 1.1 pk echo -n "Installing timezone link..."
284 1.1 pk rm -f /mnt/etc/localtime
285 1.1 pk ln -s /usr/share/zoneinfo/$TZ /mnt/etc/localtime
286 1.1 pk echo "done."
287 1.1 pk
288 1.1 pk echo -n "Making devices..."
289 1.6 pk _pid=`twiddle`
290 1.1 pk cd /mnt/dev
291 1.1 pk sh MAKEDEV all
292 1.6 pk kill $_pid
293 1.1 pk echo "done."
294 1.1 pk
295 1.3 leo md_copy_kernel
296 1.1 pk
297 1.1 pk md_installboot ${ROOTDISK}
298 1.1 pk )
299 1.1 pk
300 1.1 pk unmount_fs /tmp/fstab.shadow
301 1.1 pk
302 1.1 pk # Pat on the back.
303 1.1 pk md_congrats
304 1.1 pk
305 1.1 pk # ALL DONE!
306 1.1 pk exit 0
307