eudev: create static-nodes in init script

Message ID 20220519085658.3796309-1-changqing.li@windriver.com
State Accepted, archived
Commit 10940ee60864500f037a73d8bde8d74f9917959c
Headers show
Series eudev: create static-nodes in init script | expand

Commit Message

Changqing Li May 19, 2022, 8:56 a.m. UTC
From: Changqing Li <changqing.li@windriver.com>

dev in modules.devname should be populated in /dev on boot.  remove
create static mode from udevd will make these devices cannot be
populated. Since commit [1], when use sysVinit, devices like
/dev/net/tun will not be created.

more info:
udevd in systemd also remove create static mode in udevd, but using
service kmod-static-nodes.service and systemd-tmpfiles-setup-dev.service
in systemd to create these node, so systemd works well.

For sysV, parse kmod static-nodes and generate the device nodes in init

[1] https://gitweb.gentoo.org/proj/eudev.git/commit/?id=2b7abd5ec9cc47a8b895df6db77fb1537c6f1a39

Signed-off-by: Changqing Li <changqing.li@windriver.com>
---
 meta/recipes-core/udev/eudev/init      | 36 ++++++++++++++++++++++++++
 meta/recipes-core/udev/eudev_3.2.11.bb |  2 ++
 2 files changed, 38 insertions(+)

Comments

Alex Kiernan May 19, 2022, 2:14 p.m. UTC | #1
On Thu, May 19, 2022 at 9:57 AM <changqing.li@windriver.com> wrote:
>
> From: Changqing Li <changqing.li@windriver.com>
>
> dev in modules.devname should be populated in /dev on boot.  remove
> create static mode from udevd will make these devices cannot be
> populated. Since commit [1], when use sysVinit, devices like
> /dev/net/tun will not be created.
>
> more info:
> udevd in systemd also remove create static mode in udevd, but using
> service kmod-static-nodes.service and systemd-tmpfiles-setup-dev.service
> in systemd to create these node, so systemd works well.
>
> For sysV, parse kmod static-nodes and generate the device nodes in init
>
> [1] https://gitweb.gentoo.org/proj/eudev.git/commit/?id=2b7abd5ec9cc47a8b895df6db77fb1537c6f1a39
>
> Signed-off-by: Changqing Li <changqing.li@windriver.com>
> ---
>  meta/recipes-core/udev/eudev/init      | 36 ++++++++++++++++++++++++++
>  meta/recipes-core/udev/eudev_3.2.11.bb |  2 ++
>  2 files changed, 38 insertions(+)
>
> diff --git a/meta/recipes-core/udev/eudev/init b/meta/recipes-core/udev/eudev/init
> index c60dbbf6d5..5c2fb4a9fb 100644
> --- a/meta/recipes-core/udev/eudev/init
> +++ b/meta/recipes-core/udev/eudev/init
> @@ -23,6 +23,41 @@ kill_udevd () {
>      [ -n "$pid" ] && kill $pid
>  }
>
> +make_static_nodes () {
> +    [ -e /lib/modules/$(uname -r)/modules.devname ] || return 0
> +    [ -x @KMOD@ ] || return 0
> +
> +    kmod static-nodes --format=tmpfiles --output=/proc/self/fd/1 |

Is that --output=... really needed? Also if we're substituting for the
full kmod path with @KMOD@ we should do the same here.

> +    while read TTYPE TPATH TMODE TUSER TGROUP TAGE TARG; do
> +    case "${TTYPE}" in
> +    'd')
> +            test -d "${TPATH}" || mkdir -p -m "${TMODE}" "${TPATH}"
> +            ;;
> +
> +    'c!')
> +            if [ ! -c "${TPATH}" ]; then
> +                    old_ifs="${IFS}"
> +                    IFS=:
> +                    set -- ${TARG}
> +                    IFS="${old_ifs}"
> +                    mknod -m "${TMODE}" "${TPATH}" c "$@"
> +            fi
> +            ;;
> +
> +    *)
> +            echo ERROR
> +            exit 1

