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