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