Trình quản lý thiết bị udev phát sinh sự kiện khi có thiết bị thêm vào/gở bỏ khỏi RPI.
Chúng ta có thể dựa vào thời điểm phát sinh sự kiện thêm ổ đĩa vào/gở bỏ ổ đĩa khỏi RPI để chạy các lệnh mount/umount.
Chỉ cần tạo một file /etc/udev/rules.d/number-name.rules, mô tả các hành động tương ứng với các sự kiện add/remove của udev, thí dụ file /etc/udev/rules.d/10-disk.rules có nội dung như sau
KERNEL!="sd[b-z]*", GOTO="exit" IMPORT{program}="/sbin/blkid -o udev -p %N" ACTION=="add", PROGRAM!="/sbin/blkid %N", GOTO="exit" ### mount disk as label or dev name ### ACTION=="add|remove", ENV{ID_FS_LABEL}!="", ENV{%k}="%E{ID_FS_LABEL}" ACTION=="add|remove", ENV{ID_FS_LABEL}=="", ENV{%k}="%k" ### plug ACTION=="add", RUN+="/bin/mkdir -p '/media/%E{%k}'", RUN+="/bin/mount -t auto -o rw,noauto,sync,dirsync,noexec,nodev,noatime /dev/%k '/media/%E{%k}'" ### unplug ACTION=="remove", ENV{%k}!="", RUN+="/bin/umount -l '/media/%E{%k}'", RUN+="/bin/rmdir '/media/%E{%k}'" LABEL="exit"
- Dòng KERNEL chỉ định là nếu tên thiết bị không phải là sdb..sdz thì nhảy đến nhãn exit ở cuối file
- Dòng IMPORT chỉ định gọi chạy chương trình đọc UUID của thiết bị khi sự kiện xảy ra
- Tiếp theo, khi có sự kiện add mà chương trình được gọi chạy không phải là blkid thì thoát
- Khi có sự kiện add hay remove, nếu đĩa có nhãn thì đặt biến môi trường (thí dụ sda1) là nhãn đĩa, trái lại đặt là tên thiết bị (sda1).
Bây giờ phân ra 2 trường hợp
- Nếu sự kiện là add thì tạo thư mục và chạy lệnh mount phân vùng vào thư mục đó
- Nếu sự kiện là remove thì umount thư mục dir_name và xóa thư mục đó
Sau khi tạo xong file *.rules thì khởi động lại udev để file rules có hiệu lực
sudo /etc/init.d/udev restart
Từ đây về sau, chúng ta không cần quan tâm đến việc mount/umount partition nữa. Hơn nữa, đặt nhãn cho từng partition của đĩa giúp chúng ta nhận diện được ổ đĩa dễ dàng hơn khi gắn vào RPI. Mặt khác, rất nhiều khi ta cần một phân vùng được mount vào một thư mục có tên tương ứng duy nhất.
Chú thích
Dùng tên thiết bị hay UUID tuy tránh được việc trùng tên thư mục nhưng khi đó tên thư mục không đặc trưng được ổ đĩa, có thể thay bằng thuộc tính khác có tính mô tả hơn.
Sau đây là thí dụ về kết quả trả về danh sách các thuộc tính của partition /dev/sda2 từ lệnh udevadm test -a -p $(udevadm info -q path -n /dev/sda2)
This program is for debugging only, it does not run any program, specified by a RUN key. It may show incorrect results, because some values may be different, or not available at a simulation run. ACTION=-p DEVLINKS=/dev/disk/by-id/ata-Corsair_Force_3_SSD_12487903000097470475-part2 /dev/disk/by-id/scsi-SGeneric_External_12487903000097470475-part2 /dev/disk/by-path/platform-bcm2708_usb-usb-0:1.5:1.0-scsi-0:0:0:0-part2 /dev/disk/by-uuid/f9f0d55e-1fa8-4dd9-93aa-25346fa57d48 DEVNAME=/dev/sda2 DEVPATH=/devices/platform/bcm2708_usb/usb1/1-1/1-1.5/1-1.5:1.0/host0/target0:0:0/0:0:0:0/block/sda/sda2 DEVTYPE=partition ID_ATA=1 ID_ATA_DOWNLOAD_MICROCODE=1 ID_ATA_FEATURE_SET_APM=1 ID_ATA_FEATURE_SET_APM_CURRENT_VALUE=254 ID_ATA_FEATURE_SET_APM_ENABLED=1 ID_ATA_FEATURE_SET_HPA=1 ID_ATA_FEATURE_SET_HPA_ENABLED=1 ID_ATA_FEATURE_SET_PM=1 ID_ATA_FEATURE_SET_PM_ENABLED=1 ID_ATA_FEATURE_SET_PUIS=1 ID_ATA_FEATURE_SET_PUIS_ENABLED=0 ID_ATA_FEATURE_SET_SECURITY=1 ID_ATA_FEATURE_SET_SECURITY_ENABLED=0 ID_ATA_FEATURE_SET_SECURITY_ERASE_UNIT_MIN=2 ID_ATA_FEATURE_SET_SMART=1 ID_ATA_FEATURE_SET_SMART_ENABLED=1 ID_ATA_ROTATION_RATE_RPM=0 ID_ATA_SATA=1 ID_ATA_SATA_SIGNAL_RATE_GEN1=1 ID_ATA_SATA_SIGNAL_RATE_GEN2=1 ID_ATA_WRITE_CACHE=1 ID_ATA_WRITE_CACHE_ENABLED=1 ID_BUS=ata ID_FS_TYPE=ext4 ID_FS_USAGE=filesystem ID_FS_UUID=f9f0d55e-1fa8-4dd9-93aa-25346fa57d48 ID_FS_UUID_ENC=f9f0d55e-1fa8-4dd9-93aa-25346fa57d48 ID_FS_VERSION=1.0 ID_MODEL=Corsair_Force_3_SSD ID_MODEL_ENC=Corsair\x20Force\x203\x20SSD\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20 ID_PART_ENTRY_DISK=8:0 ID_PART_ENTRY_NUMBER=2 ID_PART_ENTRY_OFFSET=20973568 ID_PART_ENTRY_SCHEME=dos ID_PART_ENTRY_SIZE=213468080 ID_PART_ENTRY_TYPE=0x83 ID_PART_TABLE_TYPE=dos ID_PATH=platform-bcm2708_usb-usb-0:1.5:1.0-scsi-0:0:0:0 ID_PATH_TAG=platform-bcm2708_usb-usb-0_1_5_1_0-scsi-0_0_0_0 ID_REVISION=5.03 ID_SCSI_COMPAT=SGeneric_External_12487903000097470475 ID_SERIAL=Corsair_Force_3_SSD_12487903000097470475 ID_SERIAL_SHORT=12487903000097470475 ID_TYPE=disk MAJOR=8 MINOR=2 SUBSYSTEM=block UDEV_LOG=6 USEC_INITIALIZED=11723569