On 2018-04-22 11:37 PM, Hongzhi, Song wrote:
ping

Please be patient.

0e-core-2.5 rc1 is being tested now and only critical blocking fixes are being accepted.

Once the results of 2.5 tests are good, then commits such as this one
can be added to the master[-next] branch and then later cherry-picked back to 2.5.1
if needed.

Give people a few days (or more if things don't go well) to get 2.5 out the door.

../Randy


// Hongzhi


On 2018年04月17日 15:03, Hongzhi.Song wrote:
Udev-extraconf works correctly with sysvinit in the aspect of automounting block devices. But it has a serious problem in case of systemd. Block devices
automounted by udev is unaccessible to host space(out of udevd's private
namespace). For example, we cannot format those block devices.

e.g.
     root@qemux86:~# mkfs.ext4 /dev/sda1
     mke2fs 1.43.8 (1-Jan-2018)
     /dev/sda1 contains a ext4 file system
     last mounted on Tue Apr  3 06:22:41 2018
     Proceed anyway? (y,N) y
     /dev/sda1 is apparently in use by the system; will not make a filesystem here!

Other distributions has no such problem, because they use a series of rules to manager block devices. Different types of block devices match different rules. But udev-extraconf just use one rule, automount.rules, which results in this
problem.

The 'systemd-mount' command is recommended by the systemd community to solve such
problems.

This patch makes use of 'systemd-mount' to solve the above problem.

[YOCTO #12644]

Signed-off-by: Hongzhi.Song <hongzhi.s...@windriver.com>
---
  meta/recipes-core/udev/udev-extraconf/mount.sh | 83 ++++++++++++++++++++------
  meta/recipes-core/udev/udev-extraconf_1.1.bb   |  3 +
  2 files changed, 69 insertions(+), 17 deletions(-)

diff --git a/meta/recipes-core/udev/udev-extraconf/mount.sh b/meta/recipes-core/udev/udev-extraconf/mount.sh
index d760328..067d4e2 100644
--- a/meta/recipes-core/udev/udev-extraconf/mount.sh
+++ b/meta/recipes-core/udev/udev-extraconf/mount.sh
@@ -4,10 +4,28 @@
  #
  # Attempt to mount any added block devices and umount any removed devices
  +BASE_INIT="`readlink "@base_sbindir@/init"`"
+INIT_SYSTEMD="@systemd_unitdir@/systemd"
+
+if [ "x$BASE_INIT" = "x$INIT_SYSTEMD" ];then
+    # systemd as init uses systemd-mount to mount block devices
+    MOUNT="/usr/bin/systemd-mount"
+    UMOUNT="/usr/bin/systemd-umount"
+
+    if [ -x $MOUNT ] && [ -x $UMOUNT ];
+    then
+        logger "Using systemd-mount to finish mount"
+    else
+        logger "Linux init is using systemd, so please install systemd-mount to finish mount"
+        exit 1
+    fi
+else
+    MOUNT="/bin/mount"
+    UMOUNT="/bin/umount"
+fi
  -MOUNT="/bin/mount"
  PMOUNT="/usr/bin/pmount"
-UMOUNT="/bin/umount"
+
  for line in `grep -h -v ^# /etc/udev/mount.blacklist /etc/udev/mount.blacklist.d/*`
  do
      if [ ` expr match "$DEVNAME" "$line" ` -gt 0 ];
@@ -17,7 +35,35 @@ do
      fi
  done
  -automount() {
+automount_systemd() {
+    name="`basename "$DEVNAME"`"
+
+    [ -d "/run/media/$name" ] || mkdir -p "/run/media/$name"
+
+    MOUNT="$MOUNT -o silent"
+
+    # If filesystemtype is vfat, change the ownership group to 'disk', and
+    # grant it with  w/r/x permissions.
+    case $ID_FS_TYPE in
+    vfat|fat)
+        MOUNT="$MOUNT -o umask=007,gid=`awk -F':' '/^disk/{print $3}' /etc/group`"
+        ;;
+    # TODO
+    *)
+        ;;
+    esac
+
+    if ! $MOUNT --no-block -t auto $DEVNAME "/run/media/$name"
+    then
+        #logger "mount.sh/automount" "$MOUNT -t auto $DEVNAME \"/run/media/$name\" failed!"
+        rm_dir "/run/media/$name"
+    else
+        logger "mount.sh/automount" "Auto-mount of [/run/media/$name] successful"
+        touch "/tmp/.automount-$name"
+    fi
+}
+
+automount() {
      name="`basename "$DEVNAME"`"
        ! test -d "/run/media/$name" && mkdir -p "/run/media/$name"
@@ -26,7 +72,7 @@ automount() {
      then
          MOUNT="$MOUNT -o silent"
      fi
-
+
      # If filesystem type is vfat, change the ownership group to 'disk', and
      # grant it with  w/r/x permissions.
      case $ID_FS_TYPE in
@@ -68,23 +114,26 @@ if [ "$ACTION" = "add" ] && [ -n "$DEVNAME" ] && [ -n "$ID_FS_TYPE" -o "$media_t
      elif [ -x $MOUNT ]; then
              $MOUNT $DEVNAME 2> /dev/null
      fi
-
+
      # If the device isn't mounted at this point, it isn't
      # configured in fstab (note the root filesystem can show up as
      # /dev/root in /proc/mounts, so check the device number too)
-    if expr $MAJOR "*" 256 + $MINOR != `stat -c %d /`; then
-        grep -q "^$DEVNAME " /proc/mounts || automount
-    fi
+    if expr $MAJOR "*" 256 + $MINOR != `stat -c %d /`; then
+        if [ "`basename $MOUNT`" = "systemd-mount" ];then
+            grep -q "^$DEVNAME " /proc/mounts || automount_systemd
+        else
+            grep -q "^$DEVNAME " /proc/mounts || automount
+        fi
+    fi
  fi
  -
  if [ "$ACTION" = "remove" ] || [ "$ACTION" = "change" ] && [ -x "$UMOUNT" ] && [ -n "$DEVNAME" ]; then
-    for mnt in `cat /proc/mounts | grep "$DEVNAME" | cut -f 2 -d " " `
-    do
-        $UMOUNT $mnt
-    done
-
-    # Remove empty directories from auto-mounter
-    name="`basename "$DEVNAME"`"
-    test -e "/tmp/.automount-$name" && rm_dir "/run/media/$name"
+    for mnt in `cat /proc/mounts | grep "$DEVNAME" | cut -f 2 -d " " `
+    do
+        $UMOUNT $mnt
+    done
+
+    # Remove empty directories from auto-mounter
+    name="`basename "$DEVNAME"`"
+    test -e "/tmp/.automount-$name" && rm_dir "/run/media/$name"
  fi
diff --git a/meta/recipes-core/udev/udev-extraconf_1.1.bb b/meta/recipes-core/udev/udev-extraconf_1.1.bb
index 43a1cff..90f933d 100644
--- a/meta/recipes-core/udev/udev-extraconf_1.1.bb
+++ b/meta/recipes-core/udev/udev-extraconf_1.1.bb
@@ -29,6 +29,9 @@ do_install() {
      install -d ${D}${sysconfdir}/udev/scripts/
        install -m 0755 ${WORKDIR}/mount.sh ${D}${sysconfdir}/udev/scripts/mount.sh +    sed -i 's|@systemd_unitdir@|${systemd_unitdir}|g' ${D}${sysconfdir}/udev/scripts/mount.sh +    sed -i 's|@base_sbindir@|${base_sbindir}|g' ${D}${sysconfdir}/udev/scripts/mount.sh
+
      install -m 0755 ${WORKDIR}/network.sh ${D}${sysconfdir}/udev/scripts
  }


--
# Randy MacLeod
# Wind River Linux

--
_______________________________________________
Openembedded-core mailing list
Openembedded-core@lists.openembedded.org
http://lists.openembedded.org/mailman/listinfo/openembedded-core

Reply via email to