I could unfortunately reproduce the "Assertion 'sd_id128_randomize(&id) >= 0'" issue on my Debian/Jessie with systemd 215-17+deb8u4.

I added the attached two patches and then things started working.

Cheers,
Walter Doekes
OSSO B.V.

>From 874d3404cbf2363604106c8f86683db4082691ea Mon Sep 17 00:00:00 2001
From: Lennart Poettering <lenn...@poettering.net>
Date: Fri, 23 Jan 2015 13:44:44 +0100
Subject: [PATCH] core,shutdown: don't bother with unmounting any mounts below
 /sys, /proc, /dev when shutting down

After all, mounts below these directories are pretty much guaranteed to
be virtual, and it's hence unnecessary to unmount them during shutdown.
Moreover, in less-priviliged containers we might lack the rights to
unmount them, hence don't even try.

http://lists.freedesktop.org/archives/systemd-devel/2015-January/027113.html
---
 src/core/mount.c  | 17 ++++++++++++-----
 src/core/umount.c | 10 ++++++++--
 2 files changed, 20 insertions(+), 7 deletions(-)

--- a/src/core/mount.c
+++ b/src/core/mount.c
@@ -375,12 +385,20 @@ static int mount_add_default_dependencie
         if (UNIT(m)->manager->running_as != SYSTEMD_SYSTEM)
                 return 0;
 
-        p = get_mount_parameters(m);
-
-        if (!p)
+        /* We do not add any default dependencies to / and /usr, since
+         * they are guaranteed to stay mounted the whole time, since
+         * our system is on it. Also, don't bother with anything
+         * mounted below virtual file systems, it's also going to be
+         * virtual, and hence not worth the effort. */
+        if (path_equal(m->where, "/") ||
+            path_equal(m->where, "/usr") ||
+            path_startswith(m->where, "/proc") ||
+            path_startswith(m->where, "/sys") ||
+            path_startswith(m->where, "/dev"))
                 return 0;
 
-        if (path_equal(m->where, "/"))
+        p = get_mount_parameters(m);
+        if (!p)
                 return 0;
 
         if (mount_is_network(p)) {
--- a/src/core/umount.c
+++ b/src/core/umount.c
@@ -102,15 +102,21 @@ static int mount_points_list_get(MountPo
                 if (!p)
                         return -ENOMEM;
 
                 /* Ignore mount points we can't unmount because they
                  * are API or because we are keeping them open (like
-                 * /dev/console) */
+                 * /dev/console). Also, ignore all mounts below API
+                 * file systems, since they are likely virtual too,
+                 * and hence not worth spending time on. Also, in
+                 * unprivileged containers we might lack the rights to
+                 * unmount these things, hence don't bother. */
                 if (mount_point_is_api(p) ||
                     mount_point_ignore(p) ||
-                    path_equal(p, "/dev/console")) {
+                    path_startswith(p, "/dev") ||
+                    path_startswith(p, "/sys") ||
+                    path_startswith(p, "/proc")) {
                         free(p);
                         continue;
                 }
 
                 m = new0(MountPoint, 1);
                 if (!m) {
From: Walter Doekes <wjdoekes+syst...@osso.nl>
Date: Fri, 09 Sep 2016 20:52:59 +0200
Subject: [PATCH] fix systemd shutdown on LXC system with /dev/urandom

Complements 874d3404cbf2363604106c8f86683db4082691ea but adds the
do-not-unmount check to should_umount as well. Now the LXC container
shuts down without Assertion 'sd_id128_randomize(&id) >= 0' failed at
../src/core/dbus.c:688, function bus_on_connection(). Aborting.

Tested on Debian/Jessie LXC container (version 215-17+deb8u4) with
backported 874d3404cbf2363604106c8f86683db4082691ea and this on top.
(LXC running on Ubuntu/Xenial host OS.)
--- a/src/core/mount.c
+++ b/src/core/mount.c
@@ -353,8 +353,16 @@ static int mount_add_quota_links(Mount *
 static bool should_umount(Mount *m) {
         MountParameters *p;
 
+        /* We do not auto-unmount / and /usr, since they are
+         * guaranteed to stay mounted the whole time, since
+         * our system is on it. Also, don't bother with anything
+         * mounted below virtual file systems, it's also going to be
+         * virtual, and hence not worth the effort. */
         if (path_equal(m->where, "/") ||
-            path_equal(m->where, "/usr"))
+            path_equal(m->where, "/usr") ||
+            path_startswith(m->where, "/proc") ||
+            path_startswith(m->where, "/sys") ||
+            path_startswith(m->where, "/dev"))
                 return false;
 
         p = get_mount_parameters(m);

Reply via email to