[oe-commits] [openembedded-core] 05/13: udev-extraconf/mount.sh: add support to systemd

git at git.openembedded.org git at git.openembedded.org
Sat Sep 22 15:13:36 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.

commit ddf204fe35e75b7d48709321b6d68268b0a9ddc5
Author: Hongzhi.Song <hongzhi.song at windriver.com>
AuthorDate: Sat Sep 15 22:45:30 2018 -0700

    udev-extraconf/mount.sh: add support to systemd
    
    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 are not accessible
    to host namespace, i.e. udevd's private namespace. For example,
    we cannot format the host namespace block devices.
    
    e.g.
        root at intel-x86-64:~# mkfs.ext4 /dev/sda1
        (skip...)
        /dev/sda1 is apparently in use by the system; will not make a filesystem here!
    
    Other distributions have no such problem, because they use a series
    of rules to manage block devices. Note that udev-extraconf has just
    one file, automount.rules, which results in this problem.
    
    As recommended by members of the systemd community, we can use the
    'systemd-mount' command to resolve this problem since it's intended
    purpose is to establish (and destroy) transient mount or auto-mount
    points using the service manager job queue thereby eliminating
    dependencies loops.
    
    We add 'systemd-mount' command instead of replace 'mount' command
    based on the original mount.sh.
    
    [YOCTO #12644]
    Simply steps of reproduce:
    Using systemd as init and an ext3 filesystem image,
    boot core-image-minimal using:
      runqemu qemux86 slirp nographic qemuparams="-hda b.img"
      Note that hda is not mounted yet it can't be formatted either.
    
    Detail steps of reproduce:
    https://bugzilla.yoctoproject.org/show_bug.cgi?id=12644
    
    Signed-off-by: Hongzhi.Song <hongzhi.song at windriver.com>
    Signed-off-by: Ross Burton <ross.burton at intel.com>
---
 meta/recipes-core/udev/udev-extraconf/mount.sh | 60 ++++++++++++++++++++++----
 1 file changed, 51 insertions(+), 9 deletions(-)

diff --git a/meta/recipes-core/udev/udev-extraconf/mount.sh b/meta/recipes-core/udev/udev-extraconf/mount.sh
index d760328..5a877dd 100644
--- a/meta/recipes-core/udev/udev-extraconf/mount.sh
+++ b/meta/recipes-core/udev/udev-extraconf/mount.sh
@@ -4,10 +4,26 @@
 #
 # Attempt to mount any added block devices and umount any removed devices
 
+BASE_INIT="`readlink -f "/sbin/init"`"
+INIT_SYSTEMD="/lib/systemd/systemd"
+
+if [ "x$BASE_INIT" = "x$INIT_SYSTEMD" ];then
+        MOUNT="/usr/bin/systemd-mount"
+        UMOUNT="/usr/bin/systemd-umount"
+
+        if [ ! -x $MOUNT ] && [ ! -x $UMOUNT ];
+        then
+                logger "/sbin/init is systemd but /usr/bin/systemd-[u]mount not found."
+                logger "Install systemd-[u]mount to be able to [un]mount all filesystems."
+                exit 0
+        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 +33,31 @@ do
 	fi
 done
 
-automount() {	
+automount_systemd() {
+	name="`basename "$DEVNAME"`"
+
+        ! test -d "/run/media/$name" && mkdir -p "/run/media/$name"
+
+        # If filesystem type 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`"
+                ;;
+        *)
+                ;;
+        esac
+
+        if ! $MOUNT -o silent --no-block -t auto $DEVNAME "/run/media/$name"
+        then
+                rm_dir "/run/media/$name"
+        else
+                logger "mount.sh: systemd-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 +66,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
@@ -47,7 +87,7 @@ automount() {
 		touch "/tmp/.automount-$name"
 	fi
 }
-	
+
 rm_dir() {
 	# We do not want to rm -r populated directories
 	if test "`find "$1" | wc -l | tr -d " "`" -lt 2 -a -d "$1"
@@ -61,19 +101,21 @@ rm_dir() {
 # No ID_FS_TYPE for cdrom device, yet it should be mounted
 name="`basename "$DEVNAME"`"
 [ -e /sys/block/$name/device/media ] && media_type=`cat /sys/block/$name/device/media`
-
 if [ "$ACTION" = "add" ] && [ -n "$DEVNAME" ] && [ -n "$ID_FS_TYPE" -o "$media_type" = "cdrom" ]; then
 	if [ -x "$PMOUNT" ]; then
 		$PMOUNT $DEVNAME 2> /dev/null
 	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
+		if [ "`basename $MOUNT`" = "systemd-mount" ];then
+			grep -q "^$DEVNAME " /proc/mounts || automount_systemd
+		else
+			grep -q "^$DEVNAME " /proc/mounts || automount
+		fi
 	fi
 fi
 
@@ -83,7 +125,7 @@ if [ "$ACTION" = "remove" ] || [ "$ACTION" = "change" ] && [ -x "$UMOUNT" ] && [
 	do
 		$UMOUNT $mnt
 	done
-	
+
 	# Remove empty directories from auto-mounter
 	name="`basename "$DEVNAME"`"
 	test -e "/tmp/.automount-$name" && rm_dir "/run/media/$name"

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


More information about the Openembedded-commits mailing list