[OE-core] [PATCH v3] udev-extraconf: Add systemd-mount to udev-extraconf/mount.sh

Hongzhi, Song hongzhi.song at windriver.com
Mon Apr 23 03:37:46 UTC 2018


ping

// 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 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>
> ---
>   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
>   }
>   




More information about the Openembedded-core mailing list