Bài 8: Dùng udev để tự động mount/umount

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

 

Leave a Comment

Filed under Software

Leave a Reply

Your email address will not be published. Required fields are marked *