Subject: Re: kernel install target (was: CVS commit: syssrc/sys/conf)
To: None <source-changes@netbsd.org>
From: Greg A. Woods <woods@weird.com>
List: tech-kern
Date: 12/08/2001 22:53:01
On Sat, Dec 08, 2001 at 08:54:08PM -0500, Perry E. Metzger wrote:
> 
> A bad idea. You can easily nuke your running kernel that way by
> accident. We don't have that functionality by intent. The mechanisms
> for picking up kernels for snapshots don't need it anyway.

Note the install target does preserve what it no doubt assumes is the
running kernel, though not in a way I would do it.  The current install
target does not rename the current kernel image to a name commonly
loaded as a backup by most boot programs, and it does not install the
new kernel in a way that makes it easier to preserve a series of kernels
(i.e. multiple installs between reboots would still trash the running
kernel's load image).

I would suggest something more along these lines:

install-kernel-${MACHINE_NAME}:
	if [ ! -f /netbsd.old ] ; then mv /netbsd /netbsd.old; fi
	newkern=netbsd-$$(sh $S/conf/osrelease.sh)-$$(basename $$(pwd))-$$(date '+%Y%m%d%H%M')-$$(cat version); \
	echo "install -c -m 444 -o root -g wheel netbsd /$$newkern";	\
	install -c -m 444 -o root -g wheel netbsd /$$newkern;		\
	rm -f /netbsd;							\
	echo "ln /$$newkern /netbsd";					\
	ln /$$newkern /netbsd

(that's the absolute minimum info I'd put in the filename, BTW!)

And then perhaps have a script in /etc/rc.d that renames /netbsd.old to
/netbsd.last (clobbering any previous /netbsd.last unconditionally) as
the last step in a successful multi-user boot.  Cleaning of old kernel
image files should probably only be done by hand, though in theory the
ones older than /netbsd.last and any between /netbsd.last and
/netbsd.old are usually no longer useful.

This way the last booted kernel is always linked to /netbsd.old until a
new one boots and successfully "goes live", and if you have to back down
to a previously stable kernel it should always be the one linked to
/netbsd.last.

The above is essentially what I usually do now, by hand.  Having the
default kernel install target work this way would be nice, and I guess I
could always override in /etc/mk.conf, but that seems to result in some
nasty warnings for reasons I can't quite figure out at the moment:

$ make -n install
make: "/work/woods/NetBSD-src/sys/arch/i386/compile/PROVEN/Makefile" line 683: warning: duplicate script for target "install-kernel-proven" ignored
make: "/etc/mk.conf" line 65: warning: using previous script for "install-kernel-proven" defined here
make: "/work/woods/NetBSD-src/sys/arch/i386/compile/PROVEN/Makefile" line 684: warning: duplicate script for target "install-kernel-proven" ignored
make: "/etc/mk.conf" line 65: warning: using previous script for "install-kernel-proven" defined here
make: "/work/woods/NetBSD-src/sys/arch/i386/compile/PROVEN/Makefile" line 685: warning: duplicate script for target "install-kernel-proven" ignored
make: "/etc/mk.conf" line 65: warning: using previous script for "install-kernel-proven" defined here
make: "/work/woods/NetBSD-src/sys/arch/i386/compile/PROVEN/Makefile" line 686: warning: duplicate script for target "install-kernel-proven" ignored
make: "/etc/mk.conf" line 65: warning: using previous script for "install-kernel-proven" defined here
if [ ! -f /netbsd.old ] ; then mv /netbsd /netbsd.old; fi
newkern=netbsd-$(sh ../../../../conf/osrelease.sh)-$(basename $(pwd))-$(date '+%Y%m%d%H%M')-$(cat version);  echo "install -c -m 444 -o root -g wheel netbsd /$newkern";  install -c -m 444 -o root -g wheel netbsd /$newkern;  rm -f /netbsd;  echo "ln /$newkern /netbsd";  ln /$newkern /netbsd

There's always the source that could be modified too....

-- 
								Greg A. Woods

+1 416 218-0098;  <gwoods@acm.org>;  <g.a.woods@ieee.org>;  <woods@robohack.ca>
Planix, Inc. <woods@planix.com>; VE3TCP; Secrets of the Weird <woods@weird.com>