On 10/24/2014 02:09 PM, Koen Kooi wrote:
Op 24 okt. 2014, om 07:58 heeft Chen Qi <qi.c...@windriver.com> 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.
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
Signed-off-by: Chen Qi <qi.c...@windriver.com>
---
meta/recipes-core/systemd/systemd_216.bb | 18 +++++++++++++++---
1 file changed, 15 insertions(+), 3 deletions(-)
diff --git a/meta/recipes-core/systemd/systemd_216.bb
b/meta/recipes-core/systemd/systemd_216.bb
index ebf9395..cd81818 100644
--- a/meta/recipes-core/systemd/systemd_216.bb
+++ b/meta/recipes-core/systemd/systemd_216.bb
@@ -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
}
--
1.9.1
--
_______________________________________________
Openembedded-core mailing list
Openembedded-core@lists.openembedded.org
http://lists.openembedded.org/mailman/listinfo/openembedded-core
--
_______________________________________________
Openembedded-core mailing list
Openembedded-core@lists.openembedded.org
http://lists.openembedded.org/mailman/listinfo/openembedded-core