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

Christopher Larson kergoth at gmail.com
Thu Apr 12 01:35:48 UTC 2018


Why are you adding a new mount.sh at meta/recipes-core/udev/mount.sh rather
than updating the existing one
at meta/recipes-core/udev/udev-extraconf/mount.sh?

On Mon, Apr 9, 2018 at 12:28 AM, Hongzhi.Song <hongzhi.song at windriver.com>
wrote:

> This patch fixs the problem that block devices unable to be formatted when
> systemd and udev-extraconf recipes added into rootfs.
>
> If we add systemd and udev-extraconf recipes into rootfs:
>     VIRTUAL-RUNTIME_init_manager = "systemd"
>     DISTRO_FEATURES_append = " systemd"
>     DISTRO_FEATURES_BACKFILL_CONSIDERED += "sysvinit"
>     KERNEL_FEATURES_append = " cfg/systemd.scc"
>     IMAGE_INSTALL_append = " udev-extraconf"
>     IMAGE_FSTYPES += "tar.bz2 ext4"
>     IMAGE_INSTALL_append = " e2fsprogs-mke2fs"
> then systemd-udevd.service will invoke udev rules to automount block
> devices
> any probed under itself private namespace, this behavior results in host
> space
> can't format those devices. And host space can't find where the device is
> used.
> Such as:
>     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!
>
> Command systemd-mount recommended by systemd maintainer instead of command
> mount
> will fix the problem brought with private namespace. Systemd-mount request
> the
> mount operation to be executed by PID 1, and hence host space can access
> the block
> devices.
>
> [YOCTO #12644]
>
> Signed-off-by: Hongzhi.Song <hongzhi.song at windriver.com>
> ---
>  meta/recipes-core/udev/mount.sh | 141 ++++++++++++++++++++++++++++++
> ++++++++++
>  1 file changed, 141 insertions(+)
>  create mode 100644 meta/recipes-core/udev/mount.sh
>
> diff --git a/meta/recipes-core/udev/mount.sh b/meta/recipes-core/udev/
> mount.sh
> new file mode 100644
> index 0000000..2fa2925
> --- /dev/null
> +++ b/meta/recipes-core/udev/mount.sh
> @@ -0,0 +1,141 @@
> +#!/bin/sh
> +#
> +# Called from udev
> +#
> +# Attempt to mount any added block devices and umount any removed devices
> +
> +
> +BASE_INIT="`readlink "/sbin/init"`"
> +INIT_SYSTEMD="/lib/systemd/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
> +
> +PMOUNT="/usr/bin/pmount"
> +
> +for line in `grep -h -v ^# /etc/udev/mount.blacklist
> /etc/udev/mount.blacklist.d/*`
> +do
> +       if [ ` expr match "$DEVNAME" "$line" ` -gt 0 ];
> +       then
> +               logger "udev/mount.sh" "[$DEVNAME] is blacklisted,
> ignoring"
> +               exit 0
> +       fi
> +done
> +
> +automount_systemd() {
> +        name="`basename "$DEVNAME"`"
> +
> +        ! test -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"
> +       # Silent util-linux's version of mounting auto
> +       if [ "x`readlink $MOUNT`" = "x/bin/mount.util-linux" ] ;
> +       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
> +       vfat|fat)
> +               MOUNT="$MOUNT -o umask=007,gid=`awk -F':' '/^disk/{print
> $3}' /etc/group`"
> +               ;;
> +       # TODO
> +       *)
> +               ;;
> +       esac
> +
> +       if ! $MOUNT -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
> +}
> +
> +rm_dir() {
> +       # We do not want to rm -r populated directories
> +       if test "`find "$1" | wc -l | tr -d " "`" -lt 2 -a -d "$1"
> +       then
> +               ! test -z "$1" && rm -r "$1"
> +       else
> +               logger "mount.sh/automount" "Not removing non-empty
> directory [$1]"
> +       fi
> +}
> +
> +# 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
> +                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"
> +fi
> --
> 2.8.1
>
> --
> _______________________________________________
> Openembedded-core mailing list
> Openembedded-core at lists.openembedded.org
> http://lists.openembedded.org/mailman/listinfo/openembedded-core
>



-- 
Christopher Larson
kergoth at gmail dot com
Founder - BitBake, OpenEmbedded, OpenZaurus
Senior Software Engineer, Mentor Graphics
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.openembedded.org/pipermail/openembedded-core/attachments/20180411/b8c6aeed/attachment-0002.html>


More information about the Openembedded-core mailing list