<div dir="ltr">Why are you adding a new mount.sh at <span style="font-size:12.800000190734863px">meta/recipes-core/udev/mount.</span><wbr style="font-size:12.800000190734863px"><span style="font-size:12.800000190734863px">sh </span>rather than updating the existing one at meta/recipes-core/udev/udev-extraconf/mount.sh?</div><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Apr 9, 2018 at 12:28 AM, Hongzhi.Song <span dir="ltr">&lt;<a href="mailto:hongzhi.song@windriver.com" target="_blank">hongzhi.song@windriver.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">This patch fixs the problem that block devices unable to be formatted when<br>
systemd and udev-extraconf recipes added into rootfs.<br>
<br>
If we add systemd and udev-extraconf recipes into rootfs:<br>
    VIRTUAL-RUNTIME_init_manager = &quot;systemd&quot;<br>
    DISTRO_FEATURES_append = &quot; systemd&quot;<br>
    DISTRO_FEATURES_BACKFILL_<wbr>CONSIDERED += &quot;sysvinit&quot;<br>
    KERNEL_FEATURES_append = &quot; cfg/systemd.scc&quot;<br>
    IMAGE_INSTALL_append = &quot; udev-extraconf&quot;<br>
    IMAGE_FSTYPES += &quot;tar.bz2 ext4&quot;<br>
    IMAGE_INSTALL_append = &quot; e2fsprogs-mke2fs&quot;<br>
then systemd-udevd.service will invoke udev rules to automount block devices<br>
any probed under itself private namespace, this behavior results in host space<br>
can&#39;t format those devices. And host space can&#39;t find where the device is used.<br>
Such as:<br>
    root@qemux86:~# mkfs.ext4 /dev/sda1<br>
    mke2fs 1.43.8 (1-Jan-2018)<br>
    /dev/sda1 contains a ext4 file system<br>
            last mounted on Tue Apr  3 06:22:41 2018<br>
    Proceed anyway? (y,N) y<br>
    /dev/sda1 is apparently in use by the system; will not make a filesystem here!<br>
