Skip to contentSkip to conversation

systemd: fix systemd-udev-hwdb-update service

PATCH In review Chen Qi 2 participants 4 messages Oct 24, 2014

lore
Share & tools
lore

Chen Qi

author
#0 lore raw

cover systemd: fix systemd-udev-hwdb-update service

The following changes since commit 97756472d3a69eaca95d105494ffea78c6b077e0:

build-appliance-image: Update to dizzy head revision (2014-10-18 16:16:27 +0200)

are available in the git repository at:

git://git.openembedded.org/openembedded-core-contrib ChenQi/systemd-udev-hwdb-update
http://cgit.openembedded.org/cgit.cgi/openembedded-core-contrib/log/?h=ChenQi/systemd-udev-hwdb-update

Chen Qi (1):
systemd: fix systemd-udev-hwdb-update service

 meta/recipes-core/systemd/systemd_216.bb | 18 +++++++++++++++---
 1 file changed, 15 insertions(+), 3 deletions(-)
Signature · 1 line
1.9.1
author
#1 lore raw

PATCH 1/1 systemd: fix systemd-udev-hwdb-update service

The new version of systemd has implemented the following feature. Opointer.de/blog/projects/stateless.html

As a result, the systemd-udev-hwdb-update.service would always run at first boot. This will cause failure if the target device doesn't have enough storage space. Besides, as we run `udevadm hwdb --update' as a postinst of udev-hwdb at rootfs time, there's no need to run this again at system start-up.

The purpose of this patch is as follows.
If `udev hwdb --update' fails at rootfs time, systemd-udev-hwdb-update.service is executed at first boot; otherwise, the service is not executed.

This patch achieves the above goal by setting CondistonNeedsUpdate to "/etc/udev" in the service file, and creating /etc/udev/.updated file if the postinst succeeds.

---
 meta/recipes-core/systemd/systemd_216.bb | 18 +++++++++++++++---
 1 file changed, 15 insertions(+), 3 deletions(-)
meta/recipes-core/systemd/systemd_216.bb +15 -3
index ebf9395..cd81818 100644
@@ -149,6 +149,10 @@ do_install() {
 
 	# Enable journal to forward message to syslog daemon
 	sed -i -e 's/.*ForwardToSyslog.*/ForwardToSyslog=yes/' ${D}${sysconfdir}/systemd/journald.conf
+
+	# Make systemd-udev-hwdb-update to check /etc/udev
+	cp ${D}${systemd_unitdir}/system/systemd-udev-hwdb-update.service ${D}${sysconfdir}/systemd/system
+	sed -i -e 's#ConditionNeedsUpdate=/etc#ConditionNeedsUpdate=/etc/udev#g' ${D}${sysconfdir}/systemd/system/systemd-udev-hwdb-update.service
 }
 
 do_install_ptest () {
@@ -355,10 +359,18 @@ ALTERNATIVE_PRIORITY[runlevel] ?= "300"
 
 pkg_postinst_udev-hwdb () {
 	if test -n "$D"; then
-		${@qemu_run_binary(d, '$D', '${base_bindir}/udevadm')} hwdb --update \
-			--root $D
+		if ${@qemu_run_binary(d, '$D', '${base_bindir}/udevadm')} hwdb --update \
+			--root $D; then
+			touch $D/etc/udev/.updated
+		else
+			exit 1
+		fi
 	else
-		udevadm hwdb --update
+		if udevadm hwdb --update; then
+			touch $D/etc/udev/.updated
+		else
+			exit 1
+		fi
 	fi
 }
 
Signature · 1 line
1.9.1
#2 lore raw
Quoted 12 lines

Op 24 okt. 2014, om 07:58 heeft Chen Qi <[email protected]> het volgende geschreven:

The new version of systemd has implemented the following feature. Opointer.de/blog/projects/stateless.html

As a result, the systemd-udev-hwdb-update.service would always run at first boot. This will cause failure if the target device doesn't have enough storage space. Besides, as we run `udevadm hwdb --update' as a postinst of udev-hwdb at rootfs time, there's no need to run this again at system start-up.

Quoted 7 lines