I don't know what the right answer is if you end up here - blundering
on regardless I guess is more typical behaviour for sysvinit, so just
use a better error message and don't exit?

> +            ;;
> +    esac
> +    if [ "${TUSER}" != "-" ]; then
> +            chown "${TUSER}" "${TPATH}"
> +    fi
> +    if [ "${TGROUP}" != "-" ]; then
> +            chgrp "${TGROUP}" "${TPATH}"
> +    fi
> +    done
> +}
> +
>  case "$1" in
>    start)
>      export ACTION=add
> @@ -51,6 +86,7 @@ case "$1" in
>      # make_extra_nodes
>      kill_udevd > "/dev/null" 2>&1
>
> +    make_static_nodes
>      # trigger the sorted events
>      [ -e /proc/sys/kernel/hotplug ] && printf '\0\n' >/proc/sys/kernel/hotplug
>      @UDEVD@ -d
> diff --git a/meta/recipes-core/udev/eudev_3.2.11.bb b/meta/recipes-core/udev/eudev_3.2.11.bb
> index 841039f6d7..e4f78c2b0c 100644
> --- a/meta/recipes-core/udev/eudev_3.2.11.bb
> +++ b/meta/recipes-core/udev/eudev_3.2.11.bb
> @@ -41,6 +41,7 @@ do_install:append() {
>         install -d ${D}${sysconfdir}/init.d
>         install -m 0755 ${WORKDIR}/init ${D}${sysconfdir}/init.d/udev
>         sed -i s%@UDEVD@%${base_sbindir}/udevd% ${D}${sysconfdir}/init.d/udev
> +       sed -i s%@KMOD@%${base_sbindir}/kmod% ${D}${sysconfdir}/init.d/udev
>
>         install -d ${D}${sysconfdir}/udev/rules.d
>         install -m 0644 ${WORKDIR}/local.rules ${D}${sysconfdir}/udev/rules.d/local.rules
> @@ -73,6 +74,7 @@ FILES:libudev = "${base_libdir}/libudev.so.*"
>  FILES:eudev-hwdb = "${sysconfdir}/udev/hwdb.d"
>
>  RDEPENDS:eudev-hwdb += "eudev"
> +RDEPENDS:eudev += "kmod"
>
>  RPROVIDES:${PN} = "hotplug udev"
>  RPROVIDES:eudev-hwdb += "udev-hwdb"
> --
> 2.25.1
>
Alex Kiernan May 20, 2022, 6:54 a.m. UTC | #2
On Fri, May 20, 2022 at 6:32 AM Li, Changqing
<Changqing.Li@windriver.com> wrote:
>
>
>
> ________________________________
> From: Alex Kiernan <alex.kiernan@gmail.com>
> Sent: Thursday, May 19, 2022 10:14 PM
> To: Li, Changqing <Changqing.Li@windriver.com>
> Cc: Patches and discussions about the oe-core layer <openembedded-core@lists.openembedded.org>; Richard Purdie <richard.purdie@linuxfoundation.org>
> Subject: Re: [PATCH] eudev: create static-nodes in init script
>
> [Please note: This e-mail is from an EXTERNAL e-mail address]
>
> On Thu, May 19, 2022 at 9:57 AM <changqing.li@windriver.com> wrote:
> >
> > From: Changqing Li <changqing.li@windriver.com>
> >
> > dev in modules.devname should be populated in /dev on boot.  remove
> > create static mode from udevd will make these devices cannot be
> > populated. Since commit [1], when use sysVinit, devices like
> > /dev/net/tun will not be created.
> >
> > more info:
> > udevd in systemd also remove create static mode in udevd, but using
> > service kmod-static-nodes.service and systemd-tmpfiles-setup-dev.service
> > in systemd to create these node, so systemd works well.
> >
> > For sysV, parse kmod static-nodes and generate the device nodes in init
> >
> > [1] https://gitweb.gentoo.org/proj/eudev.git/commit/?id=2b7abd5ec9cc47a8b895df6db77fb1537c6f1a39
> >
> > Signed-off-by: Changqing Li <changqing.li@windriver.com>
> > ---
> >  meta/recipes-core/udev/eudev/init      | 36 ++++++++++++++++++++++++++
> >  meta/recipes-core/udev/eudev_3.2.11.bb |  2 ++
> >  2 files changed, 38 insertions(+)
> >
> > diff --git a/meta/recipes-core/udev/eudev/init b/meta/recipes-core/udev/eudev/init
> > index c60dbbf6d5..5c2fb4a9fb 100644
> > --- a/meta/recipes-core/udev/eudev/init
> > +++ b/meta/recipes-core/udev/eudev/init
> > @@ -23,6 +23,41 @@ kill_udevd () {
> >      [ -n "$pid" ] && kill $pid
> >  }
> >
> > +make_static_nodes () {
> > +    [ -e /lib/modules/$(uname -r)/modules.devname ] || return 0
> > +    [ -x @KMOD@ ] || return 0
> > +
> > +    kmod static-nodes --format=tmpfiles --output=/proc/self/fd/1 |
>
> Is that --output=... really needed?
>
> add output since kmod output to /dev/stdout by default,but we run make_static_nodes before udevd,
> /dev/stdout is created by udevd.
>

Oh, that's interesting - I suspect it's worth capturing as a comment
so the next person looking at it doesn't have the same question as me!

> Also if we're substituting for the full kmod path with @KMOD@ we should do the same here.
> OK.
>
> > +    while read TTYPE TPATH TMODE TUSER TGROUP TAGE TARG; do
> > +    case "${TTYPE}" in
> > +    'd')
> > +            test -d "${TPATH}" || mkdir -p -m "${TMODE}" "${TPATH}"
> > +            ;;
> > +
> > +    'c!')
> > +            if [ ! -c "${TPATH}" ]; then
> > +                    old_ifs="${IFS}"
> > +                    IFS=:
> > +                    set -- ${TARG}
> > +                    IFS="${old_ifs}"
> > +                    mknod -m "${TMODE}" "${TPATH}" c "$@"
> > +            fi
> > +            ;;
> > +
> > +    *)
> > +            echo ERROR
> > +            exit 1
>
> I don't know what the right answer is if you end up here - blundering
> on regardless I guess is more typical behaviour for sysvinit, so just
> use a better error message and don't exit?
>
> Get this.
>
> > +            ;;
> > +    esac
> > +    if [ "${TUSER}" != "-" ]; then
> > +            chown "${TUSER}" "${TPATH}"
> > +    fi
> > +    if [ "${TGROUP}" != "-" ]; then
> > +            chgrp "${TGROUP}" "${TPATH}"
> > +    fi
> > +    done
> > +}
> > +
> >  case "$1" in
> >    start)
> >      export ACTION=add
> > @@ -51,6 +86,7 @@ case "$1" in
> >      # make_extra_nodes
> >      kill_udevd > "/dev/null" 2>&1
> >
> > +    make_static_nodes
> >      # trigger the sorted events
> >      [ -e /proc/sys/kernel/hotplug ] && printf '\0\n' >/proc/sys/kernel/hotplug
> >      @UDEVD@ -d
> > diff --git a/meta/recipes-core/udev/eudev_3.2.11.bb b/meta/recipes-core/udev/eudev_3.2.11.bb
> > index 841039f6d7..e4f78c2b0c 100644
> > --- a/meta/recipes-core/udev/eudev_3.2.11.bb
> > +++ b/meta/recipes-core/udev/eudev_3.2.11.bb
> > @@ -41,6 +41,7 @@ do_install:append() {
> >         install -d ${D}${sysconfdir}/init.d
> >         install -m 0755 ${WORKDIR}/init ${D}${sysconfdir}/init.d/udev
> >         sed -i s%@UDEVD@%${base_sbindir}/udevd% ${D}${sysconfdir}/init.d/udev
> > +       sed -i s%@KMOD@%${base_sbindir}/kmod% ${D}${sysconfdir}/init.d/udev
> >
> >         install -d ${D}${sysconfdir}/udev/rules.d
> >         install -m 0644 ${WORKDIR}/local.rules ${D}${sysconfdir}/udev/rules.d/local.rules
> > @@ -73,6 +74,7 @@ FILES:libudev = "${base_libdir}/libudev.so.*"
> >  FILES:eudev-hwdb = "${sysconfdir}/udev/hwdb.d"
> >
> >  RDEPENDS:eudev-hwdb += "eudev"
> > +RDEPENDS:eudev += "kmod"
> >
> >  RPROVIDES:${PN} = "hotplug udev"
> >  RPROVIDES:eudev-hwdb += "udev-hwdb"
> > --
> > 2.25.1
> >
>
>
> --
> Alex Kiernan

Patch

diff --git a/meta/recipes-core/udev/eudev/init b/meta/recipes-core/udev/eudev/init
index c60dbbf6d5..5c2fb4a9fb 100644
--- a/meta/recipes-core/udev/eudev/init
+++ b/meta/recipes-core/udev/eudev/init
@@ -23,6 +23,41 @@  kill_udevd () {
     [ -n "$pid" ] && kill $pid
 }
 
+make_static_nodes () {
+    [ -e /lib/modules/$(uname -r)/modules.devname ] || return 0
+    [ -x @KMOD@ ] || return 0
+
+    kmod static-nodes --format=tmpfiles --output=/proc/self/fd/1 |
+    while read TTYPE TPATH TMODE TUSER TGROUP TAGE TARG; do
+    case "${TTYPE}" in
+    'd')
+            test -d "${TPATH}" || mkdir -p -m "${TMODE}" "${TPATH}"
+            ;;
+
+    'c!')
+            if [ ! -c "${TPATH}" ]; then
+                    old_ifs="${IFS}"
+                    IFS=:
+                    set -- ${TARG}
+                    IFS="${old_ifs}"
+                    mknod -m "${TMODE}" "${TPATH}" c "$@"
+            fi
+            ;;
+
+    *)
+            echo ERROR
+            exit 1
+            ;;
+    esac
+    if [ "${TUSER}" != "-" ]; then
+            chown "${TUSER}" "${TPATH}"
+    fi
+    if [ "${TGROUP}" != "-" ]; then
+            chgrp "${TGROUP}" "${TPATH}"
+    fi
+    done
+}
+
 case "$1" in
   start)
     export ACTION=add
