Đây là cách gần đây tôi đã làm nó, và tôi khá hài lòng với phương pháp này bây giờ. Cái này dành cho Ubuntu 12.04 + gentoo, nhưng tôi đoán bất kỳ bản phân phối nào, cho phép cài đặt udev và autofs sẽ hoạt động.
Điều kiện tiên quyết: Bạn phải cài đặt udev + autofs.
Bước 1)
Tạo tệp "/etc/udev/rules.d/90-usbsd-auto.rules" sau đây (tất nhiên bạn có thể sử dụng bất kỳ tên nào miễn là nó kết thúc bằng ".rules"). :
# Add symlink /dev/usbdisks/<label> to /dev/sd[a-z][1-9]
# if partition has a label
# Add symlink /media/usb/<label> to /media/autousb/<label>
# for automounter support
ACTION=="add", KERNEL=="sd*", ENV{DEVTYPE}=="partition", \
ENV{ID_BUS}=="usb", ENV{ID_FS_LABEL_ENC}=="?*", \
SYMLINK+="usbdisks/$env{ID_FS_LABEL_ENC}", MODE:="0660", \
RUN+="/bin/rm /media/usb/$env{ID_FS_LABEL_ENC}", \
RUN+="/bin/ln -sf /media/autousb/$env{ID_FS_LABEL_ENC} /media/usb/$env{ID_FS_LABEL_ENC}"
# Fallback: If partition has a NO label, use kernel name (sd[a-z][1-9])
ACTION=="add", KERNEL=="sd*", ENV{DEVTYPE}=="partition", \
ENV{ID_BUS}=="usb", ENV{ID_FS_LABEL_ENC}!="?*", \
SYMLINK+="usbdisks/%k", MODE:="0660", \
RUN+="/bin/rm /media/usb/%k", \
RUN+="/bin/ln -sf /media/autousb/%k /media/usb/%k"
# Some FileSystems emit a "change" event when they are unmounted.
# UDEV seems to delete the device symlink in this case :-(
# So we need to re-create it here
ACTION=="change", KERNEL=="sd*", ENV{DEVTYPE}=="partition", \
ENV{ID_BUS}=="usb", ENV{ID_FS_LABEL_ENC}=="?*", \
SYMLINK+="usbdisks/$env{ID_FS_LABEL_ENC}", MODE:="0660"
# Fallback: If partition has NO label, use kernel name
ACTION=="change", KERNEL=="sd*", ENV{DEVTYPE}=="partition", \
ENV{ID_BUS}=="usb", ENV{ID_FS_LABEL_ENC}!="?*", \
SYMLINK+="usbdisks/%k", MODE:="0660"
# When device is removed, also remove /media/usb/<label>
ACTION=="remove", KERNEL=="sd*", ENV{DEVTYPE}=="partition", \
ENV{ID_BUS}=="usb", ENV{ID_FS_LABEL_ENC}=="?*", \
RUN+="/bin/rm /media/usb/$env{ID_FS_LABEL_ENC}"
# Fallback: If partition has no label, remove /media/usb/%k
ACTION=="remove", KERNEL=="sd*", ENV{DEVTYPE}=="partition", \
ENV{ID_BUS}=="usb", ENV{ID_FS_LABEL_ENC}!="?*", \
RUN+="/bin/rm /media/usb/%k"
Điều này làm gì: Nó tạo ra hai liên kết tượng trưng, một cho phân vùng thiết bị lưu trữ USB trong "/ dev / usbdisks / <...>". Nó sẽ sử dụng nhãn của phân vùng lưu trữ USB hoặc tên kernel, nếu không có nhãn. Liên kết tượng trưng thứ hai sẽ liên kết từ "/ media / usb / <...>" đến "/ media / autousb / <...>" điều này được thực hiện để hỗ trợ bộ đếm tự động (xem bước 2).
Lưu ý: Ban đầu tôi không sử dụng quy tắc với các biến ID_FS_LABEL_ENC, vì theo tôi, điều này rất nguy hiểm. Điều gì xảy ra nếu bạn cắm hai thanh USB sử dụng cùng một nhãn?
Nhưng người đăng đặc biệt muốn sử dụng nhãn của đĩa USB, vì vậy tôi đã sửa đổi các quy tắc cho phù hợp.
Để đảm bảo udev đọc các quy tắc này sử dụng
sudo udevadm control --reload-rules
Với tệp quy tắc udev này, mọi thứ được thiết lập để tự động phân vùng thiết bị lưu trữ USB. Lưu ý rằng ngay bây giờ, thiết bị sẽ KHÔNG được tự động hóa (cố ý). Nó sẽ được tự động hóa khi bạn sử dụng nó với
Bước 2)
Cài đặt tự động thành automount / media / autousb / <...>: Tôi đã thêm dòng sau vào tệp "/etc/auto.master" của mình (cho Ubuntu 12.04):
/media/autousb /etc/auto.usb --timeout=60
Điều này có nghĩa là AutoFS sẽ ngắt kết nối thiết bị sau 60 giây không hoạt động. Bạn có thể muốn sử dụng ít hơn hoặc nhiều hơn, tùy thuộc vào khẩu vị của bạn.
Đối với Gentoo, bạn phải sửa đổi "/etc/autofs/auto.master" để sử dụng hợp lý
/media/autousb /etc/autofs/auto.usb --timeout=60
Bây giờ tôi đã tạo "auto.usb" với nội dung sau:
#!/bin/bash
key=${1}
fstype=$(/sbin/blkid -o value -s TYPE /dev/usbdisks/${key})
if [ "${fstype}" = "vfat" ] ; then
echo "-fstype=vfat,sync,uid=0,gid=plugdev,umask=007 :/dev/usbdisks/${key}"
exit 0
fi
if [ "${fstype}" = "ntfs" ] ; then
echo "-fstype=fuse.ntfs-3g,sync,uid=0,gid=plugdev,umask=007 :/dev/usbdisks/${key}"
exit 0
fi
if [ "${fstype}" = "ext4" ] ; then
echo "-fstype=ext4,sync,nocheck :/dev/usbdisks/${key}"
exit 0
fi
exit 1
Auto.usb này cần phải được thực thi, để autofs sử dụng điều này như một tập lệnh (bash). Ví dụ
sudo chmod 0755 /etc/auto.usb
Việc này làm gì: Tập lệnh này sẽ cho AutoFS (/ usr / sbin / automount) cách gắn phân vùng thiết bị lưu trữ usb.
Trước tiên, tập lệnh sẽ sử dụng "/ sbin / blkid" để tìm hiểu loại hệ thống tệp nào trên phân vùng.
Tập lệnh sau đó sẽ cung cấp các tùy chọn gắn kết tùy thuộc vào phân vùng thiết bị.
Lưu ý: Tôi đã bao gồm mã mẫu cho các hệ thống tệp "vfat" (có lẽ phổ biến nhất cho các thẻ nhớ USB), "ntfs" và "xfs". Tất nhiên khá dễ dàng để mở rộng điều này để hỗ trợ nhiều hệ thống tập tin hơn.
Bước 3) Tùy chọn ... Để "nhả" == ngắt kết nối (các) thanh usb của bạn (hoặc phân vùng trên thanh USB của bạn), tạo tập lệnh trong / sbin / usbeject:
#!/bin/bash
killall -s SIGUSR1 /usr/sbin/automount
Với tập lệnh này, bạn có thể sử dụng "sudo usbeject" để ngắt kết nối tất cả các phân vùng thiết bị USB được gắn (bằng cách nói với autoount để ngắt kết nối chúng).
Tất nhiên bạn có thể chỉ cần đảm bảo rằng phân vùng không được sử dụng ở bất cứ đâu; Sau đó, bộ đếm tự động sẽ ngắt kết nối phân vùng sau khi hết thời gian 60 giây ...
Thủ thuật thực sự ở đây là sử dụng các liên kết tượng trưng từ "/ media / usb" đến "/ media / autousb":
- Các liên kết tượng trưng "/ media / usb" sẽ được tạo bởi udev, cung cấp cho người dùng một cái nhìn tổng quan đơn giản về các phân vùng thiết bị lưu trữ usb ở đó
- AutoFS sau đó sẽ tự động đếm phân vùng theo yêu cầu nếu bạn sử dụng nó qua / media / usb
- Với tệp "auto.usb" theo kịch bản, bạn có thể hỗ trợ bất kỳ loại hệ thống tệp nào và ngoài ra, bạn cũng có thể hỗ trợ bất kỳ loại sơ đồ đặt tên nào.
- Cách tiếp cận này hỗ trợ các thanh USB với nhiều phân vùng, ngay cả khi các phân vùng này sử dụng các loại hệ thống tệp khác nhau.