[OE-core] [PATCH v3] udev-extraconf: Add systemd-mount to udev-extraconf/mount.sh
Randy MacLeod
randy.macleod at windriver.com
Mon Apr 23 20:20:07 UTC 2018
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 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
>> }
>
--
# Randy MacLeod
# Wind River Linux
More information about the Openembedded-core
mailing list