AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 464959
Accepted
Iskustvo
Iskustvo
Asked: 2018-08-27 12:20:52 +0800 CST2018-08-27 12:20:52 +0800 CST 2018-08-27 12:20:52 +0800 CST

在 systemd 更新到版本 239 后,用于自动挂载媒体设备的 Udev 规则停止工作

  • 772

有一段时间,我有一个有效的 udev 规则来自动挂载媒体设备。

/etc/udev/rules.d/61-mount_media_by_label.rules

#
# To propagate udev's mountpoint to the user space, MountFlags must have a value "shared" in the /usr/lib/systemd/system/systemd-udevd.service.
#

# Ignore devices that aren't storage block-devices and block-devices that are already listed in /etc/fstab.
KERNEL!="sd[a-z][1-9]*", GOTO="mount_media_by_label_end"
PROGRAM="/bin/grep -e '^UUID=%E{ID_FS_UUID}' /etc/fstab", RESULT!="", GOTO="mount_media_by_label_end"

# Decide the name for device's mountpoint directory, based on device's label.
ENV{ID_FS_LABEL}!="", ENV{mountpoint}="%E{ID_FS_LABEL}"
ENV{ID_FS_LABEL}=="", ENV{mountpoint}="usb-%k"

# If device is being plugged in, set options for mount command.
ACTION=="add", ENV{mount_options}="relatime"
ACTION=="add", ENV{ID_FS_TYPE}=="vfat|ntfs", ENV{mount_options}="%E{mount_options},utf8,gid=100,umask=002"

# If device is being plugged in, create mountpoint directory in /media and mount device node to it.
ACTION=="add", RUN+="/bin/mkdir -p /media/%E{mountpoint}", RUN+="/bin/mount -o %E{mount_options} /dev/%k /media/%E{mountpoint}"

# If device is being plugged out, unmount it and delete its mountpoint directory.
ACTION=="remove", ENV{mountpoint}!="", RUN+="/bin/umount -l /media/%E{mountpoint}", RUN+="/bin/rmdir /media/%E{mountpoint}"

# Label for early exit.
LABEL="mount_media_by_label_end"

为了使这个规则起作用,我只需将MountFlags选项的值更改shared为
/usr/lib/systemd/system/systemd-udevd.service
在我更新systemd到 version后239,这个文件看起来就不同了。
我注意到 2 个可能有问题的更改:

  1. MountFlags默认设置中未指定该选项。
  2. 有一个新选项PrivateMounts设置为yes。

从systemd的文档中我发现现在我只需要设置PrivateMounts=no和传播挂载点就可以到达用户空间。

然而,这种情况并非如此。
我努力了

  1. 改变PrivateMounts=no
  2. 更改PrivateMounts=no和添加MountFlags=shared

但两者都不起作用。

systemd v239从 udev 规则及以后安装媒体设备的正确方法是什么?

mount systemd
  • 1 1 个回答
  • 3758 Views

1 个回答

  • Voted
  1. Best Answer
    sourcejedi
    2018-08-28T01:39:36+08:002018-08-28T01:39:36+08:00

    这种方法可能不是最理想的。例如,如果您支持使用 挂载可写 NTFS ,则每当您重新启动 udev 时ntfs-3g,该ntfs-3g进程都会被终止。

    请注意,现代安全原则建议桌面应开始使用 FUSE 来挂载所有可移动文件系统。 https://lwn.net/Articles/755593/

    如果你能弄清楚如何启动(和停止?)一个单独的 systemd 单元......并将其写成首选方法,在任何特殊的文档中不断建议 Arch 用户使用这种模式:-),那将是更可取的。使用单独的 systemd 单元将避免应用于 udev 服务的限制。

    例如,在 systemd 范围单元中使用systemd-run --no-block --scope -- my mount command here.

    不幸的是,如果您希望包含的单元ntfs-3g具有可识别的名称,那么 100% 正确的方法是什么并不是很明显。如果具有该名称的旧单元仍被跟踪为“活动”但进程刚刚退出,那么简单地要求服务启动将不会做任何事情。您可以忽略这个问题,为名称生成一个随机后缀,或者尝试排除这一系列事件......但也许有更好的方法。

    我没有用 FUSE 测试过这个,但我认为这样做的方法是systemd-mount命令。

    超级用户的回答表明,systemd-mount在 udev 规则仍在运行时在设备上使用可能无法正常工作。这将需要相当巴洛克式的解决方法。(RUN+="/path/to/my/script %k"运行systemd-run --no-block --scope --unit=mount-$1 sh -c "systemctl start /dev/$1; systemd-mount ...")。

    我认为这样做的方法看起来像

    ENV{SYSTEMD_WANTS}=my-mounter@%k.service

    # /etc/systemd/system/[email protected]
    [Service]
    Type=oneshot
    ExecStart=systemd-mount %I
    
    #!/bin/sh
    # /usr/local/lib/my-mounter
    # You can make this as complicated as you want.
    # (Although curiously systemd-mount also reads SYSTEMD_MOUNT_WHERE and
    # SYSTEMD_MOUNT_OPTIONS properties if you set them on the udev device.)
    # You could also read udev properties yourself using 
    # eval "$(udevadm info --query=property --export)"
    
    DEVNAME="$1"
    systemd-mount "/dev/$DEVNAME"
    

    导致文件系统在删除时自动卸载的默认值systemd-mount,但它们不会在之后清理自动创建的安装点目录(!)。


    v239 中有两个单独的更改-您必须恢复两个单独的指令才能获得旧的行为。

    1. PrivateMounts=yes. 将此替换为PrivateMounts=no.
    2. SystemCallFilter=@system-service @module @raw-io

      此指令的使用是 v239 中的新增功能。因此,恢复先前行为的最简单方法是完全删除它。

    • 1

相关问题

  • 如何在 solaris 11.3 中挂载 zfs 驱动器分区

  • 使用 systemd 看门狗支持重新启动应用程序

  • 阻止挂载系统调用

  • 将局域网硬盘挂载到 linux fedora

  • 使用键盘快捷键启动/停止 systemd 服务 [关闭]

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve