[systemd-devel] [PATCH] correctly mark system reboot

Lennart Poettering lennart at poettering.net
Thu Mar 3 07:20:23 PST 2011


On Thu, 03.03.11 09:14, Andrey Borzenkov (arvidjaar at gmail.com) wrote:

> 
> On Thu, Mar 3, 2011 at 7:51 AM, Andrey Borzenkov <arvidjaar at gmail.com> wrote:
> > On Thu, Mar 3, 2011 at 12:31 AM, Lennart Poettering
> > <lennart at poettering.net> wrote:
> >> On Wed, 02.03.11 11:41, Andrey Borzenkov (arvidjaar at gmail.com) wrote:
> >>
> >>> It is expected that system will put "reboot" in wtmp to mark
> >>> when it starts coming up. This is looked for by "who -b" and is
> >>> used by "last" to calculate correct time spent by various programs.
> >>> Add systemd-update-utmp-reboot.service which is started as soon
> >>> as possible after local-fs.target to mark reboot.
> >>
> >> Hmm, systemd-update-utmp-runlevel.service should normally do that
> >> implicitly. When /lib/systemd/systemd-update-utmp is called with the
> >> "runlevel" argument then it will add the "reboot" entry if necessary
> >> automatically, followed by the "runlevel" entry.
> >>
> >> Are you suggesting that this automatic logic isn't working correctly?
> >>
> >
> > On my notebook "reboot" line is never added. What is funny, it appears
> > that on my test VM which has stripped down installation "reboot" does
> > actually appear. Which suggests some race condition or uninitialized
> > variable somewhere.
> >
> 
> Well, the problem is, on my notebook it *does* find previous runlevel
> entry and so never triggers on_reboot:
> 
> Mar  3 09:00:47 cooker systemd-update-utmp[2481]: After utmpxname
> Mar  3 09:00:47 cooker systemd-update-utmp[2481]: Found runlevel/previouos: 0/0
> Mar  3 09:00:47 cooker systemd-update-utmp[2481]: Previous runlevel: 0
> Mar  3 09:00:47 cooker systemd-update-utmp[2481]: Current runlevel: 53
> Mar  3 09:00:47 cooker systemd-update-utmp[2481]: After utmpxname
> Mar  3 09:00:47 cooker systemd-update-utmp[2481]: Found runlevel/previouos: 0/0
> 
> Because it works on stripped down installation, it appears that some
> package puts this entry there on startup.
> 
> I really do not know how to find who is messing up with utmp; it may
> be anything. So it looks like one of
> 
> - use explicit unit for "reboot" (and remove current magic from on_runlevel).
> 
> - call on_reboot() if previous run-level found was 0.
> 
> Personally I find explicit unit to be better understandable and easier
> to debug than hiding some magic inside binary that no one is aware of.

Hmm, here's a guess: the code relies that utmp is emptied? Maybe this
doesn't happen on your system?

Normally systemd-update-utmp-runlevel.service is run after
systemd-tmpfiles-setup.service, but maybe this doesn't work on your system?

Lennart

-- 
Lennart Poettering - Red Hat, Inc.


More information about the systemd-devel mailing list