Sử dụng UUID trong các quy tắc udev và gắn ổ đĩa USB trên / media / $ UUID


13

Tôi muốn gắn ổ đĩa USB /mediadựa trên UUID của đĩa. Làm cách nào tôi có thể sử dụng UUID của ổ USB trong tệp quy tắc udev và quy tắc udev để gắn ổ USB với số UUID làm tên thư mục là gì.

Các blkidlệnh kết quả đầu ra UUID của một đĩa nhưng chỉ khi gắn.


1
Hãy cẩn thận 2019: Trên các hệ thống Linux máy tính để bàn hiện đại sử dụng systemd, quy tắc udev không gắn kết hệ thống tệp trong không gian tên người dùng thông thường, tức là bạn không thể gắn hệ thống tệp bằng lệnh mount trong quy tắc udev. Hơn nữa, trong các hệ thống này, hệ thống cầu chì (hệ thống tập tin người dùng) được cấu hình để xử lý các ngàm USB thông qua biểu tượng máy tính để bàn, do đó, lắp bằng tay sử dụng quy tắc fstab để xung đột ở mức độ nào đó với hệ thống cầu chì. Để tự động gắn hệ thống tập tin USB bằng UUID trên máy chủ không đầu, tốt nhất bạn nên xóa cấu hình cầu chì systemd và sử dụng quy tắc udev để kích hoạt dịch vụ gắn kết một lần.
Jonathan Ben-Avraham

Xem giải pháp này bằng cách sử dụng fstab, systemd và automount, đã thử nghiệm trên Debian gần đây: unix.stackexchange.com/a/347007/31228
Jonathan Ben-Avraham

Câu trả lời:


14

Mặc dù UUID không thể truy cập trực tiếp bởi udev, nhưng ít nhất trong Fedora và Ubuntu, chúng được đặt làm biến môi trường ( ENV). Bạn có thể đọc tất cả các biến môi trường của thiết bị bằng cách gọi udevadm info /dev/sdc. Ví dụ: đối với NTFS trên ổ đĩa ngoài tôi nhận được:

$ udevadm info /dev/sdc2
P: /devices/pci0000:00/0000:00:14.0/usb4/4-2/4-2:1.0/host7/target7:0:0/7:0:0:0/block/sdc/sdc2
N: sdc2
[…]
E: ID_FS_TYPE=ntfs
E: ID_FS_USAGE=filesystem
E: ID_FS_UUID=4A6F2ABC1232FA37
[…]

Tất cả mọi thứ với một E:phía trước được đặt là một biến môi trường.

Trận đấu với UUID

Bạn có thể phù hợp với nó với ENV{ID_FS_UUID}=="4A6F2ABC1232FA37". Là bộ lọc đầu tiên tôi khớp với KERNEL=="sd?2"để đảm bảo tôi chỉ xử lý các thiết bị khối có số phân vùng chính xác. Quy tắc hoàn chỉnh sẽ trông như thế này:

KERNEL=="sd?2", ENV{ID_FS_UUID}=="4A6F2ABC1232FA37", RUN+="/usr/bin/logger --tag my-manual-usb-mount Mounting the device with UUID 4A6F2ABC1232FA37", RUN+="/usr/bin/mount [Your mount options here]"

Lệnh logger rất hữu ích để khẳng định rằng quy tắc thực sự đang chạy. Tiếp theo, bạn nên kiểm tra xem quy tắc không chứa bất kỳ lỗi cú pháp nào udevadm test /dev/sdc2. Tệp quy tắc của bạn phải được liệt kê trong đầu ra và không có thông báo lỗi nào xuất hiện bên cạnh nó. Bây giờ bạn có thể kích hoạt tất cả các quy tắc cho thiết bị của mình để kiểm tra xem quy tắc của bạn có hoạt động như kế hoạch không : sudo udevadm trigger /dev/sdc2. Nếu quy tắc của bạn phù hợp, bạn sẽ tìm thấy thông điệp nhật ký tùy chỉnh trong nhật ký hệ thống ( /var/log/sysloghoặc thông qua journalctl -b).

Chỉnh sửa: ali_m đã chỉ ra rằng các biến môi trường được đặt theo quy tắc trước đó và do đó chỉ có thể truy cập được nếu .rulestệp của bạn có thứ tự từ điển đủ cao . Bắt đầu với "60" là đủ. Cá nhân tôi bắt đầu các quy tắc của mình bằng "zz" (nếu có thể) để phân biệt chúng với các quy tắc được xác định trước trong nháy mắt.

Sử dụng UUID trong RUNlệnh và các nơi khác

Udev có một cú pháp thay thế thuộc tính và biến khá mạnh mẽ . Cụ thể mọi sự xuất hiện của $env{ID_FS_UUID}sẽ được thay thế bằng UUID của ổ đĩa. Vì vậy, để gắn thiết bị theo /media/UUIDbạn có thể sử dụng quy tắc này:

KERNEL=="sd??", RUN+="/usr/bin/mkdir /media/$env{ID_FS_UUID}", RUN+="/usr/bin/mount $devpath /media/$env{ID_FS_UUID}"

Thay vào đó, bạn có thể muốn định cấu hình udisks, nó chuyên dùng cho không gian vấn đề bạn muốn giải quyết. Xem https://wiki.archlinux.org/index.php/udisks#udisks2:_mount_to_.2Fmedia làm điểm bắt đầu.

Trường hợp sử dụng thực tế của tôi để gắn các thiết bị với udev thay vì /etc/fstabhoặc udisks là gắn các hệ thống tệp zfs có một số đặc điểm riêng khiến chúng không hoàn toàn phù hợp với các công cụ thông thường.


1
Một điểm quan trọng khiến tôi mất một thời gian để tìm ra: để phù hợp với các biến môi trường, quy tắc của bạn phải được áp dụng sau khi các biến đó được thiết lập. Để đạt được điều này, tên tệp của bạn .rulescần bắt đầu bằng số> 60 .
ali_m

@ali_m: Cảm ơn, tôi đã thêm thông tin của bạn vào câu trả lời.
Perseids

Ubuntu 18.04, một số lệnh udevadm có thể được trỏ đến / dev / sdXX (ví dụ: thông tin udevadm), một số lệnh khác cần được trỏ đến / sys / block / sdXX vì một số lý do (ví dụ: kiểm tra udevadm).
Greg Bell

0

Có một giải pháp thô sơ trong tâm trí tôi. Đặt mục nhập fstab cooresponding được đánh dấu bởi UUID. Và trong các quy tắc udev, thực thi mount -amọi lúc có thiết bị sd * mới được thêm vào.

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.