When systemd is started, it sets the system clock to epoch to ensure the
system clock is reasonably initialized if no working RTC.
As init process, systemd sets epoch very early to the more recent
timestamp of[1]:
- the build time of systemd (-Dtime-epoch)
- the modification time ("mtime") of /var/lib/systemd/timesync/clock
(systemd-timesyncd)
- the modification time ("mtime") of /usr/lib/clock-epoch (systemd)
The first epoch timestamp is hard-coded at build-time by the systemd
recipe (using either SOURCE_DATE_EPOCH, git-tag, or NEWS modification
time[2]).
The second epoch timestamp is maintained at run-time if the system runs
systemd-timesyncd.
This implements the third epoch timestamp at image build-time, by
touching the timestamp file /usr/lib/clock-epoch from the package
post-install script.
[1]:
https://github.com/systemd/systemd/commit/863098fdc9cd91e4f760085356ac02c4b7ba6df1
[2]: https://github.com/systemd/systemd/blob/v256/meson.build#L804-L825
Signed-off-by: Gaël PORTAY <[email protected]>
---
Hello,
With this patch, one can have a better sane default time set by systemd
very very very early in the boot (i.e. even before systemd outputs its
version!).
# dmesg
(...)
[ 3.347641] Run /sbin/init as init process
[ 3.350435] with arguments:
[ 3.350440] /sbin/init
[ 3.350443] with environment:
[ 3.350447] HOME=/
[ 3.350451] TERM=linux
[ 3.431275] EXT4-fs (mmcblk2p2): re-mounted. Opts: (null)
[ 3.523997] EXT4-fs (mmcblk2p4): recovery complete
[ 3.527828] EXT4-fs (mmcblk2p4): mounted filesystem with ordered
data mode. Opts: (null)
[ 3.694440] systemd[1]: System time before build time, advancing
clock.
[ 3.714755] systemd[1]: systemd 250.5+ running in system mode (+PAM
-AUDIT -SELINUX -APPARMOR +IMA -SMACK -SECCOMP -GCRYPT -GNUTLS +OPENSSL +ACL
+BLKID -CURL -ELFUTILS -FIDO2 -IDN2 -IDN -IPTC +KMOD -LIBCRYPTSETUP +LIBFDISK
-PCRE2 -PWQUALITY -P11KIT -QRENCODE -BZIP2 -LZ4 -XZ -ZLIB +ZSTD -BPF_FRAMEWORK
-XKBCOMMON +UTMP +SYSVINIT default-hierarchy=hybrid)
Thus, one can do time-based related things offline or before the system
clock is set by the network (if trusting the time does not matter that
much for sure).
This happens if the system has no hardware clock or if it is way too far
in the past and if using an old versions of systemd; systemd v250.5 sets
the system time to April 28, 2022 5:53:22 PM (1651168402).
Also, please set REPRODUCIBLE_TIMESTAMP_ROOTFS to any appropriate value
if enabling reproducible-builds (the default). Otherwise, bitbake sets
the timestamp to Friday, March 9, 2018 12:34:56 PM (1520598896, i.e.
REPRODUCIBLE_TIMESTAMP_ROOTFS[1]).
**Important**: It works on scarthgap and kirkstone; "all" image files
are timestamped to Tuesday, April 5, 2011 11:00:00 PM (1302044400, i.e.
SOURCE_DATE_EPOCH_FALLBACK[2]) on master branch; that branch appears to
not use REPRODUCIBLE_TIMESTAMP_ROOTFS anymore. Therefore, an update of
the SOURCE_DATE_EPOCH_FALLBACK value should work (I guess).
root@qemux86-64:~# stat /usr/lib/clock-epoch /etc/timestamp
File: /usr/lib/clock-epoch
Size: 0 Blocks: 0 IO Block: 1024 regular
empty file
Device: fd00h/64768d Inode: 837 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2011-04-05 23:00:00.000000000 +0000
Modify: 2011-04-05 23:00:00.000000000 +0000
Change: 2011-04-05 23:00:00.000000000 +0000
File: /etc/timestamp
Size: 15 Blocks: 2 IO Block: 1024 regular file
Device: fd00h/64768d Inode: 510 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2011-04-05 23:00:00.000000000 +0000
Modify: 2011-04-05 23:00:00.000000000 +0000
Change: 2011-04-05 23:00:00.000000000 +0000
SOURCE_DATE_EPOCH_FALLBACK ??= "1302044400"
Supports Unix timestamps in seconds, milliseconds, microseconds and
nanoseconds.
Assuming that this timestamp is in seconds:
GMT: Tuesday, April 5, 2011 11:00:00 PM
Your time zone: Wednesday, April 6, 2011 1:00:00 AM GMT+02:00 DST
Relative: 14 years ago
[1]:
https://git.openembedded.org/openembedded-core/tree/meta/conf/bitbake.conf#n689
[2]:
https://git.openembedded.org/openembedded-core/tree/meta/conf/bitbake.conf#n688
Changes since v1:
- use pkg_postinst() to touch file /usr/lib/clock-epoch instead of the
rootfs post-command rootfs_systemd_timestamp()
Note: v1 is titled "classes: rootfs-postcommands: set better sane time
to systemd"
https://patchwork.yoctoproject.org/project/oe-core/patch/[email protected]/
Kind Regards,
Gaël
meta/recipes-core/systemd/systemd_256.6.bb | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/meta/recipes-core/systemd/systemd_256.6.bb
b/meta/recipes-core/systemd/systemd_256.6.bb
index 68f15ab065..f288bedc9e 100644
--- a/meta/recipes-core/systemd/systemd_256.6.bb
+++ b/meta/recipes-core/systemd/systemd_256.6.bb
@@ -867,6 +867,10 @@ ALTERNATIVE_TARGET[runlevel] = "${base_bindir}/systemctl"
ALTERNATIVE_LINK_NAME[runlevel] = "${base_sbindir}/runlevel"
ALTERNATIVE_PRIORITY[runlevel] ?= "300"
+pkg_postinst:${PN}:append () {
+ touch $D${libdir}/clock-epoch
+}
+
pkg_postinst:${PN}:libc-glibc () {
if ${@bb.utils.contains('PACKAGECONFIG', 'myhostname', 'true', 'false',
d)}; then
sed -e '/^hosts:/s/\s*\<myhostname\>//' \
--
2.47.0
-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#207061):
https://lists.openembedded.org/g/openembedded-core/message/207061
Mute This Topic: https://lists.openembedded.org/mt/109541328/21656
Group Owner: [email protected]
Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub
[[email protected]]
-=-=-=-=-=-=-=-=-=-=-=-