<br>
Command systemd-mount recommended by systemd maintainer instead of command mount<br>
will fix the problem brought with private namespace. Systemd-mount request the<br>
mount operation to be executed by PID 1, and hence host space can access the block<br>
devices.<br>
<br>
[YOCTO #12644]<br>
<br>
Signed-off-by: Hongzhi.Song &lt;<a href="mailto:hongzhi.song@windriver.com">hongzhi.song@windriver.com</a>&gt;<br>
---<br>
 meta/recipes-core/udev/mount.<wbr>sh | 141 ++++++++++++++++++++++++++++++<wbr>++++++++++<br>
 1 file changed, 141 insertions(+)<br>
 create mode 100644 meta/recipes-core/udev/mount.<wbr>sh<br>
<br>
diff --git a/meta/recipes-core/udev/<wbr>mount.sh b/meta/recipes-core/udev/<wbr>mount.sh<br>
new file mode 100644<br>
index 0000000..2fa2925<br>
--- /dev/null<br>
+++ b/meta/recipes-core/udev/<wbr>mount.sh<br>
@@ -0,0 +1,141 @@<br>
+#!/bin/sh<br>
+#<br>
+# Called from udev<br>
+#<br>
+# Attempt to mount any added block devices and umount any removed devices<br>
+<br>
+<br>
+BASE_INIT=&quot;`readlink &quot;/sbin/init&quot;`&quot;<br>
+INIT_SYSTEMD=&quot;/lib/systemd/<wbr>systemd&quot;<br>
+<br>
+if [ &quot;x$BASE_INIT&quot; = &quot;x$INIT_SYSTEMD&quot; ];then<br>
+       # systemd as init uses systemd-mount to mount block devices<br>
+        MOUNT=&quot;/usr/bin/systemd-mount&quot;<br>
+        UMOUNT=&quot;/usr/bin/systemd-<wbr>umount&quot;<br>
+<br>
+        if [ -x $MOUNT ] &amp;&amp; [ -x $UMOUNT ];<br>
+        then<br>
+                logger &quot;Using systemd-mount to finish mount&quot;<br>
+        else<br>
+                logger &quot;Linux init is using systemd, so please install systemd-mount to finish mount&quot;<br>
+               exit 1<br>
+        fi<br>
+else<br>
+        MOUNT=&quot;/bin/mount&quot;<br>
+        UMOUNT=&quot;/bin/umount&quot;<br>
+fi<br>
+<br>
+PMOUNT=&quot;/usr/bin/pmount&quot;<br>
+<br>
+for line in `grep -h -v ^# /etc/udev/mount.blacklist /etc/udev/mount.blacklist.d/*`<br>
+do<br>
+       if [ ` expr match &quot;$DEVNAME&quot; &quot;$line&quot; ` -gt 0 ];<br>
+       then<br>
+               logger &quot;udev/mount.sh&quot; &quot;[$DEVNAME] is blacklisted, ignoring&quot;<br>
+               exit 0<br>
+       fi<br>
+done<br>
+<br>
+automount_systemd() {<br>
+        name=&quot;`basename &quot;$DEVNAME&quot;`&quot;<br>
+<br>
+        ! test -d &quot;/run/media/$name&quot; &amp;&amp; mkdir -p &quot;/run/media/$name&quot;<br>
+<br>
+        MOUNT=&quot;$MOUNT -o silent&quot;<br>
+<br>
+        # If filesystemtype is vfat, change the ownership group to &#39;disk&#39;, and<br>
+        # grant it with  w/r/x permissions.<br>
+        case $ID_FS_TYPE in<br>
+        vfat|fat)<br>
+                MOUNT=&quot;$MOUNT -o umask=007,gid=`awk -F&#39;:&#39; &#39;/^disk/{print $3}&#39; /etc/group`&quot;<br>
+                ;;<br>
+        # TODO<br>
+        *)<br>
+                ;;<br>
+        esac<br>
+<br>
+        if ! $MOUNT --no-block -t auto $DEVNAME &quot;/run/media/$name&quot;<br>
+        then<br>
+                #logger &quot;<a href="http://mount.sh/automount" rel="noreferrer" target="_blank">mount.sh/automount</a>&quot; &quot;$MOUNT -t auto $DEVNAME \&quot;/run/media/$name\&quot; failed!&quot;<br>
+                rm_dir &quot;/run/media/$name&quot;<br>
+        else<br>
+                logger &quot;<a href="http://mount.sh/automount" rel="noreferrer" target="_blank">mount.sh/automount</a>&quot; &quot;Auto-mount of [/run/media/$name] successful&quot;<br>
+                touch &quot;/tmp/.automount-$name&quot;<br>
+        fi<br>
+}<br>
+<br>
+automount() {<br>
+       name=&quot;`basename &quot;$DEVNAME&quot;`&quot;<br>
+<br>
+       ! test -d &quot;/run/media/$name&quot; &amp;&amp; mkdir -p &quot;/run/media/$name&quot;<br>
+       # Silent util-linux&#39;s version of mounting auto<br>
+       if [ &quot;x`readlink $MOUNT`&quot; = &quot;x/bin/mount.util-linux&quot; ] ;<br>
+       then<br>
+               MOUNT=&quot;$MOUNT -o silent&quot;<br>
+       fi<br>
+<br>
+       # If filesystem type is vfat, change the ownership group to &#39;disk&#39;, and<br>
+       # grant it with  w/r/x permissions.<br>
+       case $ID_FS_TYPE in<br>
+       vfat|fat)<br>
+               MOUNT=&quot;$MOUNT -o umask=007,gid=`awk -F&#39;:&#39; &#39;/^disk/{print $3}&#39; /etc/group`&quot;<br>
+               ;;<br>
+       # TODO<br>
+       *)<br>
+               ;;<br>
+       esac<br>
+<br>
+       if ! $MOUNT -t auto $DEVNAME &quot;/run/media/$name&quot;<br>
+       then<br>
+               #logger &quot;<a href="http://mount.sh/automount" rel="noreferrer" target="_blank">mount.sh/automount</a>&quot; &quot;$MOUNT -t auto $DEVNAME \&quot;/run/media/$name\&quot; failed!&quot;<br>
+               rm_dir &quot;/run/media/$name&quot;<br>
+       else<br>
+               logger &quot;<a href="http://mount.sh/automount" rel="noreferrer" target="_blank">mount.sh/automount</a>&quot; &quot;Auto-mount of [/run/media/$name] successful&quot;<br>
+               touch &quot;/tmp/.automount-$name&quot;<br>
+       fi<br>
+}<br>
+<br>
+rm_dir() {<br>
+       # We do not want to rm -r populated directories<br>
+       if test &quot;`find &quot;$1&quot; | wc -l | tr -d &quot; &quot;`&quot; -lt 2 -a -d &quot;$1&quot;<br>
+       then<br>
+               ! test -z &quot;$1&quot; &amp;&amp; rm -r &quot;$1&quot;<br>
+       else<br>
+               logger &quot;<a href="http://mount.sh/automount" rel="noreferrer" target="_blank">mount.sh/automount</a>&quot; &quot;Not removing non-empty directory [$1]&quot;<br>
+       fi<br>
+}<br>
+<br>
+# No ID_FS_TYPE for cdrom device, yet it should be mounted<br>
+name=&quot;`basename &quot;$DEVNAME&quot;`&quot;<br>
+[ -e /sys/block/$name/device/media ] &amp;&amp; media_type=`cat /sys/block/$name/device/media`<br>
+<br>
+if [ &quot;$ACTION&quot; = &quot;add&quot; ] &amp;&amp; [ -n &quot;$DEVNAME&quot; ] &amp;&amp; [ -n &quot;$ID_FS_TYPE&quot; -o &quot;$media_type&quot; = &quot;cdrom&quot; ]; then<br>
+       if [ -x &quot;$PMOUNT&quot; ]; then<br>
+               $PMOUNT $DEVNAME 2&gt; /dev/null<br>
+       elif [ -x $MOUNT ]; then<br>
+               $MOUNT $DEVNAME 2&gt; /dev/null<br>
+       fi<br>
+<br>
+       # If the device isn&#39;t mounted at this point, it isn&#39;t<br>
+       # configured in fstab (note the root filesystem can show up as<br>
+       # /dev/root in /proc/mounts, so check the device number too)<br>
+        if expr $MAJOR &quot;*&quot; 256 + $MINOR != `stat -c %d /`; then<br>
+                if [ &quot;`basename $MOUNT`&quot; = &quot;systemd-mount&quot; ];then<br>
+                        grep -q &quot;^$DEVNAME &quot; /proc/mounts || automount_systemd<br>
+                else<br>
+                        grep -q &quot;^$DEVNAME &quot; /proc/mounts || automount<br>
+                fi<br>
+        fi<br>
+fi<br>
+<br>
+<br>
+if [ &quot;$ACTION&quot; = &quot;remove&quot; ] || [ &quot;$ACTION&quot; = &quot;change&quot; ] &amp;&amp; [ -x &quot;$UMOUNT&quot; ] &amp;&amp; [ -n &quot;$DEVNAME&quot; ]; then<br>
+       for mnt in `cat /proc/mounts | grep &quot;$DEVNAME&quot; | cut -f 2 -d &quot; &quot; `<br>
+       do<br>
+               $UMOUNT $mnt<br>
+       done<br>
+<br>
+       # Remove empty directories from auto-mounter<br>
+       name=&quot;`basename &quot;$DEVNAME&quot;`&quot;<br>
+       test -e &quot;/tmp/.automount-$name&quot; &amp;&amp; rm_dir &quot;/run/media/$name&quot;<br>
+fi<br>
<span class="HOEnZb"><font color="#888888">--<br>
2.8.1<br>
<br>
--<br>
______________________________<wbr>_________________<br>
Openembedded-core mailing list<br>
<a href="mailto:Openembedded-core@lists.openembedded.org">Openembedded-core@lists.<wbr>openembedded.org</a><br>
<a href="http://lists.openembedded.org/mailman/listinfo/openembedded-core" rel="noreferrer" target="_blank">http://lists.openembedded.org/<wbr>mailman/listinfo/openembedded-<wbr>core</a><br>
</font></span></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><div><div dir="ltr">Christopher Larson<br>kergoth at gmail dot com<br>Founder - BitBake, OpenEmbedded, OpenZaurus<br>Senior Software Engineer, Mentor Graphics</div></div></div></div>
</div>