The purpose of this patch is as follows.
If `udev hwdb --update' fails at rootfs time, systemd-udev-hwdb-update.service is executed at first boot; otherwise, the service is not executed.

This patch achieves the above goal by setting CondistonNeedsUpdate to "/etc/udev" in the service file, and creating /etc/udev/.updated file if the postinst succeeds.

Ehm, /etc/udev can be created by other packages, why not test for the file you create?

regards,

Koen

Quoted 52 lines

---
meta/recipes-core/systemd/systemd_216.bb | 18 +++++++++++++++---

1 file changed, 15 insertions(+), 3 deletions(-)
meta/recipes-core/systemd/systemd_216.bb +15 -3
index ebf9395..cd81818 100644
@@ -149,6 +149,10 @@ do_install() {
 
 	# Enable journal to forward message to syslog daemon
 	sed -i -e 's/.*ForwardToSyslog.*/ForwardToSyslog=yes/' ${D}${sysconfdir}/systemd/journald.conf
+
+	# Make systemd-udev-hwdb-update to check /etc/udev
+	cp ${D}${systemd_unitdir}/system/systemd-udev-hwdb-update.service ${D}${sysconfdir}/systemd/system
+	sed -i -e 's#ConditionNeedsUpdate=/etc#ConditionNeedsUpdate=/etc/udev#g' ${D}${sysconfdir}/systemd/system/systemd-udev-hwdb-update.service
 }
 
 do_install_ptest () {
@@ -355,10 +359,18 @@ ALTERNATIVE_PRIORITY[runlevel] ?= "300"
 
 pkg_postinst_udev-hwdb () {
 	if test -n "$D"; then
-		${@qemu_run_binary(d, '$D', '${base_bindir}/udevadm')} hwdb --update \
-			--root $D
+		if ${@qemu_run_binary(d, '$D', '${base_bindir}/udevadm')} hwdb --update \
+			--root $D; then
+			touch $D/etc/udev/.updated
+		else
+			exit 1
+		fi
 	else
-		udevadm hwdb --update
+		if udevadm hwdb --update; then
+			touch $D/etc/udev/.updated
+		else
+			exit 1
+		fi
 	fi
 }
 
Signature · 7 lines
1.9.1

-- 
_______________________________________________
Openembedded-core mailing list
[email protected]
http://lists.openembedded.org/mailman/listinfo/openembedded-core
author
#3 lore raw
Quoted 15 lines · Koen Kooi
Quoted 15 lines

Op 24 okt. 2014, om 07:58 heeft Chen Qi <[email protected]> het volgende geschreven:

The new version of systemd has implemented the following feature. Opointer.de/blog/projects/stateless.html

As a result, the systemd-udev-hwdb-update.service would always run at first boot. This will cause failure if the target device doesn't have enough storage space. Besides, as we run `udevadm hwdb --update' as a postinst of udev-hwdb at rootfs time, there's no need to run this again at system start-up.

The purpose of this patch is as follows.
If `udev hwdb --update' fails at rootfs time, systemd-udev-hwdb-update.service is executed at first boot; otherwise, the service is not executed.

Quoted 9 lines
Quoted 3 lines

This patch achieves the above goal by setting CondistonNeedsUpdate to "/etc/udev" in the service file, and creating /etc/udev/.updated file if the postinst succeeds.

Ehm, /etc/udev can be created by other packages, why not test for the file you create?

regards,

Koen

Hi Koen,

The tested path must be a directory. If we test a file, then condition will always be true.

Below are the related codes from systemd:

<code_snippet>

static bool condition_test_needs_update(Condition *c) {
        const char *p;
        struct stat usr, other;

        assert(c);
        assert(c->parameter);
        assert(c->type == CONDITION_NEEDS_UPDATE);

        /* If the file system is read-only we shouldn't suggest an 
update */
        if (path_is_read_only_fs(c->parameter) > 0)
                return c->negate;

        /* Any other failure means we should allow the condition to be 
true,
         * so that we rather invoke too many update tools then too
         * few. */

        if (!path_is_absolute(c->parameter))
                return !c->negate;

        p = strappenda(c->parameter, "/.updated");
        if (lstat(p, &other) < 0)
                return !c->negate;

        if (lstat("/usr/", &usr) < 0)
                return !c->negate;

        return (usr.st_mtim.tv_sec > other.st_mtim.tv_sec ||
                (usr.st_mtim.tv_sec == other.st_mtim.tv_sec && 

usr.st_mtim.tv_nsec > other.st_mtim.tv_nsec)) == !c->negate; }

</code_snippet>

This patch makes use of the '.updated' trick.

Best Regards,
Chen Qi

Quoted 52 lines
Quoted 51 lines

---
meta/recipes-core/systemd/systemd_216.bb | 18 +++++++++++++++---

1 file changed, 15 insertions(+), 3 deletions(-)
meta/recipes-core/systemd/systemd_216.bb +15 -3
index ebf9395..cd81818 100644
@@ -149,6 +149,10 @@ do_install() {
 
 	# Enable journal to forward message to syslog daemon
 	sed -i -e 's/.*ForwardToSyslog.*/ForwardToSyslog=yes/' ${D}${sysconfdir}/systemd/journald.conf
+
+	# Make systemd-udev-hwdb-update to check /etc/udev
+	cp ${D}${systemd_unitdir}/system/systemd-udev-hwdb-update.service ${D}${sysconfdir}/systemd/system
+	sed -i -e 's#ConditionNeedsUpdate=/etc#ConditionNeedsUpdate=/etc/udev#g' ${D}${sysconfdir}/systemd/system/systemd-udev-hwdb-update.service
 }
 
 do_install_ptest () {
@@ -355,10 +359,18 @@ ALTERNATIVE_PRIORITY[runlevel] ?= "300"
 
 pkg_postinst_udev-hwdb () {
 	if test -n "$D"; then
-		${@qemu_run_binary(d, '$D', '${base_bindir}/udevadm')} hwdb --update \
-			--root $D
+		if ${@qemu_run_binary(d, '$D', '${base_bindir}/udevadm')} hwdb --update \
+			--root $D; then
+			touch $D/etc/udev/.updated
+		else
+			exit 1
+		fi
 	else
-		udevadm hwdb --update
+		if udevadm hwdb --update; then
+			touch $D/etc/udev/.updated
+		else
+			exit 1
+		fi
 	fi
 }
 
Signature · 7 lines
1.9.1

-- 
_______________________________________________
Openembedded-core mailing list
[email protected]
http://lists.openembedded.org/mailman/listinfo/openembedded-core