* [Buildroot] [PATCH] package/skeleton-init-systemd: create a symlink /var/run to ../run @ 2018-02-22 22:10 Romain Naour 2018-02-23 18:25 ` Trent Piepho 0 siblings, 1 reply; 7+ messages in thread From: Romain Naour @ 2018-02-22 22:10 UTC (permalink / raw) To: buildroot As reported by J?r?my Rosen [1] and Jan Kundr?t (RO case)[2], systemd looks for the dbus socket in /run/dbus instead of /var/run/dbus which is not where dbus puts the socket. This is a change introduced with the last version bump v237 [3]. The file /usr/lib/tmpfiles.d/var.con will create automatically that symlink at bootup /var/run doesn't exist yet. But dbus creates, at install time, the directory /var/run/dbus without taking care of /var/run. So we end up with two different directories /run and /var/run. This bug affects more or less all systemd-provided utilities, including logind and systemd itself. This patch create the correct symlink run -> ../run when systemd is used as init system. [1] http://lists.busybox.net/pipermail/buildroot/2018-February/214129.html [2] http://lists.busybox.net/pipermail/buildroot/2018-February/213420.html [3] https://github.com/systemd/systemd/commit/15ca0a42c7db49146a7169dbcb0683f0836cf8c2 Reported-by: J?r?my Rosen <jeremy.rosen@smile.fr> Signed-off-by: Romain Naour <romain.naour@gmail.com> --- package/skeleton-init-systemd/skeleton-init-systemd.mk | 1 + 1 file changed, 1 insertion(+) diff --git a/package/skeleton-init-systemd/skeleton-init-systemd.mk b/package/skeleton-init-systemd/skeleton-init-systemd.mk index 95142904f5..d435aa54ee 100644 --- a/package/skeleton-init-systemd/skeleton-init-systemd.mk +++ b/package/skeleton-init-systemd/skeleton-init-systemd.mk @@ -20,6 +20,7 @@ ifeq ($(BR2_TARGET_GENERIC_REMOUNT_ROOTFS_RW),y) define SKELETON_INIT_SYSTEMD_ROOT_RO_OR_RW echo "/dev/root / auto rw 0 1" >$(TARGET_DIR)/etc/fstab mkdir -p $(TARGET_DIR)/var + ln -s ../run $(TARGET_DIR)/var/run endef else -- 2.14.3 ^ permalink raw reply related [flat|nested] 7+ messages in thread
* [Buildroot] [PATCH] package/skeleton-init-systemd: create a symlink /var/run to ../run 2018-02-22 22:10 [Buildroot] [PATCH] package/skeleton-init-systemd: create a symlink /var/run to ../run Romain Naour @ 2018-02-23 18:25 ` Trent Piepho 2018-02-24 18:15 ` Arnout Vandecappelle 2018-02-25 19:16 ` Romain Naour 0 siblings, 2 replies; 7+ messages in thread From: Trent Piepho @ 2018-02-23 18:25 UTC (permalink / raw) To: buildroot On Thu, 2018-02-22 at 23:10 +0100, Romain Naour wrote: > As reported by J?r?my Rosen [1] and Jan Kundr?t (RO case)[2], systemd > looks for the dbus socket in /run/dbus instead of /var/run/dbus which > is not where dbus puts the socket. This is a change introduced with > the last version bump v237 [3]. > > The file /usr/lib/tmpfiles.d/var.con will create automatically that > symlink at bootup /var/run doesn't exist yet. But dbus creates, at > install time, the directory /var/run/dbus without taking care of > /var/run. So we end up with two different directories /run and > /var/run. This bug affects more or less all systemd-provided > utilities, including logind and systemd itself. > > This patch create the correct symlink run -> ../run when systemd > is used as init system. This doesn't work in the RO root case. I described this in another mail to the list, but in the RO root case target/var is a symlink to target/usr/share/factory/var. Thus this link is actually created as: target/usr/share/factory/var/run -> ../run It points to target/usr/share/factory/run, which is wrong. In order to get it to work in the RO case, instead create this link. define SKELETON_INIT_SYSTEMD_VAR_RUN_LINK ln -sf ../../../../run $(TARGET_DIR)/usr/share/factory/var/run endef SKELETON_INIT_SYSTEMD_POST_INSTALL_TARGET_HOOKS += \ SKELETON_INIT_SYSTEMD_VAR_RUN_LINK Then you get a target that looks like this: lrwxrwxrwx 1 root root 29 Feb 23 02:35 /var/run -> ../usr/share/factory//var/run lrwxrwxrwx 1 root root 15 Feb 23 00:51 /usr/share/factory/var/run -> ../../../../run On the target, /var/run ends up pointing to /run and also on the host $TARGET_DIR/var/run points to $TARGET_DIR/run. ^ permalink raw reply [flat|nested] 7+ messages in thread
* [Buildroot] [PATCH] package/skeleton-init-systemd: create a symlink /var/run to ../run 2018-02-23 18:25 ` Trent Piepho @ 2018-02-24 18:15 ` Arnout Vandecappelle 2018-02-27 19:28 ` Trent Piepho 2018-02-25 19:16 ` Romain Naour 1 sibling, 1 reply; 7+ messages in thread From: Arnout Vandecappelle @ 2018-02-24 18:15 UTC (permalink / raw) To: buildroot On 23-02-18 19:25, Trent Piepho wrote: > On Thu, 2018-02-22 at 23:10 +0100, Romain Naour wrote: >> As reported by J?r?my Rosen [1] and Jan Kundr?t (RO case)[2], systemd >> looks for the dbus socket in /run/dbus instead of /var/run/dbus which >> is not where dbus puts the socket. This is a change introduced with >> the last version bump v237 [3]. >> >> The file /usr/lib/tmpfiles.d/var.con will create automatically that >> symlink at bootup /var/run doesn't exist yet. But dbus creates, at >> install time, the directory /var/run/dbus without taking care of >> /var/run. So we end up with two different directories /run and >> /var/run. This bug affects more or less all systemd-provided >> utilities, including logind and systemd itself. >> >> This patch create the correct symlink run -> ../run when systemd >> is used as init system. > > This doesn't work in the RO root case. I described this in another > mail to the list, but in the RO root case target/var is a symlink to > target/usr/share/factory/var. Thus this link is actually created as: > > target/usr/share/factory/var/run -> ../run > > It points to target/usr/share/factory/run, which is wrong. Well, as such it is not wrong. What is wrong IMO is that we do: for i in $(TARGET_DIR)/usr/share/factory/var/*; do \ j="$${i#$(TARGET_DIR)/usr/share/factory}"; \ if [ -L "$${i}" ]; then \ printf "L+! %s - - - - %s\n" \ "$${j}" "../usr/share/factory/$${j}" \ || exit 1; \ else \ ... The correct thing to do would be to copy the symlink I think, so something like: if [ -L "$${i}" ]; then \ target=`readlink $${i}` printf "L+! %s - - - - %s\n" \ "$${j}" "$${target}" \ || exit 1; \ However, I believe our var-factory.conf is even more wrong. systemd already supplies /usr/lib/tmpfiles.d/var.conf for exactly this purpose. That one already has the stanza to create the correct /var/run symlink. That var.conf is not complete though. For example, mysql expects /var/lib/mysql to exist while var.conf just creates /var/lib. So we do indeed need something like var-factory.conf, but I think that it should take into account anything that is already created by other tmpfiles configurations. So it should search each file/directory that it finds in /usr/share/factory/var in all of the existing tmpfiles.d entries, and if it is found there and it is not a C entry, it should recurse. Well, that's my feeling, but I'm not a systemd expert :-) Regards, Arnout > In order to > get it to work in the RO case, instead create this link. > > define SKELETON_INIT_SYSTEMD_VAR_RUN_LINK > ln -sf ../../../../run $(TARGET_DIR)/usr/share/factory/var/run > endef > > SKELETON_INIT_SYSTEMD_POST_INSTALL_TARGET_HOOKS += \ > SKELETON_INIT_SYSTEMD_VAR_RUN_LINK > > Then you get a target that looks like this: > > lrwxrwxrwx 1 root root 29 Feb 23 02:35 /var/run -> ../usr/share/factory//var/run > lrwxrwxrwx 1 root root 15 Feb 23 00:51 /usr/share/factory/var/run -> ../../../../run > > On the target, /var/run ends up pointing to /run and also on the host > $TARGET_DIR/var/run points to $TARGET_DIR/run. > _______________________________________________ > buildroot mailing list > buildroot at busybox.net > http://lists.busybox.net/mailman/listinfo/buildroot > -- Arnout Vandecappelle arnout at mind be Senior Embedded Software Architect +32-16-286500 Essensium/Mind http://www.mind.be G.Geenslaan 9, 3001 Leuven, Belgium BE 872 984 063 RPR Leuven LinkedIn profile: http://www.linkedin.com/in/arnoutvandecappelle GPG fingerprint: 7493 020B C7E3 8618 8DEC 222C 82EB F404 F9AC 0DDF ^ permalink raw reply [flat|nested] 7+ messages in thread
* [Buildroot] [PATCH] package/skeleton-init-systemd: create a symlink /var/run to ../run 2018-02-24 18:15 ` Arnout Vandecappelle @ 2018-02-27 19:28 ` Trent Piepho 0 siblings, 0 replies; 7+ messages in thread From: Trent Piepho @ 2018-02-27 19:28 UTC (permalink / raw) To: buildroot On Sat, 2018-02-24 at 19:15 +0100, Arnout Vandecappelle wrote: > > > target/usr/share/factory/var/run -> ../run > > > > It points to target/usr/share/factory/run, which is wrong. > > Well, as such it is not wrong. What is wrong IMO is that we do: > > for i in $(TARGET_DIR)/usr/share/factory/var/*; do \ > j="$${i#$(TARGET_DIR)/usr/share/factory}"; \ > if [ -L "$${i}" ]; then \ > printf "L+! %s - - - - %s\n" \ > "$${j}" "../usr/share/factory/$${j}" \ > || exit 1; \ > else \ > ... > > The correct thing to do would be to copy the symlink I think, so something like: > > if [ -L "$${i}" ]; then \ > target=`readlink $${i}` > printf "L+! %s - - - - %s\n" \ > "$${j}" "$${target}" \ > || exit 1; \ But that ends up with another problem. While the var-factory.conf file will be ok: /var/run - - - - ../run The target tree in the build area is not ok: $ mkdir -p target/var/run/nginx mkdir: cannot create directory ?target/var/run?: File exists The problem is like I said, ${TARGET_DIR}/var is a symlink to ${TARGET_DIR}/usr/share/factory/var. This means the link ${TARGET_DIR}/var/run -> ../run actually points to ${TARGET_DIR}/usr/share/factory/run, which does not exist. So while you do get a valid /var on the target when tmpfiles is creating things, the tree in the build area is broken and any package that tries to create things in ${TARGET_DIR}/var/run (like nginx) will break at target install time. The double symlink that the current tmpfile code in buildroot makes actually works. I suspect that's why it was written that way to begin with. When building, you get: ${TARGET_DIR}/var -> ../usr/share/factory/var ${TARGET_DIR)/usr/share/factory/var/run -> ../../../../run Producing, as desired: ${TARGET_DIR)/var/run -> ${TARGET_DIR}/run Then on the target after tmpfiles has created the links: /var is a directory /var/run -> ../usr/share/factory/var/run /usr/share/factory/var/run -> ../../../../run Producing, again as desired: /var/run -> /run It would be simpler to just use explicit tmpfiles entries to make everything, but one needs a valid target tree when building too. Thus the process of creating tmpfiles entries from the target tree. > However, I believe our var-factory.conf is even more wrong. systemd already > supplies /usr/lib/tmpfiles.d/var.conf for exactly this purpose. That one already > has the stanza to create the correct /var/run symlink. That var.conf is not > complete though. For example, mysql expects /var/lib/mysql to exist while > var.conf just creates /var/lib. So we do indeed need something like > var-factory.conf, but I think that it should take into account anything that is > already created by other tmpfiles configurations. So it should search each > file/directory that it finds in /usr/share/factory/var in all of the existing > tmpfiles.d entries, and if it is found there and it is not a C entry, it should > recurse. If buildroot were to create /etc/tmpfile.d/var.conf, instead of var- factory.conf, it would override the systemd supplied var.conf rather than augmenting it. This is what I do to make RO rootfs work. In my overlay, I have an my own var.conf file in /etc to override the systemd one. Mine does not have the /var/run symlink, since buildroot will produces this. A useful RO root likely also needs a persistent writable partition, for instance to store logs. So I also have lines to make /var/log persistent in the replacement for the systemd var.conf file. ^ permalink raw reply [flat|nested] 7+ messages in thread
* [Buildroot] [PATCH] package/skeleton-init-systemd: create a symlink /var/run to ../run 2018-02-23 18:25 ` Trent Piepho 2018-02-24 18:15 ` Arnout Vandecappelle @ 2018-02-25 19:16 ` Romain Naour 2018-02-27 18:37 ` Trent Piepho 1 sibling, 1 reply; 7+ messages in thread From: Romain Naour @ 2018-02-25 19:16 UTC (permalink / raw) To: buildroot Hi Trent, Le 23/02/2018 ? 19:25, Trent Piepho a ?crit?: > On Thu, 2018-02-22 at 23:10 +0100, Romain Naour wrote: >> As reported by J?r?my Rosen [1] and Jan Kundr?t (RO case)[2], systemd >> looks for the dbus socket in /run/dbus instead of /var/run/dbus which >> is not where dbus puts the socket. This is a change introduced with >> the last version bump v237 [3]. >> >> The file /usr/lib/tmpfiles.d/var.con will create automatically that >> symlink at bootup /var/run doesn't exist yet. But dbus creates, at >> install time, the directory /var/run/dbus without taking care of >> /var/run. So we end up with two different directories /run and >> /var/run. This bug affects more or less all systemd-provided >> utilities, including logind and systemd itself. >> >> This patch create the correct symlink run -> ../run when systemd >> is used as init system. > > This doesn't work in the RO root case. Indeed, but I'm testing/fixing the RW case with this patch (BR2_TARGET_GENERIC_REMOUNT_ROOTFS_RW). > I described this in another > mail to the list, but in the RO root case target/var is a symlink to > target/usr/share/factory/var. Thus this link is actually created as: > > target/usr/share/factory/var/run -> ../run The symlink is only created when BR2_TARGET_GENERIC_REMOUNT_ROOTFS_RW is set. The RO behavior is left unchanged. > > It points to target/usr/share/factory/run, which is wrong. In order to > get it to work in the RO case, instead create this link. > > define SKELETON_INIT_SYSTEMD_VAR_RUN_LINK > ln -sf ../../../../run $(TARGET_DIR)/usr/share/factory/var/run > endef > > SKELETON_INIT_SYSTEMD_POST_INSTALL_TARGET_HOOKS += \ > SKELETON_INIT_SYSTEMD_VAR_RUN_LINK > > Then you get a target that looks like this: > > lrwxrwxrwx 1 root root 29 Feb 23 02:35 /var/run -> ../usr/share/factory//var/run > lrwxrwxrwx 1 root root 15 Feb 23 00:51 /usr/share/factory/var/run -> ../../../../run > > On the target, /var/run ends up pointing to /run and also on the host > $TARGET_DIR/var/run points to $TARGET_DIR/run. > The RO case can be fixed in a follow up patch or you can rework this patch with your modifications. Maybe Adam can help here. Adam, you bumped systemd to v237 can you have a look ? Best regards, Romain ^ permalink raw reply [flat|nested] 7+ messages in thread
* [Buildroot] [PATCH] package/skeleton-init-systemd: create a symlink /var/run to ../run 2018-02-25 19:16 ` Romain Naour @ 2018-02-27 18:37 ` Trent Piepho 2018-02-27 21:24 ` Pierre 0 siblings, 1 reply; 7+ messages in thread From: Trent Piepho @ 2018-02-27 18:37 UTC (permalink / raw) To: buildroot On Sun, 2018-02-25 at 20:16 +0100, Romain Naour wrote: > The file /usr/lib/tmpfiles.d/var.con will create automatically that > > > symlink at bootup /var/run doesn't exist yet. But dbus creates, at > > > install time, the directory /var/run/dbus without taking care of > > > /var/run. So we end up with two different directories /run and > > > /var/run. This bug affects more or less all systemd-provided > > > utilities, including logind and systemd itself. > > > > > > This patch create the correct symlink run -> ../run when systemd > > > is used as init system. > > > > This doesn't work in the RO root case. > > Indeed, but I'm testing/fixing the RW case with this patch > (BR2_TARGET_GENERIC_REMOUNT_ROOTFS_RW). I should have said that differently. RO root has the same problem, but this link will not solve it. I believe the link: ln -sf ../../../../run $(TARGET_DIR)/usr/share/factory/var/run will fix the RO case. But of course does not work in the RW case. I can send a follow on patch to add this link for RO. But I wish there was some other method that could solve the problem for both RW and RO, without needing to add special cases like this link. ^ permalink raw reply [flat|nested] 7+ messages in thread
* [Buildroot] [PATCH] package/skeleton-init-systemd: create a symlink /var/run to ../run 2018-02-27 18:37 ` Trent Piepho @ 2018-02-27 21:24 ` Pierre 0 siblings, 0 replies; 7+ messages in thread From: Pierre @ 2018-02-27 21:24 UTC (permalink / raw) To: buildroot On Tuesday, February 27, 2018 7:37:54 PM CET Trent Piepho wrote: > On Sun, 2018-02-25 at 20:16 +0100, Romain Naour wrote: > > The file /usr/lib/tmpfiles.d/var.con will create automatically that > > > > > > symlink at bootup /var/run doesn't exist yet. But dbus creates, at > > > > install time, the directory /var/run/dbus without taking care of > > > > /var/run. So we end up with two different directories /run and > > > > /var/run. This bug affects more or less all systemd-provided > > > > utilities, including logind and systemd itself. > > > > > > > > This patch create the correct symlink run -> ../run when systemd > > > > is used as init system. > > > > > > This doesn't work in the RO root case. > > > > Indeed, but I'm testing/fixing the RW case with this patch > > (BR2_TARGET_GENERIC_REMOUNT_ROOTFS_RW). > > I should have said that differently. RO root has the same problem, but > this link will not solve it. > > I believe the link: > ln -sf ../../../../run $(TARGET_DIR)/usr/share/factory/var/run > > will fix the RO case. But of course does not work in the RW case. > > I can send a follow on patch to add this link for RO. > > But I wish there was some other method that could solve the problem for > both RW and RO, without needing to add special cases like this link. I'm new to buildroot but got hit by that bug and after reading this thread I don't really understand why this would not work with RW. It's quite dirty, but a link to ../../../{repeat?}/run will end up linking to /run since /.. is a link to / -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 833 bytes Desc: This is a digitally signed message part. URL: <http://lists.busybox.net/pipermail/buildroot/attachments/20180227/9df6d8ba/attachment.asc> ^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2018-02-27 21:24 UTC | newest] Thread overview: 7+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2018-02-22 22:10 [Buildroot] [PATCH] package/skeleton-init-systemd: create a symlink /var/run to ../run Romain Naour 2018-02-23 18:25 ` Trent Piepho 2018-02-24 18:15 ` Arnout Vandecappelle 2018-02-27 19:28 ` Trent Piepho 2018-02-25 19:16 ` Romain Naour 2018-02-27 18:37 ` Trent Piepho 2018-02-27 21:24 ` Pierre
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox