[OE-core] [PATCH v3] udev-extraconf: Add systemd-mount to udev-extraconf/mount.sh
Hongzhi, Song
hongzhi.song at windriver.com
Wed Jul 25 01:26:33 UTC 2018
ping..
// Hongzhi
On 2018年07月13日 17:15, Hongzhi, Song wrote:
> 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