]> code.ossystems Code Review - openembedded-core.git/commitdiff
image.bbclass: avoid boot error on read-only systemd image
authorChen Qi <Qi.Chen@windriver.com>
Tue, 21 Oct 2014 06:30:36 +0000 (14:30 +0800)
committerRichard Purdie <richard.purdie@linuxfoundation.org>
Thu, 15 Jan 2015 16:01:33 +0000 (16:01 +0000)
New version of systemd implements a new feature of updating /etc
or /var when needed at boot. For details, please see link below.

Opointer.de/blog/projects/stateless.html

For now, at boot time, the systemd-sysusers.service would update user
database files (/etc/passwd, /etc/group, etc.) according to the configuration
files under /usr/lib/sysusers.d. This step is necessary for other systemd
services to work correctly. Examples of such services are systemd-resolved
and systemd-tmpfiles-setup.

The problem is that on a read-only file system, that is, if /etc is read-only,
the user database files could not be updated, causing failures of services.

This patch fixes this problem by adding users/groups at rootfs time.

Signed-off-by: Chen Qi <Qi.Chen@windriver.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
meta/classes/image.bbclass

index 326fa9b60b726eaa35478e59375f57240146c233..1c0fda7d60e5962e8757acb8334cbec633c0aff4 100644 (file)
@@ -216,6 +216,27 @@ read_only_rootfs_hook () {
                        fi
                fi
        fi
+
+       if ${@bb.utils.contains("DISTRO_FEATURES", "systemd", "true", "false", d)}; then
+           # Update user database files so that services don't fail for a read-only systemd system
+           for conffile in ${IMAGE_ROOTFS}/usr/lib/sysusers.d/systemd.conf ${IMAGE_ROOTFS}/usr/lib/sysusers.d/systemd-remote.conf; do
+               [ -e $conffile ] || continue
+               grep -v "^#" $conffile | sed -e '/^$/d' | while read type name id comment; do
+                   if [ "$type" = "u" ]; then
+                       useradd_params=""
+                       [ "$id" != "-" ] && useradd_params="$useradd_params --uid $id"
+                       [ "$comment" != "-" ] && useradd_params="$useradd_params --comment $comment"
+                       useradd_params="$useradd_params --system $name"
+                       eval useradd --root ${IMAGE_ROOTFS} $useradd_params || true
+                   elif [ "$type" = "g" ]; then
+                       groupadd_params=""
+                       [ "$id" != "-" ] && groupadd_params="$groupadd_params --gid $id"
+                       groupadd_params="$groupadd_params --system $name"
+                       eval groupadd --root ${IMAGE_ROOTFS} $groupadd_params || true
+                   fi
+               done
+           done
+       fi
 }
 
 PACKAGE_EXCLUDE ??= ""