* [PATCH] classes: rootfs-postcommands: set better sane time to systemd
@ 2024-10-19 2:19 Gaël PORTAY
2024-10-21 10:25 ` [OE-core] " Alexander Kanavin
2024-10-23 2:40 ` ChenQi
0 siblings, 2 replies; 10+ messages in thread
From: Gaël PORTAY @ 2024-10-19 2:19 UTC (permalink / raw)
To: openembedded-core; +Cc: Gaël PORTAY
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 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, from a
newly introduced rootfs post-process command that is very similar to
update_timestamp.
It touches the file /usr/lib/clock-epoch with the modification time set
to either the current timestamp (now) or to a reproducible timestamp if
REPRODUCIBLE_TIMESTAMP_ROOTFS is set.
Note: That newly introduced rootfs post-process command is automatically
set if systemd is set in the distro features.
[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 <gael.portay+rtone@gmail.com>
---
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).
If you have a better idea on how to implement it, please tell; in the
meanwhile...
Kind Regards,
Gaël
meta/classes-recipe/rootfs-postcommands.bbclass | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
diff --git a/meta/classes-recipe/rootfs-postcommands.bbclass b/meta/classes-recipe/rootfs-postcommands.bbclass
index 5f4d67f93c..cc74c75cfa 100644
--- a/meta/classes-recipe/rootfs-postcommands.bbclass
+++ b/meta/classes-recipe/rootfs-postcommands.bbclass
@@ -22,6 +22,9 @@ ROOTFS_POSTPROCESS_COMMAND += '${@bb.utils.contains_any("IMAGE_FEATURES", [ 'deb
# Create /etc/timestamp during image construction to give a reasonably sane default time setting
ROOTFS_POSTPROCESS_COMMAND += "rootfs_update_timestamp "
+# Create /usr/lib/clock-epoch during image construction to give a reasonably sane default time setting to systemd
+ROOTFS_POSTPROCESS_COMMAND += '${@bb.utils.contains("DISTRO_FEATURES", "systemd", "rootfs_systemd_timestamp ", "", d)}'
+
# Tweak files in /etc if read-only-rootfs is enabled
ROOTFS_POSTPROCESS_COMMAND += '${@bb.utils.contains("IMAGE_FEATURES", "read-only-rootfs", "read_only_rootfs_hook ", "",d)}'
@@ -402,6 +405,19 @@ rootfs_update_timestamp () {
bbnote "rootfs_update_timestamp: set /etc/timestamp to $sformatted"
}
+# Can be used to create /usr/lib/clock-epoch during image construction to give a reasonably
+# sane default time setting
+rootfs_systemd_timestamp () {
+ if [ "${REPRODUCIBLE_TIMESTAMP_ROOTFS}" != "" ]; then
+ # Convert UTC into %4Y%2m%2d%2H%2M.%2S
+ sformatted=`date -u -d @${REPRODUCIBLE_TIMESTAMP_ROOTFS} +%4Y%2m%2d%2H%2M.%2S`
+ else
+ sformatted=`date -u +%4Y%2m%2d%2H%2M.%2S`
+ fi
+ touch -m -t "$sformatted" ${IMAGE_ROOTFS}/usr/lib/clock-epoch
+ bbnote "rootfs_systemd_timestamp: set /usr/lib/clock-epoch mtime to $sformatted"
+}
+
# Prevent X from being started
rootfs_no_x_startup () {
if [ -f ${IMAGE_ROOTFS}/etc/init.d/xserver-nodm ]; then
--
2.47.0
^ permalink raw reply related [flat|nested] 10+ messages in thread* Re: [OE-core] [PATCH] classes: rootfs-postcommands: set better sane time to systemd
2024-10-19 2:19 [PATCH] classes: rootfs-postcommands: set better sane time to systemd Gaël PORTAY
@ 2024-10-21 10:25 ` Alexander Kanavin
2024-10-21 17:02 ` Gaël PORTAY
2024-10-23 2:40 ` ChenQi
1 sibling, 1 reply; 10+ messages in thread
From: Alexander Kanavin @ 2024-10-21 10:25 UTC (permalink / raw)
To: gael.portay+rtone; +Cc: openembedded-core
Can this be done from systemd recipe itself? Items in
rootfs-postprocess list should not be recipe-specific.
Alex
On Sat, 19 Oct 2024 at 04:19, Gaël PORTAY via lists.openembedded.org
<gael.portay+rtone=gmail.com@lists.openembedded.org> wrote:
>
> 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 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, from a
> newly introduced rootfs post-process command that is very similar to
> update_timestamp.
>
> It touches the file /usr/lib/clock-epoch with the modification time set
> to either the current timestamp (now) or to a reproducible timestamp if
> REPRODUCIBLE_TIMESTAMP_ROOTFS is set.
>
> Note: That newly introduced rootfs post-process command is automatically
> set if systemd is set in the distro features.
>
> [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 <gael.portay+rtone@gmail.com>
> ---
> 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).
>
> If you have a better idea on how to implement it, please tell; in the
> meanwhile...
>
> Kind Regards,
> Gaël
> meta/classes-recipe/rootfs-postcommands.bbclass | 16 ++++++++++++++++
> 1 file changed, 16 insertions(+)
>
> diff --git a/meta/classes-recipe/rootfs-postcommands.bbclass b/meta/classes-recipe/rootfs-postcommands.bbclass
> index 5f4d67f93c..cc74c75cfa 100644
> --- a/meta/classes-recipe/rootfs-postcommands.bbclass
> +++ b/meta/classes-recipe/rootfs-postcommands.bbclass
> @@ -22,6 +22,9 @@ ROOTFS_POSTPROCESS_COMMAND += '${@bb.utils.contains_any("IMAGE_FEATURES", [ 'deb
> # Create /etc/timestamp during image construction to give a reasonably sane default time setting
> ROOTFS_POSTPROCESS_COMMAND += "rootfs_update_timestamp "
>
> +# Create /usr/lib/clock-epoch during image construction to give a reasonably sane default time setting to systemd
> +ROOTFS_POSTPROCESS_COMMAND += '${@bb.utils.contains("DISTRO_FEATURES", "systemd", "rootfs_systemd_timestamp ", "", d)}'
> +
> # Tweak files in /etc if read-only-rootfs is enabled
> ROOTFS_POSTPROCESS_COMMAND += '${@bb.utils.contains("IMAGE_FEATURES", "read-only-rootfs", "read_only_rootfs_hook ", "",d)}'
>
> @@ -402,6 +405,19 @@ rootfs_update_timestamp () {
> bbnote "rootfs_update_timestamp: set /etc/timestamp to $sformatted"
> }
>
> +# Can be used to create /usr/lib/clock-epoch during image construction to give a reasonably
> +# sane default time setting
> +rootfs_systemd_timestamp () {
> + if [ "${REPRODUCIBLE_TIMESTAMP_ROOTFS}" != "" ]; then
> + # Convert UTC into %4Y%2m%2d%2H%2M.%2S
> + sformatted=`date -u -d @${REPRODUCIBLE_TIMESTAMP_ROOTFS} +%4Y%2m%2d%2H%2M.%2S`
> + else
> + sformatted=`date -u +%4Y%2m%2d%2H%2M.%2S`
> + fi
> + touch -m -t "$sformatted" ${IMAGE_ROOTFS}/usr/lib/clock-epoch
> + bbnote "rootfs_systemd_timestamp: set /usr/lib/clock-epoch mtime to $sformatted"
> +}
> +
> # Prevent X from being started
> rootfs_no_x_startup () {
> if [ -f ${IMAGE_ROOTFS}/etc/init.d/xserver-nodm ]; then
> --
> 2.47.0
>
>
> -=-=-=-=-=-=-=-=-=-=-=-
> Links: You receive all messages sent to this group.
> View/Reply Online (#206078): https://lists.openembedded.org/g/openembedded-core/message/206078
> Mute This Topic: https://lists.openembedded.org/mt/109095282/1686489
> Group Owner: openembedded-core+owner@lists.openembedded.org
> Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [alex.kanavin@gmail.com]
> -=-=-=-=-=-=-=-=-=-=-=-
>
^ permalink raw reply [flat|nested] 10+ messages in thread* Re: [OE-core] [PATCH] classes: rootfs-postcommands: set better sane time to systemd
2024-10-21 10:25 ` [OE-core] " Alexander Kanavin
@ 2024-10-21 17:02 ` Gaël PORTAY
2024-10-21 17:09 ` Alexander Kanavin
2024-10-22 18:40 ` [OE-core] " Peter Kjellerstedt
0 siblings, 2 replies; 10+ messages in thread
From: Gaël PORTAY @ 2024-10-21 17:02 UTC (permalink / raw)
To: Alexander Kanavin, gael.portay+rtone; +Cc: openembedded-core
Hello Alex,
On Mon Oct 21, 2024 at 12:25 PM CEST, Alexander Kanavin wrote:
> Can this be done from systemd recipe itself? Items in
> rootfs-postprocess list should not be recipe-specific.
>
Sure it could be done in the recipe itself ;) but...
The recipe harcodes already a sane value at configure time thanks to the
meson option -Dtime-epoch and the environment variable $SOURCE_DATE_EPOC
(or the date the creation of the latest git-tag or the modification time
of the NEWS file). systemd sets the date somewhere in 2022 (kirkstone).
I have created a rootfs-postcommand to be able to set a better time **at
image creation** to keep the systemd package untouched (not rebuilt) by
updateing the variable $REPRODUCIBLE_TIMESTAMP_ROOTFS.
That variable is suffixed by _ROOTFS; and I guess that variable **SHOULD
NOT** be used by package recipes.
The rootfs_systemd_timestamp() is based on rootfs_update_timestamp(); it
touches the file and it leaves the file empty.
Also, to decrease the systemd-specific thing, I wonder if this is
acceptable:
rootfs_update_timestamp () {
if [ "${REPRODUCIBLE_TIMESTAMP_ROOTFS}" != "" ]; then
# Convert UTC into %4Y%2m%2d%2H%2M%2S
sformatted=`date -u -d @${REPRODUCIBLE_TIMESTAMP_ROOTFS} +%4Y%2m%2d%2H%2M%2S`
else
sformatted=`date -u +%4Y%2m%2d%2H%2M%2S`
fi
echo $sformatted > ${IMAGE_ROOTFS}/etc/timestamp
bbnote "rootfs_update_timestamp: set /etc/timestamp to $sformatted"
+
+ if [ -x /lib/systemd/systemd ]; then
+ if [ "${REPRODUCIBLE_TIMESTAMP_ROOTFS}" != "" ]; then
+ # Convert UTC into %4Y%2m%2d%2H%2M.%2S
+ sformatted=`date -u -d @${REPRODUCIBLE_TIMESTAMP_ROOTFS} +%4Y%2m%2d%2H%2M.%2S`
+ else
+ sformatted=`date -u +%4Y%2m%2d%2H%2M.%2S`
+ fi
+ touch -m -t "$sformatted" ${IMAGE_ROOTFS}/usr/lib/clock-epoch
+ bbnote "rootfs_systemd_timestamp: set /usr/lib/clock-epoch mtime to $sformatted"
+ }
}
Or, linking the file instead:
rootfs_update_timestamp () {
if [ "${REPRODUCIBLE_TIMESTAMP_ROOTFS}" != "" ]; then
# Convert UTC into %4Y%2m%2d%2H%2M%2S
sformatted=`date -u -d @${REPRODUCIBLE_TIMESTAMP_ROOTFS} +%4Y%2m%2d%2H%2M%2S`
else
sformatted=`date -u +%4Y%2m%2d%2H%2M%2S`
fi
echo $sformatted > ${IMAGE_ROOTFS}/etc/timestamp
bbnote "rootfs_update_timestamp: set /etc/timestamp to $sformatted"
+
+ if [ -x /lib/systemd/systemd ]; then
+ ln -sf /etc/timestamp /usr/lib/clock-epoch
+ }
}
Does it look better for you?
> Alex
>
Regards,
Gaël
^ permalink raw reply [flat|nested] 10+ messages in thread* Re: [OE-core] [PATCH] classes: rootfs-postcommands: set better sane time to systemd
2024-10-21 17:02 ` Gaël PORTAY
@ 2024-10-21 17:09 ` Alexander Kanavin
2024-10-21 18:02 ` Gaël PORTAY
2024-10-22 18:40 ` [OE-core] " Peter Kjellerstedt
1 sibling, 1 reply; 10+ messages in thread
From: Alexander Kanavin @ 2024-10-21 17:09 UTC (permalink / raw)
To: Gaël PORTAY; +Cc: gael.portay+rtone, openembedded-core
On Mon, 21 Oct 2024 at 19:02, Gaël PORTAY <gael.portay@gmail.com> wrote:
> Or, linking the file instead:
>
> rootfs_update_timestamp () {
> if [ "${REPRODUCIBLE_TIMESTAMP_ROOTFS}" != "" ]; then
> # Convert UTC into %4Y%2m%2d%2H%2M%2S
> sformatted=`date -u -d @${REPRODUCIBLE_TIMESTAMP_ROOTFS} +%4Y%2m%2d%2H%2M%2S`
> else
> sformatted=`date -u +%4Y%2m%2d%2H%2M%2S`
> fi
> echo $sformatted > ${IMAGE_ROOTFS}/etc/timestamp
> bbnote "rootfs_update_timestamp: set /etc/timestamp to $sformatted"
> +
> + if [ -x /lib/systemd/systemd ]; then
> + ln -sf /etc/timestamp /usr/lib/clock-epoch
> + }
> }
>
> Does it look better for you?
This does look better, yes. Will systemd follow the symlink and read
the mtime of the original file?
Alex
^ permalink raw reply [flat|nested] 10+ messages in thread* Re: [PATCH] classes: rootfs-postcommands: set better sane time to systemd
2024-10-21 17:09 ` Alexander Kanavin
@ 2024-10-21 18:02 ` Gaël PORTAY
2024-10-21 18:06 ` Alexander Kanavin
0 siblings, 1 reply; 10+ messages in thread
From: Gaël PORTAY @ 2024-10-21 18:02 UTC (permalink / raw)
To: Alexander Kanavin; +Cc: openembedded-core@lists.openembedded.org
[-- Attachment #1: Type: text/plain, Size: 1551 bytes --]
On Monday 21 October 2024, Alexander Kanavin <alex.kanavin@gmail.com> wrote:
> On Mon, 21 Oct 2024 at 19:02, Gaël PORTAY <gael.portay@gmail.com> wrote:
>
>> Or, linking the file instead:
>>
>> rootfs_update_timestamp () {
>> if [ "${REPRODUCIBLE_TIMESTAMP_ROOTFS}" != "" ]; then
>> # Convert UTC into %4Y%2m%2d%2H%2M%2S
>> sformatted=`date -u -d
@${REPRODUCIBLE_TIMESTAMP_ROOTFS} +%4Y%2m%2d%2H%2M%2S`
>> else
>> sformatted=`date -u +%4Y%2m%2d%2H%2M%2S`
>> fi
>> echo $sformatted > ${IMAGE_ROOTFS}/etc/timestamp
>> bbnote "rootfs_update_timestamp: set /etc/timestamp to
$sformatted"
>> +
>> + if [ -x /lib/systemd/systemd ]; then
>> + ln -sf /etc/timestamp /usr/lib/clock-epoch
>> + }
>> }
>>
>> Does it look better for you?
>
> This does look better, yes. Will systemd follow the symlink and read
> the mtime of the original file?
>
> Alex
>
I have not tested it so far, but I guess so.
systemd stat() the file, so it should follows symlink.
I will give a try tomorrow.
Also, I wonder what is the best test to symlink the file:
- testing for the ${IMAGE_ROOTFS}/llib/systemd/systemd
- testing for systemd in DISTRO_FEATURES,
- testing for systemd in IMAGE_INSTALL?
https://github.com/systemd/systemd/blob/4d47aa8c0435ad7bcd45aea3a091c22027fc0aa8/src/core/clock-warp.c#L26
Gaël
[-- Attachment #2: Type: text/html, Size: 2160 bytes --]
^ permalink raw reply [flat|nested] 10+ messages in thread
* RE: [OE-core] [PATCH] classes: rootfs-postcommands: set better sane time to systemd
2024-10-21 17:02 ` Gaël PORTAY
2024-10-21 17:09 ` Alexander Kanavin
@ 2024-10-22 18:40 ` Peter Kjellerstedt
2024-10-22 23:13 ` Gaël PORTAY
1 sibling, 1 reply; 10+ messages in thread
From: Peter Kjellerstedt @ 2024-10-22 18:40 UTC (permalink / raw)
To: "Gaël PORTAY, Alexander Kanavin,
gael.portay+rtone@gmail.com
Cc: openembedded-core@lists.openembedded.org
> -----Original Message-----
> From: openembedded-core@lists.openembedded.org <openembedded-
> core@lists.openembedded.org> On Behalf Of "Gaël PORTAY
> Sent: den 21 oktober 2024 19:02
> To: Alexander Kanavin <alex.kanavin@gmail.com>;
> gael.portay+rtone@gmail.com
> Cc: openembedded-core@lists.openembedded.org
> Subject: Re: [OE-core] [PATCH] classes: rootfs-postcommands: set better
> sane time to systemd
>
> Hello Alex,
>
> On Mon Oct 21, 2024 at 12:25 PM CEST, Alexander Kanavin wrote:
> > Can this be done from systemd recipe itself? Items in
> > rootfs-postprocess list should not be recipe-specific.
> >
>
> Sure it could be done in the recipe itself ;) but...
>
> The recipe harcodes already a sane value at configure time thanks to the
> meson option -Dtime-epoch and the environment variable $SOURCE_DATE_EPOC
> (or the date the creation of the latest git-tag or the modification time
> of the NEWS file). systemd sets the date somewhere in 2022 (kirkstone).
>
> I have created a rootfs-postcommand to be able to set a better time **at
> image creation** to keep the systemd package untouched (not rebuilt) by
> updateing the variable $REPRODUCIBLE_TIMESTAMP_ROOTFS.
Can't you add a pkg_postinst:${PN} function to the systemd recipe and that
way do it in the recipe while stile executing it at image creation time?
>
> That variable is suffixed by _ROOTFS; and I guess that variable **SHOULD
> NOT** be used by package recipes.
>
> The rootfs_systemd_timestamp() is based on rootfs_update_timestamp(); it
> touches the file and it leaves the file empty.
>
> Also, to decrease the systemd-specific thing, I wonder if this is
> acceptable:
>
> rootfs_update_timestamp () {
> if [ "${REPRODUCIBLE_TIMESTAMP_ROOTFS}" != "" ]; then
> # Convert UTC into %4Y%2m%2d%2H%2M%2S
> sformatted=`date -u -d @${REPRODUCIBLE_TIMESTAMP_ROOTFS} +%4Y%2m%2d%2H%2M%2S`
> else
> sformatted=`date -u +%4Y%2m%2d%2H%2M%2S`
> fi
> echo $sformatted > ${IMAGE_ROOTFS}/etc/timestamp
> bbnote "rootfs_update_timestamp: set /etc/timestamp to $sformatted"
> +
> + if [ -x /lib/systemd/systemd ]; then
Umm, why are you looking at the host's files?
> + if [ "${REPRODUCIBLE_TIMESTAMP_ROOTFS}" != "" ]; then
> + # Convert UTC into %4Y%2m%2d%2H%2M.%2S
> + sformatted=`date -u -d @${REPRODUCIBLE_TIMESTAMP_ROOTFS} +%4Y%2m%2d%2H%2M.%2S`
> + else
> + sformatted=`date -u +%4Y%2m%2d%2H%2M.%2S`
> + fi
> + touch -m -t "$sformatted" ${IMAGE_ROOTFS}/usr/lib/clock-epoch
> + bbnote "rootfs_systemd_timestamp: set /usr/lib/clock-epoch mtime to $sformatted"
> + }
> }
>
> Or, linking the file instead:
>
> rootfs_update_timestamp () {
> if [ "${REPRODUCIBLE_TIMESTAMP_ROOTFS}" != "" ]; then
> # Convert UTC into %4Y%2m%2d%2H%2M%2S
> sformatted=`date -u -d @${REPRODUCIBLE_TIMESTAMP_ROOTFS} +%4Y%2m%2d%2H%2M%2S`
> else
> sformatted=`date -u +%4Y%2m%2d%2H%2M%2S`
> fi
> echo $sformatted > ${IMAGE_ROOTFS}/etc/timestamp
> bbnote "rootfs_update_timestamp: set /etc/timestamp to $sformatted"
> +
> + if [ -x /lib/systemd/systemd ]; then
> + ln -sf /etc/timestamp /usr/lib/clock-epoch
This too is trying to create a link in the host's filesystem.
> + }
> }
>
> Does it look better for you?
>
> > Alex
> >
>
> Regards,
> Gaël
//Peter
^ permalink raw reply [flat|nested] 10+ messages in thread* Re: [OE-core] [PATCH] classes: rootfs-postcommands: set better sane time to systemd
2024-10-22 18:40 ` [OE-core] " Peter Kjellerstedt
@ 2024-10-22 23:13 ` Gaël PORTAY
0 siblings, 0 replies; 10+ messages in thread
From: Gaël PORTAY @ 2024-10-22 23:13 UTC (permalink / raw)
To: Peter Kjellerstedt, Alexander Kanavin,
gael.portay+rtone@gmail.com
Cc: openembedded-core@lists.openembedded.org
Hello Peter,
On Tue Oct 22, 2024 at 8:40 PM CEST, Peter Kjellerstedt wrote:
> > I have created a rootfs-postcommand to be able to set a better time **at
> > image creation** to keep the systemd package untouched (not rebuilt) by
> > updateing the variable $REPRODUCIBLE_TIMESTAMP_ROOTFS.
>
> Can't you add a pkg_postinst:${PN} function to the systemd recipe and that
> way do it in the recipe while stile executing it at image creation time?
>
Well, that is certainly doable indeed; I have not think about it. Very
good catch, I will give a try, thanks.
To be honest, my first intention was to reuse the existing bits (i.e.
rootfs_update_timestamp) that is there already, and I wanted to make
this existing bits working with systemd as well :)
---
I am openning a parenthesis...
As I said, the variable $REPRODUCIBLE_TIMESTAMP_ROOTFS is to be used for
rootfs (i.e. image) only, am I right?
But it is used to compile the kernel... see:
- https://git.yoctoproject.org/poky/tree/meta/classes-recipe/kernel.bbclass#n371
- https://git.yoctoproject.org/poky/tree/meta/classes-recipe/kernel.bbclass#n427
The change was introduced a long time ago (2017-08-16 00:03:15 +0100):
- https://git.yoctoproject.org/poky/commit/?id=55e9485735ae8393b410f30973c785236dc402d2
I think the kernel should (now) default to SOURCE_DATE_EPOCH_FALLBACK if
SOURCE_DATE_EPOCH cannot be deduced from the git repository.
That fallback variable was introduced afterward:
- https://git.yoctoproject.org/poky/commit/?id=7e9c2f33d4ea9f6449dd56d19ff4522a9ddc2df1
But this is another story; parenthesis closed.
---
The worst thing is I figured out today my work does not work on master
branch; there must be changed since kirkstone that break it.
On kirkstone, stat() /usr/lib/clock-time at run-time returns same mtime
timestamp value than the one set in $REPRODUCIBLE_TIMESTAMP_ROOTFS.
On master, stat() /usr/lib/clock-time at run-time **DOES NOT** returns
the mtime timestamp value set in $REPRODUCIBLE_TIMESTAMP_ROOTFS.
It returns the values set in $SOURCE_DATE_EPOCH_FALLBACK instead! And
for every timestamp values, see:
root@qemux86-64:~# stat /usr/lib/clock-epoch
File: /clock-epoch
Size: 0 Blocks: 0 IO Block: 1024 regular empty file
Device: fd00h/64768d Inode: 17 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
The variable REPRODUCIBLE_TIMESTAMP_ROOTFS was set to "4000000000":
root@qemux86-64:~# cat /etc/timestamp
20961002070640
According to https://www.epochconverter.com, timestamp 4000000000 is
Tuesday, October 2, 2096 7:06:40 AM:
Supports Unix timestamps in seconds, milliseconds, microseconds and nanoseconds.
Assuming that this timestamp is in seconds:
GMT: Tuesday, October 2, 2096 7:06:40 AM
Your time zone: Tuesday, October 2, 2096 9:06:40 AM GMT+02:00 DST
Relative: In 72 years
Therefore, the REPRODUCIBLE_TIMESTAMP_ROOTFS is set properly, but the
reproducible-builds resets the timestamp to $SOURCE_DATE_EPOCH_FALLBACK.
Is it the expected behaviour? I mean having the file timestamp created
before the binary is compiled (certainly yes, reproducible-builds) and
before the sources are actually released (maybe no)? or is it a bug :/
I have to **REDO** the test to ensure what I am telling is true for the
kirkstone branch; but I would not be able to do it before next week or
two (unless I found some free time to test it).
Note: IIRC, the files are created at the real date on kirkstone branch,
but I am not sure (i.e. do not use any reproducible-build variables).
> > +
> > + if [ -x /lib/systemd/systemd ]; then
>
> Umm, why are you looking at the host's files?
>
Oops, thas was a just snippet written on-the-fly for the post; So yes I
forgot to prefix the files ${IMAGE_ROOTFS}.
> > + if [ -x /lib/systemd/systemd ]; then
> > + ln -sf /etc/timestamp /usr/lib/clock-epoch
>
> This too is trying to create a link in the host's filesystem.
Indeed.
>
> //Peter
Regards,
Gaël
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [OE-core] [PATCH] classes: rootfs-postcommands: set better sane time to systemd
2024-10-19 2:19 [PATCH] classes: rootfs-postcommands: set better sane time to systemd Gaël PORTAY
2024-10-21 10:25 ` [OE-core] " Alexander Kanavin
@ 2024-10-23 2:40 ` ChenQi
2024-10-23 5:23 ` Gaël PORTAY
1 sibling, 1 reply; 10+ messages in thread
From: ChenQi @ 2024-10-23 2:40 UTC (permalink / raw)
To: Gaël PORTAY, openembedded-core
The timestamps of all files in rootfs will be changed again by
reproducible_final_image_task. To achieve what you what, what you need
to do is touching an empty file, $D/usr/lib/clock-epoch, in systemd's
do_install task.
And when you create /usr/lib/clock-epoch at rootfs time and changes its
mtime to the current time when REPRODUCIBLE_TIMESTAMP_ROOTFS is not set,
its mtime will be set again by reproducible_final_image_task to be the
commit time of the latest commit. This means the touch action in rootfs
time is useless.
Regards,
Qi
On 10/19/24 10:19, Gaël PORTAY wrote:
> 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 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, from a
> newly introduced rootfs post-process command that is very similar to
> update_timestamp.
>
> It touches the file /usr/lib/clock-epoch with the modification time set
> to either the current timestamp (now) or to a reproducible timestamp if
> REPRODUCIBLE_TIMESTAMP_ROOTFS is set.
>
> Note: That newly introduced rootfs post-process command is automatically
> set if systemd is set in the distro features.
>
> [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 <gael.portay+rtone@gmail.com>
> ---
> 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).
>
> If you have a better idea on how to implement it, please tell; in the
> meanwhile...
>
> Kind Regards,
> Gaël
> meta/classes-recipe/rootfs-postcommands.bbclass | 16 ++++++++++++++++
> 1 file changed, 16 insertions(+)
>
> diff --git a/meta/classes-recipe/rootfs-postcommands.bbclass b/meta/classes-recipe/rootfs-postcommands.bbclass
> index 5f4d67f93c..cc74c75cfa 100644
> --- a/meta/classes-recipe/rootfs-postcommands.bbclass
> +++ b/meta/classes-recipe/rootfs-postcommands.bbclass
> @@ -22,6 +22,9 @@ ROOTFS_POSTPROCESS_COMMAND += '${@bb.utils.contains_any("IMAGE_FEATURES", [ 'deb
> # Create /etc/timestamp during image construction to give a reasonably sane default time setting
> ROOTFS_POSTPROCESS_COMMAND += "rootfs_update_timestamp "
>
> +# Create /usr/lib/clock-epoch during image construction to give a reasonably sane default time setting to systemd
> +ROOTFS_POSTPROCESS_COMMAND += '${@bb.utils.contains("DISTRO_FEATURES", "systemd", "rootfs_systemd_timestamp ", "", d)}'
> +
> # Tweak files in /etc if read-only-rootfs is enabled
> ROOTFS_POSTPROCESS_COMMAND += '${@bb.utils.contains("IMAGE_FEATURES", "read-only-rootfs", "read_only_rootfs_hook ", "",d)}'
>
> @@ -402,6 +405,19 @@ rootfs_update_timestamp () {
> bbnote "rootfs_update_timestamp: set /etc/timestamp to $sformatted"
> }
>
> +# Can be used to create /usr/lib/clock-epoch during image construction to give a reasonably
> +# sane default time setting
> +rootfs_systemd_timestamp () {
> + if [ "${REPRODUCIBLE_TIMESTAMP_ROOTFS}" != "" ]; then
> + # Convert UTC into %4Y%2m%2d%2H%2M.%2S
> + sformatted=`date -u -d @${REPRODUCIBLE_TIMESTAMP_ROOTFS} +%4Y%2m%2d%2H%2M.%2S`
> + else
> + sformatted=`date -u +%4Y%2m%2d%2H%2M.%2S`
> + fi
> + touch -m -t "$sformatted" ${IMAGE_ROOTFS}/usr/lib/clock-epoch
> + bbnote "rootfs_systemd_timestamp: set /usr/lib/clock-epoch mtime to $sformatted"
> +}
> +
> # Prevent X from being started
> rootfs_no_x_startup () {
> if [ -f ${IMAGE_ROOTFS}/etc/init.d/xserver-nodm ]; then
>
> -=-=-=-=-=-=-=-=-=-=-=-
> Links: You receive all messages sent to this group.
> View/Reply Online (#206078): https://lists.openembedded.org/g/openembedded-core/message/206078
> Mute This Topic: https://lists.openembedded.org/mt/109095282/7304865
> Group Owner: openembedded-core+owner@lists.openembedded.org
> Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub [Qi.Chen@eng.windriver.com]
> -=-=-=-=-=-=-=-=-=-=-=-
>
^ permalink raw reply [flat|nested] 10+ messages in thread* Re: [OE-core] [PATCH] classes: rootfs-postcommands: set better sane time to systemd
2024-10-23 2:40 ` ChenQi
@ 2024-10-23 5:23 ` Gaël PORTAY
0 siblings, 0 replies; 10+ messages in thread
From: Gaël PORTAY @ 2024-10-23 5:23 UTC (permalink / raw)
To: ChenQi, Gaël PORTAY, openembedded-core
On Wed Oct 23, 2024 at 4:40 AM CEST, ChenQi wrote:
> The timestamps of all files in rootfs will be changed again by
> reproducible_final_image_task. To achieve what you what, what you need
> to do is touching an empty file, $D/usr/lib/clock-epoch, in systemd's
> do_install task.
>
> And when you create /usr/lib/clock-epoch at rootfs time and changes its
> mtime to the current time when REPRODUCIBLE_TIMESTAMP_ROOTFS is not set,
> its mtime will be set again by reproducible_final_image_task to be the
> commit time of the latest commit. This means the touch action in rootfs
> time is useless.
>
Thanks for the clarification, I will give a try.
> Regards,
> Qi
>
Regards,
Gaël
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2024-10-23 5:23 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-10-19 2:19 [PATCH] classes: rootfs-postcommands: set better sane time to systemd Gaël PORTAY
2024-10-21 10:25 ` [OE-core] " Alexander Kanavin
2024-10-21 17:02 ` Gaël PORTAY
2024-10-21 17:09 ` Alexander Kanavin
2024-10-21 18:02 ` Gaël PORTAY
2024-10-21 18:06 ` Alexander Kanavin
2024-10-22 18:40 ` [OE-core] " Peter Kjellerstedt
2024-10-22 23:13 ` Gaël PORTAY
2024-10-23 2:40 ` ChenQi
2024-10-23 5:23 ` Gaël PORTAY
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.