[oe-commits] [openembedded-core] branch master-next updated: udev-extraconf: Add systemd-mount to udev-extraconf/mount.sh

git at git.openembedded.org git at git.openembedded.org
Thu Sep 13 16:39:32 UTC 2018


This is an automated email from the git hooks/post-receive script.

rpurdie pushed a commit to branch master-next
in repository openembedded-core.

The following commit(s) were added to refs/heads/master-next by this push:
     new a0b3389  udev-extraconf: Add systemd-mount to udev-extraconf/mount.sh
a0b3389 is described below

commit a0b3389c5afc23f622f793cbad8b4135093e6f08
Author: Hongzhi.Song <hongzhi.song at windriver.com>
AuthorDate: Tue Apr 17 03:03:43 2018 -0400

    udev-extraconf: Add systemd-mount to udev-extraconf/mount.sh
    
    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 at 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.song at windriver.com>
    Signed-off-by: Richard Purdie <richard.purdie at linuxfoundation.org>
---
 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
 }
 

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the Openembedded-commits mailing list