[systemd-devel] Right way to do kexec
Marti Raudsepp
marti at juffo.org
Wed Mar 21 03:24:30 PDT 2012
Hi,
I've been trying to figure out how to use systemd's kexec functionality right.
When one runs "systemctl kexec", systemd simply shuts down and
executes 'kexec -e'. For this to work, a kexec-able kernel has to be
already loaded.
Now, when do I load this kernel? Loading at startup means that I'm
simply wasting the memory most of the time when I'm not rebooting. And
if I upgrade the kernel, the old kernel sticks around in memory -- but
the point of rebooting is usually to load the *new* kernel?
So it probably should be done just before shutdown. I created a
'kexec-load.service' file with:
[Unit]
DefaultDependencies=no
Before=shutdown.target umount.target final.target
[Service]
Type=oneshot
ExecStart=/sbin/kexec --load /boot/vmlinuz-linux
--initrd=/boot/initramfs-linux.img --reuse-cmdline
And added 'Requires=kexec-load.service' to kexec.target
Now "systemctl kexec" works, so far so good!
Maybe we could add an empty kexec-load.service into systemd itself, so
distros and users just need to override its ExecStart to do what they
want and it would work automagically?
----
Next, we have a chicken-and-egg kind of problem. "systemctl reboot"
has logic like:
if (strstr(program_invocation_short_name, "reboot")) {
if (kexec_loaded())
arg_action = ACTION_KEXEC;
else
arg_action = ACTION_REBOOT;
}
Obviously the kexec kernel won't be loaded yet at this time, so
systemd won't actually do a kexec. Dunno what to do about this. Maybe
drop kexec.{service,target} entirely and do this checking at
reboot.service time? That would also deprecate the "systemctl kexec"
command.
Regards,
Marti
More information about the systemd-devel
mailing list