[OE-core] [PATCH v3] udev-extraconf: Add systemd-mount to udev-extraconf/mount.sh
Hongzhi, Song
hongzhi.song at windriver.com
Fri Jul 13 09:15:04 UTC 2018
ping. Please.
-- Hongzhi
On 2018年07月03日 11:40, Hongzhi, Song wrote:
> ping.
>
> The patch fixes the real problem. Please review it.
>
> //Hongzhi
>
>
> On 2018年04月24日 04:20, Randy MacLeod wrote:
>> 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
>>>> }
>>>
>>
>
More information about the Openembedded-core
mailing list