systemd를 버전 239로 업데이트한 후 미디어 장치 자동 마운트를 위한 Udev 규칙이 작동을 멈췄습니다.

systemd를 버전 239로 업데이트한 후 미디어 장치 자동 마운트를 위한 Udev 규칙이 작동을 멈췄습니다.

한동안 미디어 장치를 자동으로 마운트하기 위해 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버전으로 업데이트했는데 239파일이 다르게 보였습니다.
잠재적으로 문제가 될 수 있는 두 가지 변경 사항을 발견했습니다.

  1. MountFlags이 옵션은 기본 설정에 지정되어 있지 않습니다.
  2. PrivateMounts로 설정된 새로운 옵션이 있습니다 yes.

systemd에서문서이제 설정만 하면 PrivateMounts=no마운트 지점이 사용자 공간에 전파될 것 같습니다.

그러나 이는 사실이 아니다.
나는 열심히 노력했다

  1. 변화PrivateMounts=no
  2. 변경 PrivateMounts=no및 추가MountFlags=shared

그러나 둘 다 작동하지 않습니다.

udev 규칙 이상에서 미디어 장치를 마운트하는 올바른 방법은 무엇입니까 systemd v239?

답변1

이 접근 방식은 최적이 아닐 수도 있습니다. 예를 들어, 쓰기 가능한 ntfs-3gNTFS 마운트 사용을 지원하는 경우 ntfs-3gudev를 다시 시작할 때마다 프로세스가 종료됩니다.

Modern Security Theory에서는 데스크탑 설치 시 FUSE를 사용하도록 권장합니다.모두이동식 파일 시스템. https://lwn.net/Articles/755593/

별도의 시스템 장치를 시작(및 중지)하는 방법을 알아낼 수 있고 선호하는 방법으로 작성할 수 있다면 더 좋을 것입니다. 따라서 Arch 사용자는 특별한 문서에서 이 모드를 사용하는 것이 지속적으로 권장됩니다 :-). 별도의 systemd 장치를 사용하면 udev 서비스에 적용되는 제한 사항을 피할 수 있습니다.

예를 들어 systemd 를 시작하는 범위 단위에서 명령을 사용합니다 systemd-run --no-block --scope -- my mount command here.

안타깝게도,포함된 장치에 ntfs-3g인식 가능한 이름을 지정 하려는 경우, 100% 올바른 접근 방식이 무엇인지 즉시 명확하지 않습니다. 해당 이름을 가진 이전 장치가 여전히 "활성"으로 추적되지만 프로세스가 방금 종료된 경우 서비스 시작을 요청하면 아무 작업도 수행되지 않습니다. 문제를 무시하거나, 이름에 임의의 접미사를 생성하거나, 이 일련의 이벤트를 제외하려고 시도할 수 있지만... 더 나은 방법이 있을 수도 있습니다.

FUSE로 이것을 테스트하지는 않았지만 이를 수행하는 방법은 명령을 사용하는 것이라고 생각합니다 systemd-mount.

슈퍼유저 답변systemd-mountudev 규칙이 계속 실행 중인 동안 장치에서 사용하면 제대로 작동하지 않을 수 있으므로 권장됩니다 . 이를 위해서는 다소 바로크적인 솔루션이 필요합니다. ( 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의 새로운 기능입니다. 따라서 이전 동작을 복원하는 가장 쉬운 방법은 완전히 삭제하는 것입니다.

관련 정보