Doing kexec reboot right in systemd
Simon Horman
horms at verge.net.au
Thu Mar 22 18:36:46 EDT 2012
On Thu, Mar 22, 2012 at 09:14:56PM +0200, Marti Raudsepp wrote:
> Hi list,
Hi Marti,
> I was recently pondering how systemd could use kexec "properly", in a
> reasonably general way, to make reboots faster. I exchanged an email
> with Poettering on the systemd list and he suggested me to ask here.
>
> My current proposal:
> 1. Include a template 'kexec-load.service' with kexec-tools, which
> distros/users could customize to load the right kernel and initrd via
> /sbin/kexec
>
> 2. If the user does 'systemctl enable kexec-load.service', then this
> service would trigger before every reboot. Loading the kernel any
> earlier would waste memory (5+14 MB on Ubuntu Server). Also a common
> reason for rebooting is to boot into a newly-installed kernel. Loading
> it any earlier would boot you into an older kernel.
>
> 3. During a reboot, after systemd has finished shutting down, it
> detects via /sys/kernel/kexec_loaded whether the kexec kernel is
> loaded. If 1, it performs a 'kexec -e'. If not, it does a normal
> reboot.
>
> ----
>
> Lennart commented on #2 that kexec might have problems finding
> contiguous memory to load the kernel into, this late in the lifecycle.
> Do you think this is a deal-breaker for such a feature? If it's rare
> enough, then it might not be a problem -- we can always fall back to a
> normal reboot.
In general kexec doesn't store the kernel in contiguous memory at load-time.
Rather, when kexec -e is called the kernel is copped from (most likely)
discontiguous pages) into its destination location.
> I'm also assuming that "kexec --load" will fail atomically -- that it
> won't try to boot a half-loaded kernel, or boot a kernel whose initrd
> failed to load.
Yes, that is correct.
However, I speculate that there is a greater chance of the boot of a
kexeced kernel failing than the same kernel booting by more conventional
means on the same hardware. Primarily because there are most likely
shutdown/boot paths, especially in drivers, that have not been well
exercised.
So while it may work well on some hardware, perhaps even most hardware, I
suspect there are cases where it will fail. I guess that is where
systemctl enable/disable kexec-load.service comes into play.
> Also, #3 doesn't yet work that way in systemd (currently it detects
> before shutdown) and Poettering hasn't agreed yet.
>
> Does this proposal seem sane to kexec folks? Did I miss anything?
If it is desirable to use kexec as a reboot mechanism then
from a kexec point of view I think your proposal makes sense.
More information about the kexec
mailing list