@@ -51,6 +86,7 @@  case "$1" in
     # make_extra_nodes
     kill_udevd > "/dev/null" 2>&1
 
+    make_static_nodes
     # trigger the sorted events
     [ -e /proc/sys/kernel/hotplug ] && printf '\0\n' >/proc/sys/kernel/hotplug
     @UDEVD@ -d
diff --git a/meta/recipes-core/udev/eudev_3.2.11.bb b/meta/recipes-core/udev/eudev_3.2.11.bb
index 841039f6d7..e4f78c2b0c 100644
--- a/meta/recipes-core/udev/eudev_3.2.11.bb
+++ b/meta/recipes-core/udev/eudev_3.2.11.bb
@@ -41,6 +41,7 @@  do_install:append() {
 	install -d ${D}${sysconfdir}/init.d
 	install -m 0755 ${WORKDIR}/init ${D}${sysconfdir}/init.d/udev
 	sed -i s%@UDEVD@%${base_sbindir}/udevd% ${D}${sysconfdir}/init.d/udev
+	sed -i s%@KMOD@%${base_sbindir}/kmod% ${D}${sysconfdir}/init.d/udev
 
 	install -d ${D}${sysconfdir}/udev/rules.d
 	install -m 0644 ${WORKDIR}/local.rules ${D}${sysconfdir}/udev/rules.d/local.rules
@@ -73,6 +74,7 @@  FILES:libudev = "${base_libdir}/libudev.so.*"
 FILES:eudev-hwdb = "${sysconfdir}/udev/hwdb.d"
 
 RDEPENDS:eudev-hwdb += "eudev"
+RDEPENDS:eudev += "kmod"
 
 RPROVIDES:${PN} = "hotplug udev"
 RPROVIDES:eudev-hwdb += "udev-hwdb"