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/syslog
hoặ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 .rules
tệ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 RUN
lệ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/
UUID
bạ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/fstab
hoặ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.