mount không được thực thi khi được gọi bởi udev


15

Tôi đã cố gắng tạo một số quy tắc udev để gắn kết và ngắt kết nối ổ đĩa flash USB của mình; các quy tắc cho thời điểm này rất đơn giản:

ACTION=="add",KERNEL=="sd[b-z]",RUN+="/root/scripts/plug_flash_drive.sh %k"
ACTION=="remove",KERNEL=="sd[b-z]",RUN+="/root/scripts/unplug_flash_drive.sh %k"

plug_flash_drive.sh cũng rất đơn giản:

device_name=$1
mount_options="umask=000,utf8"
if [ ! -e "/media/$device_name" ]; then
    mkdir "/media/$device_name"
fi
sleep 1
/usr/bin/mount "/dev/$device_name" "/media/$device_name" -o "$mount_options"

unsug_flash_drive.sh:

device_name=$1

umount "/dev/$device_name"
rmdir "/media/$device_name"

Tôi đã thực hiện một số thử nghiệm để tôi có thể xác định rằng:

  • Khi cắm điện, ổ flash của tôi được phát hiện; một tập tin được tạo trong / dev
  • plug_flash_drive.sh được gọi bởi udev
  • phần mkdir của kịch bản hoạt động
  • tuy nhiên, có vẻ như phần "mount" của tập lệnh không được thực thi, vì vậy ổ đĩa của tôi không được gắn kết
  • Khi tôi gọi các tập lệnh của mình trên dòng lệnh, chúng hoàn toàn hoạt động

Có ai biết tại sao mount không được thực thi khi được gọi bởi udev?

EDIT 28/08/14: Tôi đã thêm "grep -q / Proc / mounts && echo thành công | Có vẻ như thiết bị được gắn tại thời điểm đó ngay cả khi tập lệnh được gọi bởi udev. Vì vậy, vấn đề thực sự bây giờ là "thiết bị chặn của tôi dường như chưa được khắc phục sau khi tập lệnh mount kết thúc khi được gọi qua udev": s


Điều này có thể bên cạnh quan điểm, nhưng tại sao bạn mkdir "$mount_dir"nhưng rmdir "/media/$device_name"? Đặt ở đâu $mount_dir?
G-Man nói 'Phục hồi Monica'

xin lỗi, đây là một lỗi đánh máy, tôi đã sử dụng một số biến khá vô dụng trong các mã gốc và tôi đã xóa chúng ở đây vì mục đích rõ ràng
magva

Bạn đã thử gỡ lỗi trường học cũ; ví dụ, bằng cách đặt set -xvexec >> "$HOME"/mount.log 2>&1vào các .shtập tin?
G-Man nói 'Phục hồi Monica'

1
Tôi đã làm điều đó, nhưng theo nhật ký tôi nhận được, mount được thực thi khi script được gọi bởi udev. Không có sự khác biệt trong nhật ký giữa một cuộc gọi từ udev và từ dòng lệnh ... điều đó thực sự khá khó hiểu
magva

1
trong trường hợp đó, tập lệnh cũng sẽ thất bại khi chạy từ dòng lệnh
magva

Câu trả lời:


22

systemd-udevd chạy trong không gian tên tệp hệ thống của riêng nó và theo mặc định các mount được thực hiện trong udev .rules không truyền đến máy chủ. Để thực hiện các kịch bản cũ của bạn làm việc bạn có thể đặt MountFlags=sharedtrong /usr/lib/systemd/system/systemd-udevd.servicehoặc (tốt hơn) tạo và chỉnh sửa bản sao của nó tại/etc/systemd/system/

Xem man 5 systemd.execđể biết thêm thông tin, MountFlagstùy chọn.


Bạn có ý nghĩa gì khi "không tuyên truyền cho chủ nhà"?
sebelk

2
@sebelk Tôi tin rằng user83388 có nghĩa là họ không tuyên truyền đến không gian tên "gốc"
Đánh dấu

2

Theo văn bản này, các câu trả lời khác là không chính xác (hoặc lỗi thời).

Bạn không nên chạy mounttừ dịch vụ Systemd. Ngay cả sau khi nhận xét MountFlagsPrivateMountscác dòng trong systemd-udevd.service, quy tắc của bạn sẽ không hoạt động đối với các hệ thống tệp FUSE như NTFS hoặc exFAT, vì quy trình FUSE sẽ bị Systemd giết chết một cách hữu ích.

Xem trang ArchWiki này liệt kê một số tùy chọn tốt hơn. Sở thích của tôi là một dự án nhỏ trên GitHub có tên udev-media-automount , đơn giản là khởi động lại dịch vụ Systemd từ quy tắc Udev. Đây là một cách thuận tiện để khắc phục những hạn chế cồng kềnh khác nhau của Udev đối với không gian tên và quy trình con.

Xem thêm anwser này , cho biết cách sử dụng SYSTEMD_WANTSbiến Udev để bắt đầu một đơn vị Systemd.


-1

Bạn có thể thử sử dụng :=thay vì +=trong các quy tắc RUN bài tập.

Các :=nhà điều hành đặt giá trị danh sách và không cho phép thay đổi hơn nữa.


cảm ơn, nhưng mount vẫn không hoạt động :(
magva

1
Có thể không phải trường hợp của bạn, nhưng trong hệ thống của tôi được đặt tại / bin / mount. Hãy thử "lệnh -v mount".
xae

1
Trong hệ thống của tôi, đường dẫn được trả về bởi "lệnh -v mount" là / usr / bin / mount. Tôi nhận thấy rằng tôi cũng có một thực thi / bin / mount, nhưng nó cũng không hoạt động khi được gọi bởi udev
magva
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.