Gợi ý cần thiết cho udev, udisks, autofs, thiết lập thông báo cho một giải pháp tự động hoàn chỉnh trên Linux


9

Tiếp tục trên Automounting các thiết bị cắm trong linux , điều này khiến mọi thứ hơi cơ bản. Chạy Gentoo, tôi tự động kết hợp các thiết bị mạng và cục bộ trên máy tính xách tay của mình với autofs-5.0.4-r5. Làm autofs một mình cho tôi một vài nắm bắt:

  • Tôi phải xác định trước tên cho điểm gắn trên mỗi thiết bị, nhưng đôi khi sau khi khởi động lại đầu đọc thẻ MMC của tôi sẽ chuyển vị trí bằng thanh USB có thể khởi động của tôi
  • Tôi muốn các điểm gắn kết dựa trên LABEL tự động xuất hiện, tự động một mình AFAIK không thể làm điều đó

Đó là những gì udev và udisks chắc chắn có khả năng làm. Nhưng:

  • Tôi không muốn hệ thống tập tin được tự động gắn kết khi cắm thiết bị, chỉ cần đưa cho tôi điểm gắn kết ma có tên LABEL

Việc gắn hệ thống tập tin thực tế chỉ nên xảy ra khi truy cập lần đầu vào điểm gắn kết, giống như hoạt động bóng mờ tự động. Điều này sẽ giảm nguy cơ làm bẩn hệ thống tập tin bằng cách vô tình rút phích cắm thiết bị, trong khi vẫn cung cấp khả năng truy cập tuyệt vời.

Trên hết, tôi có thể sử dụng biết mọi lúc mọi thứ đang diễn ra, trong DE của tôi.

  • Có một ứng dụng khay hệ thống có khả năng chỉ ra trạng thái của tất cả các thiết bị tự động tức là màu xanh lá cây = không có gì được gắn kết, màu đỏ = một cái gì đó được gắn kết?
  • Có cách nào không phân phối để cung cấp thông báo hoạt động gắn kết hệ thống tập tin (un), ví dụ như sử dụng thông báo-gửi không? Những gì về Gentoo cụ thể, điều đó cũng làm việc cho tôi. Script udev không giúp với NFS và CIFS, phải không?

Combo này nên là thiết lập tự động cuối cùng, hoặc tôi đang thiếu một cái gì đó?


Tôi đã ở với Gnome trong vài năm qua, vì vậy việc tự mình không còn phù hợp nữa.
lkraav

Câu trả lời:


4

Đây là tất cả khả thi với udev. Hãy xem UAM , dường như giải quyết hầu hết các vấn đề bạn đã đề cập, nhưng thực tế lại tự động gắn kết. Nếu bạn thích, bạn có thể sử dụng các khả năng tuyệt vời mà nó cung cấp, nhưng sửa đổi nó để phương tiện không được gắn tự động. Bạn cũng có thể liên hệ với tác giả và đề xuất phương pháp lắp đặt không tự động của bạn như một tính năng mới. Trong khi đó, có một cái nhìn ngắn gọn về khả năng của nó:

  • Nó hoạt động trên đỉnh udev, làm cho nó độc lập DE và dựa trên sự kiện. (Nó cũng gợi ý cách giải quyết cho phương tiện quang học có thể không bị phát hiện bởi udev.)
  • Cho phép bạn xác định MOUNTPOINT_TEMPLATEScó thể giải quyết vấn đề đặt tên bạn đã đề cập theo một số cách tùy chỉnh (xem uam.conf ), có khả năng cũng sử dụng LABEL(như bạn muốn)
  • Các cơ chế thông báo được hỗ trợ, bạn sẽ chỉ cần điều chỉnh chúng theo nhu cầu cụ thể DE của mình.
  • Nó dường như có một thiết kế rõ ràng, cho phép bạn dễ dàng xác định vị trí, thời điểm và cách mỗi hành động được kích hoạt.

Hôm nay tôi được giới thiệu đến tinymount trên #awgie, những người quan tâm đến chủ đề này có lẽ nên kiểm tra nó
lkraav

Trong khi đó, tôi tiếp tục sử dụng bashmount.
lkraav

2

Đâ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.

Tập lệnh trước tiên sẽ sử dụng "/ sbin / blkid" để tìm hiểu loại hệ thống tập tin 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 thời gian chờ 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ề 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.
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.