install.md revision 1.33 1 1.33 tsutsui # $NetBSD: install.md,v 1.33 2021/06/26 00:28:19 tsutsui Exp $
2 1.1 is #
3 1.1 is #
4 1.25 is # Copyright (c) 1996,2006 The NetBSD Foundation, Inc.
5 1.1 is # All rights reserved.
6 1.1 is #
7 1.1 is # This code is derived from software contributed to The NetBSD Foundation
8 1.1 is # by Jason R. Thorpe.
9 1.1 is #
10 1.1 is # Redistribution and use in source and binary forms, with or without
11 1.1 is # modification, are permitted provided that the following conditions
12 1.1 is # are met:
13 1.1 is # 1. Redistributions of source code must retain the above copyright
14 1.1 is # notice, this list of conditions and the following disclaimer.
15 1.1 is # 2. Redistributions in binary form must reproduce the above copyright
16 1.1 is # notice, this list of conditions and the following disclaimer in the
17 1.1 is # documentation and/or other materials provided with the distribution.
18 1.1 is #
19 1.1 is # THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20 1.1 is # ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 1.1 is # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 1.3 jtc # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 1.3 jtc # BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 1.1 is # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 1.1 is # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 1.1 is # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 1.1 is # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 1.1 is # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 1.1 is # POSSIBILITY OF SUCH DAMAGE.
30 1.1 is #
31 1.1 is
32 1.1 is #
33 1.1 is # machine dependent section of installation/upgrade script.
34 1.1 is #
35 1.1 is
36 1.1 is # Machine-dependent install sets
37 1.24 mhitch MDSETS="kern-GENERIC xbase xcomp xetc xfont xserver"
38 1.1 is
39 1.1 is md_set_term() {
40 1.1 is if [ ! -z "$TERM" ]; then
41 1.1 is return
42 1.1 is fi
43 1.1 is echo -n "Specify terminal type [vt220]: "
44 1.1 is getresp "vt220"
45 1.1 is TERM="$resp"
46 1.1 is export TERM
47 1.1 is }
48 1.1 is
49 1.1 is md_makerootwritable() {
50 1.1 is # Mount root rw for convenience of the tester ;-)
51 1.21 is if ! cp /dev/null /tmp/.root_writable >/dev/null 2>&1; then
52 1.30 christos mi_mount_kernfs
53 1.15 is mount -t ffs -u /kern/rootdev / > /dev/null 2>&1
54 1.1 is fi
55 1.1 is }
56 1.1 is
57 1.1 is md_get_diskdevs() {
58 1.1 is # return available disk devices
59 1.30 christos mi_mount_kernfs
60 1.30 christos mi_filter_msgbuf | sed -ne '/^[sw]d[0-9] /s/ .*//p'
61 1.1 is }
62 1.1 is
63 1.1 is md_get_cddevs() {
64 1.1 is # return available CDROM devices
65 1.30 christos mi_mount_kernfs
66 1.30 christos mi_filter_msgbuf | sed -ne '/^cd[0-9] /s/ .*//p'
67 1.1 is }
68 1.1 is
69 1.1 is md_get_partition_range() {
70 1.1 is # return an expression describing the valid partition id's
71 1.1 is echo '[a-p]'
72 1.1 is }
73 1.1 is
74 1.1 is md_installboot() {
75 1.22 mhitch if [ -x /mnt/usr/sbin/installboot ]; then
76 1.1 is echo -n "Should a boot block be installed? [y] "
77 1.1 is getresp "y"
78 1.1 is case "$resp" in
79 1.1 is y*|Y*)
80 1.28 mlelstv echo -n "Boot command? [netbsd -ASn2] "
81 1.28 mlelstv getresp "netbsd -ASn2"
82 1.1 is echo "Installing boot block..."
83 1.32 rin chroot /mnt /usr/sbin/installboot -o command="$resp" /dev/r${1}a /usr/mdec/bootxx_ffsv1
84 1.18 mhitch cp -p /mnt/usr/mdec/boot.amiga /mnt/
85 1.1 is ;;
86 1.1 is *)
87 1.13 is echo "No bootblock installed."
88 1.1 is ;;
89 1.1 is esac
90 1.1 is elif [ "$MODE" = "install" ]; then
91 1.1 is cat << \__md_installboot_1
92 1.1 is There is no installboot program found on the installed filesystems. No boot
93 1.1 is programs are installed.
94 1.1 is __md_installboot_1
95 1.1 is else
96 1.1 is cat << \__md_installboot_2
97 1.1 is There is no installboot program found on the upgraded filesystems. No boot
98 1.1 is programs are installed.
99 1.1 is __md_installboot_2
100 1.1 is fi
101 1.1 is }
102 1.1 is
103 1.1 is md_native_fstype() {
104 1.1 is echo "ados"
105 1.1 is }
106 1.1 is
107 1.1 is md_native_fsopts() {
108 1.6 veego echo "ro"
109 1.1 is }
110 1.1 is
111 1.1 is md_prep_disklabel() {
112 1.25 is }
113 1.25 is
114 1.25 is md_view_labels_possible=1
115 1.25 is md_view_labels() {
116 1.29 christos _DKDEVS=$(md_get_diskdevs)
117 1.9 is echo "If you like, you can now examine the labels of your disks."
118 1.9 is echo ""
119 1.9 is echo -n "Available are "${_DKDEVS}". Look at which? [skip this step] "
120 1.11 is getresp "done"
121 1.29 christos while [ "${resp:-done}" != "done" ]; do
122 1.9 is echo ""
123 1.9 is disklabel ${resp}
124 1.9 is echo ""
125 1.9 is echo -n "Available are "${_DKDEVS}". Look at which? [done] "
126 1.11 is getresp "done"
127 1.9 is done
128 1.10 is cat << \__prep_disklabel_1
129 1.10 is
130 1.10 is As a reminder: the 'c' partition is assigned to the whole disk and can't
131 1.10 is normally be used for a any file system!
132 1.10 is
133 1.10 is __prep_disklabel_1
134 1.1 is }
135 1.1 is
136 1.1 is md_labeldisk() {
137 1.1 is }
138 1.1 is
139 1.1 is md_welcome_banner() {
140 1.1 is if [ "$MODE" = "install" ]; then
141 1.1 is echo ""
142 1.31 tsutsui echo "Welcome to the NetBSD/${MACHINE} ${RELEASE} installation program."
143 1.1 is cat << \__welcome_banner_1
144 1.1 is
145 1.1 is This program is designed to help you put NetBSD on your disk,
146 1.1 is in a simple and rational way. You'll be asked several questions,
147 1.1 is and it would probably be useful to have your disk's hardware
148 1.1 is manual, the installation notes, and a calculator handy.
149 1.1 is __welcome_banner_1
150 1.1 is
151 1.1 is else
152 1.1 is echo ""
153 1.31 tsutsui echo "Welcome to the NetBSD/${MACHINE} ${RELEASE} upgrade program."
154 1.1 is cat << \__welcome_banner_2
155 1.1 is
156 1.1 is This program is designed to help you upgrade your NetBSD system in a
157 1.1 is simple and rational way.
158 1.1 is
159 1.29 christos As a reminder, installing the 'etc' binary set is NOT recommended.
160 1.1 is Once the rest of your system has been upgraded, you should manually
161 1.29 christos merge any changes to files in the 'etc' set into those files which
162 1.1 is already exist on your system.
163 1.1 is __welcome_banner_2
164 1.1 is fi
165 1.1 is
166 1.1 is cat << \__welcome_banner_3
167 1.1 is
168 1.1 is As with anything which modifies your disk's contents, this
169 1.1 is program can cause SIGNIFICANT data loss, and you are advised
170 1.1 is to make sure your data is backed up before beginning the
171 1.1 is installation process.
172 1.1 is
173 1.1 is Default answers are displayed in brackets after the questions.
174 1.1 is You can hit Control-C at any time to quit, but if you do so at a
175 1.1 is prompt, you may have to hit return. Also, quitting in the middle of
176 1.1 is installation may leave your system in an inconsistent state.
177 1.1 is
178 1.1 is __welcome_banner_3
179 1.1 is }
180 1.1 is
181 1.1 is md_not_going_to_install() {
182 1.1 is cat << \__not_going_to_install_1
183 1.1 is
184 1.29 christos OK, then. Enter 'halt' at the prompt to halt the machine. Once the
185 1.1 is machine has halted, power-cycle the system to load new boot code.
186 1.1 is
187 1.1 is Note: If you wish to have another try. Just type '^D' at the prompt. After
188 1.1 is a moment, the installer will restart itself.
189 1.1 is
190 1.1 is __not_going_to_install_1
191 1.1 is }
192 1.1 is
193 1.1 is md_congrats() {
194 1.1 is local what;
195 1.1 is if [ "$MODE" = "install" ]; then
196 1.1 is what="installed";
197 1.1 is else
198 1.1 is what="upgraded";
199 1.1 is fi
200 1.1 is cat << __congratulations_1
201 1.1 is
202 1.1 is CONGRATULATIONS! You have successfully $what NetBSD!
203 1.1 is To boot the installed system, enter halt at the command prompt. Once the
204 1.1 is system has halted, reset the machine and boot from the disk.
205 1.1 is
206 1.1 is Note: If you wish to have another try. Just type '^D' at the prompt. After
207 1.1 is a moment, the installer will restart itself.
208 1.1 is
209 1.1 is __congratulations_1
210 1.1 is }
211 1.1 is
212 1.1 is md_copy_kernel() {
213 1.1 is # This is largely a copy of install_disk and install_from_mounted_fs()
214 1.1 is # with some special frobbing.
215 1.1 is
216 1.1 is local _directory
217 1.1 is local _sets
218 1.1 is local _filename
219 1.1 is local _f
220 1.7 is
221 1.7 is if [ "$MODE" = "install" ]; then
222 1.7 is echo -n "Adding keymap initialization to rc.local..."
223 1.7 is echo /usr/sbin/loadkmap ${__keymap__} >> /mnt/etc/rc.local
224 1.7 is echo "done."
225 1.7 is fi
226 1.1 is
227 1.1 is if [ -e /netbsd ]; then
228 1.14 is if [ -e /mnt/netbsd ]; then
229 1.14 is echo "On the installation filesystem there is this kernel: "
230 1.14 is ls -l /netbsd
231 1.14 is echo "The already installed kernel is: "
232 1.14 is ls -l /mnt/netbsd
233 1.14 is echo "Do you want to replace the already installed kernel by the kernel"
234 1.14 is echo -n "on the installation filesystem? (y/n) [n] "
235 1.14 is resp="n"
236 1.14 is getresp ""
237 1.29 christos if [ "${resp}" != "y" ] && [ "${resp}" != "Y" ]; then
238 1.14 is return
239 1.14 is fi
240 1.14 is fi
241 1.14 is
242 1.1 is echo -n "Copying kernel..."
243 1.1 is cp -p /netbsd /mnt/netbsd
244 1.1 is echo "done."
245 1.1 is return
246 1.1 is fi
247 1.1 is
248 1.1 is cat << \__md_copy_kernel_1
249 1.1 is Your installation set did not include a netbsd kernel on the installation
250 1.1 is filesystem. You are now given the opportunity install it from either the
251 1.1 is kernel-floppy from the distribution or another location on one of your disks.
252 1.1 is
253 1.1 is The following disk devices are installed on your system; please select
254 1.1 is the disk device containing the partition with the netbsd kernel:
255 1.1 is __md_copy_kernel_1
256 1.1 is
257 1.29 christos _DKDEVS=$(md_get_diskdevs)
258 1.1 is echo "$_DKDEVS"
259 1.1 is echo "fd0"
260 1.1 is echo ""
261 1.1 is _DKDEVS="$_DKDEVS fd0" # Might be on the kernel floppy!
262 1.1 is echo -n "Which is the disk with the kernel? [abort] "
263 1.1 is
264 1.1 is if mount_a_disk ; then
265 1.1 is return # couldn't mount the disk
266 1.1 is fi
267 1.1 is
268 1.1 is # Get the directory where the file lives
269 1.1 is resp="" # force one iteration
270 1.29 christos while [ -z "${resp}" ]; do
271 1.1 is echo "Enter the directory relative to the mount point that"
272 1.1 is echo -n "contains the file. [${_directory}] "
273 1.1 is getresp "${_directory}"
274 1.1 is done
275 1.1 is _directory=$resp
276 1.1 is
277 1.29 christos _sets=$(cd /mnt2/$_directory; ls netbsd* 2> /dev/null)
278 1.1 is if [ -z "$_sets" ]; then
279 1.1 is echo "There are no NetBSD kernels available in \"$1\""
280 1.1 is umount -f /mnt2 > /dev/null 2>&1
281 1.1 is return
282 1.1 is fi
283 1.1 is while : ; do
284 1.1 is echo "The following kernels are available:"
285 1.1 is echo ""
286 1.1 is
287 1.1 is for _f in $_sets ; do
288 1.1 is echo " $_f"
289 1.1 is done
290 1.1 is echo ""
291 1.1 is set -- $_sets
292 1.1 is echo -n "File name [$1]? "
293 1.1 is getresp "$1"
294 1.1 is _f=$resp
295 1.1 is _filename="/mnt2/$_directory/$_f"
296 1.1 is
297 1.1 is # Ensure file exists
298 1.1 is if [ ! -f $_filename ]; then
299 1.1 is echo "File $_filename does not exist. Check to make"
300 1.1 is echo "sure you entered the information properly."
301 1.1 is echo -n "Do you want to retry [y]? "
302 1.1 is getresp "y"
303 1.1 is if [ "$resp" = "n" ]; then
304 1.1 is break
305 1.1 is fi
306 1.1 is continue
307 1.1 is fi
308 1.1 is
309 1.1 is # Copy the kernel
310 1.1 is cp $_filename /mnt
311 1.1 is break
312 1.1 is done
313 1.1 is umount -f /mnt2 > /dev/null 2>&1
314 1.1 is }
315 1.19 mhitch
316 1.19 mhitch md_lib_is_aout() {
317 1.19 mhitch local r
318 1.19 mhitch test -h $1 && return 1
319 1.19 mhitch test -f $1 || return 1
320 1.19 mhitch
321 1.29 christos [ "$(dd if=$1 bs=1 skip=1 count=3 2> /dev/null)" = "ELF" ] && return 1
322 1.19 mhitch return 0
323 1.19 mhitch }
324 1.19 mhitch
325 1.19 mhitch
326 1.19 mhitch md_mv_usr_lib() {
327 1.19 mhitch local root
328 1.19 mhitch root=$1
329 1.19 mhitch for f in $root/usr/lib/lib*.so.[0-9]*.[0-9]* ; do
330 1.19 mhitch md_lib_is_aout $f || continue
331 1.19 mhitch mv -f $f $root/emul/aout/usr/lib || return 1
332 1.19 mhitch done
333 1.19 mhitch return 0
334 1.19 mhitch }
335 1.19 mhitch
336 1.19 mhitch md_x_shlib_set_14=" \
337 1.19 mhitch libICE.so.6.3 \
338 1.19 mhitch libPEX5.so.6.0 \
339 1.19 mhitch libSM.so.6.0 \
340 1.19 mhitch libX11.so.6.1 \
341 1.19 mhitch libXIE.so.6.0 \
342 1.19 mhitch libXaw.so.6.1 \
343 1.19 mhitch libXext.so.6.3 \
344 1.19 mhitch libXi.so.6.0 \
345 1.19 mhitch libXmu.so.6.0 \
346 1.19 mhitch libXp.so.6.2 \
347 1.19 mhitch libXt.so.6.0 \
348 1.19 mhitch libXtst.so.6.1 \
349 1.19 mhitch liboldX.so.6.0"
350 1.19 mhitch
351 1.19 mhitch md_mv_x_lib() {
352 1.19 mhitch local root xlibdir
353 1.19 mhitch root=$1
354 1.19 mhitch xlibdir=$2
355 1.19 mhitch for f in $md_x_shlib_set_14; do
356 1.19 mhitch md_lib_is_aout $root/$xlibdir/$f || continue
357 1.19 mhitch mv -f $root/$xlibdir/$f $root/emul/aout/$xlibdir || return 1
358 1.19 mhitch done
359 1.19 mhitch return 0
360 1.19 mhitch }
361 1.19 mhitch
362 1.19 mhitch md_mv_aout_libs()
363 1.19 mhitch {
364 1.19 mhitch local root xlibdir
365 1.19 mhitch
366 1.19 mhitch root=/mnt # XXX - should be global
367 1.19 mhitch
368 1.19 mhitch if [ -d $root/emul/aout/. ]; then
369 1.19 mhitch echo "Using existing /emul/aout directory"
370 1.19 mhitch else
371 1.19 mhitch echo "Creating /emul/aout hierachy"
372 1.19 mhitch mkdir -p $root/usr/aout || return 1
373 1.19 mhitch
374 1.19 mhitch if [ ! -d $root/emul ]; then
375 1.19 mhitch mkdir $root/emul || return 1
376 1.19 mhitch fi
377 1.19 mhitch
378 1.19 mhitch if [ -h $root/emul/aout ]; then
379 1.19 mhitch echo "Preserving existing symbolic link from /emul/aout"
380 1.19 mhitch mv -f $root/emul/aout $root/emul/aout.old || return 1
381 1.19 mhitch fi
382 1.19 mhitch
383 1.19 mhitch ln -s ../usr/aout $root/emul/aout || return 1
384 1.19 mhitch fi
385 1.19 mhitch
386 1.19 mhitch # Create /emul/aout/etc and /emul/aout/usr/lib
387 1.19 mhitch if [ ! -d $root/emul/aout/etc ]; then
388 1.19 mhitch mkdir $root/emul/aout/etc || return 1
389 1.19 mhitch fi
390 1.19 mhitch if [ ! -d $root/emul/aout/usr/lib ]; then
391 1.19 mhitch mkdir -p $root/emul/aout/usr/lib || return 1
392 1.19 mhitch fi
393 1.19 mhitch
394 1.19 mhitch # Move ld.so.conf
395 1.19 mhitch if [ -f $root/etc/ld.so.conf ]; then
396 1.19 mhitch mv -f $root/etc/ld.so.conf $root/emul/aout/etc || return 1
397 1.19 mhitch fi
398 1.19 mhitch
399 1.19 mhitch # Finally, move the aout shared libraries from /usr/lib
400 1.19 mhitch md_mv_usr_lib $root || return 1
401 1.19 mhitch
402 1.19 mhitch # If X11 is installed, move the those libraries as well
403 1.19 mhitch xlibdir="/usr/X11R6/lib"
404 1.19 mhitch if [ -d $root/$xlibdir/. ]; then
405 1.19 mhitch mkdir -p $root/emul/aout/$xlibdir || return 1
406 1.19 mhitch md_mv_x_lib $root $xlibdir || return 1
407 1.19 mhitch fi
408 1.19 mhitch
409 1.19 mhitch echo "a.out emulation environment setup completed."
410 1.19 mhitch }
411 1.19 mhitch
412 1.19 mhitch md_prepare_upgrade()
413 1.19 mhitch {
414 1.19 mhitch cat << 'EOF'
415 1.19 mhitch This release uses the ELF binary object format. Existing (a.out) binaries
416 1.19 mhitch can still be used on your system after it has been upgraded, provided
417 1.19 mhitch that the shared libraries needed by those binaries are made available
418 1.19 mhitch in the filesystem hierarchy rooted at /emul/aout.
419 1.19 mhitch
420 1.19 mhitch This upgrade procedure will now establish this hierarchy by moving all
421 1.19 mhitch shared libraries in a.out format found in /usr/lib to /emul/aout/usr/lib.
422 1.19 mhitch It will also move the X11 shared libraries in a.out format from previous
423 1.22 mhitch NetBSD/amiga X11 installation sets, if they are installed.
424 1.19 mhitch
425 1.19 mhitch EOF
426 1.19 mhitch md_mv_aout_libs || {
427 1.19 mhitch echo "Failed to setup a.out emulation environment"
428 1.19 mhitch return 1
429 1.19 mhitch }
430 1.19 mhitch return 0
431 1.19 mhitch }
432 1.19 mhitch
433 1.19 mhitch # Flag to notify upgrade.sh of the existence of md_prepare_upgrade()
434 1.19 mhitch md_upgrade_prep_needed=1
435