Tự động gắn ổ đĩa ngoài vào / media / LABEL khi khởi động mà không cần người dùng đăng nhập?


73

Câu hỏi này tương tự, nhưng loại trái ngược với những gì tôi muốn. Tôi muốn các ổ USB ngoài được gắn tự động khi khởi động mà không cần ai đăng nhập, vào các vị trí như thế nào /media/<label>.

Tôi không muốn phải nhập tất cả dữ liệu vào fstab, một phần vì nó tẻ nhạt và khó chịu, nhưng chủ yếu là vì tôi không thể dự đoán được những gì tôi sẽ cắm vào nó hoặc cách phân vùng sẽ thay đổi trong tương lai.

Tôi muốn các ổ đĩa có thể truy cập được vào những thứ như MPD và có sẵn khi tôi đăng nhập bằng SSH. gnome-mountdường như chỉ gắn kết mọi thứ khi bạn đăng nhập cục bộ vào phiên đồ họa Gnome.


4
Câu hỏi tuyệt vời, ước gì tôi có câu trả lời cho bạn, bây giờ tôi tò mò không biết giải quyết như thế nào.
đảo ngược

1
Tôi cập nhật câu trả lời của tôi.
Ryan Thompson

1
Và tôi, đối với bản ghi, không có vấn đề gì với Gnome được cài đặt, như tôi đã làm, nhưng một giải pháp cho các máy chủ không có GUI không đầu sẽ là tốt nhất.
endolith

1
ARRRGHH ... lỗi trong câu trả lời của tôi. trong CHẠY. /usr/local/sbin/udev-automounter.sh mount %knên /usr/local/sbin/udev-automounter.sh %k. lấy làm tiếc.
quack quixote

1
OK, kể từ Update-3, nó hoạt động với khoảng trắng. nó làm như vậy bằng cách sử dụng phiên bản "được mã hóa" của <LABEL> để chuyển đổi không gian thành \x20's. Vì vậy, nó không đẹp, nhưng nó sẽ hoạt động. udev không xử lý các nhãn có không gian độc đáo, nhưng có một tùy chọn khác sử dụng dấu gạch dưới thay vì \x20(vì vậy ít nhất nó trông cũng đẹp). có vẻ như xử lý không gian phải đi vào shellscripts.
quack quixote

Câu trả lời:


74
  • Lưu ý cho Ubuntu Server 11.10: Tập lệnh này không thành công trên Ubuntu Server 11.10 do vol_idlệnh lỗi thời . vol_idđã được thay thế bởi blkid. Để sửa tập lệnh, thay thế "vol_id" bằng "blkid -o udev" trong udev-auto-mount.shtập lệnh.

Tôi đã đập đầu mình một lúc rồi và tôi nghĩ mình đã tìm được giải pháp hiệu quả. Điều này được phát triển và thử nghiệm trên một hệ thống dựa trên Debian, vì vậy nó sẽ hoạt động trên Ubuntu. Tôi sẽ chỉ ra các giả định mà nó đưa ra để nó cũng có thể thích nghi với các hệ thống khác.

  • Nó sẽ tự động gắn ổ USB vào plugin và không cần nhiều thời gian để thích ứng với Firewire.
  • Nó sử dụng UDEV, do đó, không có trò đùa với HAL / DeviceKit / Gnome-Anything.
  • Nó tự động tạo một /media/LABELthư mục để gắn thiết bị.

  • Tuy nhiên, nó có thể can thiệp vào các thiết bị tự động khác; Tôi không thể kiểm tra điều đó. Tôi hy vọng rằng, với Gnome-VFS hoạt động, cả hai có thể thử thực hiện việc gắn kết ... nếu Gnome-VFS không thực hiện được việc gắn kết, nó có thể không định cấu hình biểu tượng máy tính để bàn. Có thể ngắt kết nối từ Gnome, nhưng có thể yêu cầu gksudohoặc tương tự.

Tôi chưa thử nghiệm điều này khi khởi động hệ thống, nhưng lý do duy nhất tôi có thể thấy rằng nó có thể không hoạt động là nếu nó cố gắn ổ USB trước khi hệ thống sẵn sàng để gắn kết. Nếu đó là trường hợp, có lẽ bạn sẽ cần một điều chỉnh bổ sung cho tập lệnh gắn kết. (Tôi đang kiểm tra với ServerFault để xem có lời khuyên nào không, nhưng không quan tâm nhiều đến nó ở đó.)

Sau đó, sau đó.


Tài liệu tham khảo UDEV:


Bối cảnh (UDEV? Whuzzat?)

UDEV là hệ thống cắm nóng của kernel. Đó là những gì tự động cấu hình các thiết bị và liên kết tượng trưng thiết bị phù hợp (ví dụ /dev/disk/by-label/<LABEL>), cả lúc khởi động và cho các thiết bị được thêm trong khi hệ thống đang chạy.

D-Bus và HAL được sử dụng để gửi các sự kiện phần cứng tới người nghe như Môi trường máy tính để bàn. Vì vậy, khi bạn đăng nhập vào Gnome và cắm CD hoặc cắm vào ổ USB, sự kiện đó diễn ra theo chuỗi này:

kernel -> udev -> dbus -> hal -> gnome-vfs/nautilus (mount)

Và thế là, ổ đĩa của bạn được gắn kết. Nhưng trong một hệ thống không đầu, chúng tôi không muốn phải đăng nhập để nhận được lợi ích của việc tự động hóa.

Quy tắc Udev

Vì UDEV cho phép chúng tôi viết các quy tắc và chạy các chương trình khi chèn thiết bị, đây là một lựa chọn lý tưởng. Chúng tôi sẽ tận dụng các quy tắc hiện có của Debian / Ubuntu, để họ thiết lập /dev/disk/by-label/<LABEL>liên kết tượng trưng cho chúng tôi và thêm một quy tắc khác sẽ gắn kết thiết bị cho chúng tôi.

Các quy tắc của UDEV được giữ trong /etc/udev/rules.d(và /lib/udev/rules.dtrên Karmic) và được xử lý theo thứ tự số. Bất kỳ tệp nào không bắt đầu bằng số được xử lý sau các tệp được đánh số. Trên hệ thống của tôi, các quy tắc HAL nằm trong một tệp được gọi 90-hal.rules, vì vậy tôi đặt các quy tắc của mình vào 89-local.rulesđể chúng được xử lý trước khi chúng đến HAL. Chủ yếu, bạn cần chắc chắn rằng các quy tắc này xảy ra sau 60-persistent-storage.rules. local.rulescó thể đủ tốt

Đặt điều này trong tệp quy tắc mới của bạn:

# /etc/udev/rules.d/local.rules 
# /etc/udev/rules.d/89-local.rules
# ADD rule: if we have a valid ID_FS_LABEL_ENC, and it's USB, mkdir and mount
ENV{ID_FS_LABEL_ENC}=="?*",   ACTION=="add",      SUBSYSTEMS=="usb", \
         RUN+="/usr/local/sbin/udev-automounter.sh %k"
  • Hãy chắc chắn rằng không có khoảng trắng nào sau \, chỉ là một newline( \n).

  • Thay đổi SUBSYSTEMS=="usb"để được SUBSYSTEMS=="usb|ieee1394"hỗ trợ Firewire.

  • Nếu bạn muốn thiết bị luôn được sở hữu bởi một người dùng cụ thể, hãy thêm một OWNER="username"mệnh đề. Nếu bạn chỉ cần các tệp thuộc sở hữu của một người dùng cụ thể, hãy điều chỉnh tập lệnh mount thay thế.

Đọc quy tắc

Điều này thêm một chương trình để chạy vào danh sách các chương trình sẽ chạy. Nó xác định các thiết bị phân vùng USB bằng cách <LABEL>, sau đó chuyển thông tin này đến một tập lệnh thực hiện việc gắn kết. Cụ thể, quy tắc này phù hợp:

  1. ENV{ID_FS_LABEL_ENC}=="?*"- một biến môi trường được thiết lập bởi một quy tắc hệ thống trước đó. Không tồn tại cho các hệ thống không phải tệp, vì vậy đó là lý do tại sao chúng tôi kiểm tra nó. Chúng tôi thực sự muốn sử dụng ID_FS_LABELcho điểm gắn kết, nhưng tôi đã không thuyết phục được UDEV thoát nó cho tôi, vì vậy chúng tôi sẽ để kịch bản gắn kết xử lý điều đó.

    Biến này và các biến môi trường khác được udev thu được bằng cách sử dụng vol_idlệnh ( không dùng nữa ). Đây là một công cụ tiện dụng để xem chi tiết nhanh chóng trên phân vùng:

    $ sudo vol_id /dev/sdc1
    ID_FS_TYPE=ext2
    ID_FS_UUID=a40d282a-4a24-4593-a0ab-6f2600f920dd
    ID_FS_LABEL=Travel Dawgs
    ID_FS_LABEL_ENC=Travel\x20Dawgs
    ID_FS_LABEL_SAFE=Travel_Dawgs
    
  2. ACTION=="add"- chỉ phù hợp với addsự kiện ...

  3. SUBSYSTEMS=="usb"- chỉ phù hợp với các thiết bị trên bus USB. Chúng tôi sử dụng SUBSYSTEMSở đây vì điều này phù hợp với cha mẹ của thiết bị của chúng tôi; thiết bị chúng tôi quan tâm thực sự sẽ là SUBSYSTEM == "scsi". Việc kết hợp với thiết bị USB gốc sẽ tránh thêm chương trình của chúng tôi vào các ổ đĩa trong.

  4. RUN+="..."- không phải là một trận đấu, mà là một hành động: thêm chương trình này vào danh sách các chương trình sẽ chạy. Trong các đối số của chương trình, %kđược mở rộng thành tên thiết bị (ví dụ: sdc1không /dev/sdc1) và $env{FOO}lấy nội dung của biến môi trường FOO.

Kiểm tra quy tắc

Liên kết tham chiếu đầu tiên (ở trên) là một hướng dẫn tuyệt vời về UDEV, nhưng nó hơi lỗi thời. Các chương trình mà nó chạy để kiểm tra các quy tắc của bạn ( udevtestđặc biệt) đã được thay thế bằng udevadmtiện ích Catch-all .

Sau khi bạn đã thêm quy tắc, hãy cắm thiết bị của bạn. Đợi vài giây, sau đó kiểm tra xem thiết bị được gán cho thiết bị nào:

$ ls -l /dev/disk/by-label/*
lrwxrwxrwx 1 root root 10 2009-10-25 07:27 label_Foo -> ../../sda1
lrwxrwxrwx 1 root root 10 2009-10-25 07:27 label_Bar -> ../../sdb1
lrwxrwxrwx 1 root root 10 2009-10-25 07:27 label_Baz -> ../../sdc1

Nếu ổ đĩa có thể tháo rời của bạn chứa label_Baz, nó nằm trên thiết bị sdc1. Chạy cái này và nhìn vào đầu ra về cuối:

$ sudo udevadm test /sys/block/sdc/sdc1
parse_file: reading (...)                           (many lines about files it reads)
import_uevent_var: import into environment: (...)   (many lines about env variables)
(...)                                               (many lines tracing rule matches & programs run)
update_link: found 1 devices with name 'disk/by-label/LABEL_BAZ'
update_link: found '/block/sdc/sdc1' for 'disk/by-label/LABEL_BAZ'
update_link: compare (our own) priority of '/block/sdc/sdc1' 0 >= 0
update_link: 'disk/by-label/LABEL_BAZ' with target 'sdc1' has the highest priority 0, create it
udevtest: run: '/usr/local/sbin/udev-automounter.sh sdc1 LABEL_BAZ'
udevtest: run: 'socket:/org/freedesktop/hal/udev_event'
udevtest: run: 'socket:@/org/kernel/udev/monitor'

Tìm tên tập lệnh từ RUN+=quy tắc của chúng tôi trong một vài dòng cuối cùng (thứ 3 từ dưới cùng trong ví dụ này). Bạn có thể thấy các đối số sẽ được sử dụng cho thiết bị này. Bạn có thể chạy lệnh đó ngay bây giờ để kiểm tra xem các đối số có âm thanh không; nếu nó hoạt động trên dòng lệnh của bạn, nó sẽ tự động hoạt động khi thiết bị được chèn.

Bạn cũng có thể theo dõi các sự kiện UDEV trong thời gian thực: chạy sudo udevadm monitor(xem man udevadmchi tiết về các công tắc). Sau đó, chỉ cần cắm vào một thiết bị mới và xem các sự kiện cuộn qua. (Có thể là quá mức trừ khi bạn vào các chi tiết thực sự cấp thấp ...)

Tải lại các quy tắc

Khi bạn đã xác minh quy tắc đang được đọc đúng cách, bạn cần yêu cầu UDEV tải lại quy tắc để quy tắc mới có hiệu lực. Sử dụng bất kỳ phương pháp nào trong số này (nếu cách thứ nhất không hoạt động, cách thứ hai nên ... nhưng hãy thử cách đầu tiên):

  • chạy sudo udevadm control --reload-rules

  • chạy sudo /etc/init.d/udev reload

  • khởi động lại


Kịch bản! Trên thực tế, 2 tập lệnh ...


Đây là kịch bản đầu tiên. Vì chương trình chúng tôi chạy cần hoàn thành nhanh chóng, điều này chỉ làm cho tập lệnh thứ hai tắt trong nền. Đặt cái này vào /usr/local/sbin/udev-automounter.sh:

#!/bin/sh
#
# USAGE: usb-automounter.sh DEVICE 
#   DEVICE   is the actual device node at /dev/DEVICE

/usr/local/sbin/udev-auto-mount.sh ${1} &

Đây là kịch bản thứ hai. Điều này không kiểm tra đầu vào nhiều hơn một chút. Đặt điều này trong /usr/local/sbin/udev-auto-mount.sh. Bạn có thể muốn điều chỉnh các tùy chọn gắn kết bên dưới. Kịch bản lệnh này hiện tự xử lý việc tìm phân vùng LABEL; UDEV chỉ gửi tên THIẾT BỊ.

Nếu có vấn đề về việc gắn ổ đĩa vào thời gian khởi động , bạn có thể đặt một đoạn mã dài sleep 60trong tập lệnh này, để cho hệ thống có thời gian hoàn thành trước khi tập lệnh cố gắng gắn ổ đĩa.

Tôi đã đưa ra một gợi ý trong các nhận xét về cách kiểm tra (chạy psđể xem máy chủ web có đang chạy không), nhưng bạn sẽ muốn điều chỉnh điều đó cho hệ thống của mình. Tôi nghĩ rằng hầu hết các máy chủ mạng mà bạn có thể đang sử dụng đều đủ cho mục đích này - nfsd, smbd, apache, v.v ... Rủi ro, tất nhiên, là tập lệnh mount sẽ thất bại nếu dịch vụ không chạy, vì vậy có thể thử nghiệm sự tồn tại của tập tin cụ thể sẽ là một giải pháp tốt hơn.

#!/bin/sh
#
# USAGE: udev-auto-mount.sh DEVICE
#   DEVICE   is the actual device node at /dev/DEVICE
# 
# This script takes a device name, looks up the partition label and
# type, creates /media/LABEL and mounts the partition.  Mount options
# are hard-coded below.

DEVICE=$1

# check input
if [ -z "$DEVICE" ]; then
   exit 1
fi

# test that this device isn't already mounted
device_is_mounted=`grep ${DEVICE} /etc/mtab`
if [ -n "$device_is_mounted" ]; then
   echo "error: seems /dev/${DEVICE} is already mounted"
   exit 1
fi

# If there's a problem at boot-time, this is where we'd put
# some test to check that we're booting, and then run
#     sleep 60
# so the system is ready for the mount below.
#
# An example to experiment with:
# Assume the system is "booted enough" if the HTTPD server is running.
# If it isn't, sleep for half a minute before checking again.
#
# The risk: if the server fails for some reason, this mount script
# will just keep waiting for it to show up.  A better solution would
# be to check for some file that exists after the boot process is complete.
#
# HTTPD_UP=`ps -ax | grep httpd | grep -v grep`
# while [ -z "$HTTPD_UP" ]; do
#    sleep 30
#    HTTPD_UP=`ps -ax | grep httpd | grep -v grep`
# done


# pull in useful variables from vol_id, quote everything Just In Case
eval `/sbin/vol_id /dev/${DEVICE} | sed 's/^/export /; s/=/="/; s/$/"/'`

if [ -z "$ID_FS_LABEL" ] || [ -z "$ID_FS_TYPE" ]; then
   echo "error: ID_FS_LABEL is empty! did vol_id break? tried /dev/${DEVICE}"
   exit 1
fi


# test mountpoint - it shouldn't exist
if [ ! -e "/media/${ID_FS_LABEL}" ]; then

   # make the mountpoint
   mkdir "/media/${ID_FS_LABEL}"

   # mount the device
   # 
   # If expecting thumbdrives, you probably want 
   #      mount -t auto -o sync,noatime [...]
   # 
   # If drive is VFAT/NFTS, this mounts the filesystem such that all files
   # are owned by a std user instead of by root.  Change to your user's UID
   # (listed in /etc/passwd).  You may also want "gid=1000" and/or "umask=022", eg:
   #      mount -t auto -o uid=1000,gid=1000 [...]
   # 
   # 
   case "$ID_FS_TYPE" in

       vfat)  mount -t vfat -o sync,noatime,uid=1000 /dev/${DEVICE} "/media/${ID_FS_LABEL}"
              ;;

              # I like the locale setting for ntfs
       ntfs)  mount -t auto -o sync,noatime,uid=1000,locale=en_US.UTF-8 /dev/${DEVICE} "/media/${ID_FS_LABEL}"
              ;;

              # ext2/3/4 don't like uid option
       ext*)  mount -t auto -o sync,noatime /dev/${DEVICE} "/media/${ID_FS_LABEL}"
              ;;
   esac

   # all done here, return successful
   exit 0
fi

exit 1

Tập lệnh dọn dẹp siêu thưởng!

Thêm một kịch bản. Tất cả điều này là ngắt kết nối thiết bị và loại bỏ các thư mục mountpoint. Nó giả định rằng nó có quyền riêng tư để làm điều này, vì vậy bạn sẽ cần phải chạy nó với sudo. Tập lệnh này hiện lấy điểm gắn kết đầy đủ trên dòng lệnh, ví dụ:

$ /usr/local/sbin/udev-unmounter.sh "/media/My Random Disk"

Đặt cái này vào /usr/local/sbin/udev-unmounter.sh:

#!/bin/sh
#
# USAGE: udev-unmounter.sh MOUNTPT
#   MOUNTPT is a mountpoint we want to unmount and delete.
MOUNTPT="$1"

if [ -z "$MOUNTPT" ]; then
   exit 1
fi


# test mountpoint - it should exist
if [ -e "${MOUNTPT}" ]; then

   # very naive; just run and pray
   umount -l "${MOUNTPT}" && rmdir "${MOUNTPT}" && exit 0

   echo "error: ${MOUNTPT} failed to unmount."
   exit 1
fi

echo "error: ${MOUNTPT} does not exist"
exit 1

3
Bạn tuyệt vời! :)
kolypto

1
Nếu tôi chạy auto-mount.sh theo cách thủ công thì nó hoạt động, nhưng nếu tôi cắm vào ổ đĩa và không khởi động. : /
endolith

Vì vậy, vấn đề là với các quy tắc UDEV. Hãy mở rộng phần đó một chút để giúp bạn gỡ lỗi.
quack quixote

3
Tôi đã tập hợp tất cả các tập lệnh trên github: github.com/fatso83/Code-Snippets/tree/master/system-utils/. Chúng hoạt động tốt trên Ubuntu 10.10 và cũng bao gồm tự động ngắt kết nối
oligofren

1
Tham khảo: udev_237 - man udev (Ubuntu_18.04) Lưu ý rằng các chương trình đang chạy truy cập mạng hoặc hệ thống tập tin mount / unmount không được phép bên trong các quy tắc udev , do hộp cát mặc định được thi hành trên systemd-udevd.service. nguồn: unix.stackexchange.com/questions/200194/NH Để biết giải pháp, hãy xem serverfault.com/questions/766506/ trên
Sao lưu Pro

9

Một lựa chọn cuối cùng mà những người khác đã đề xuất trên mạng là ivman, nhưng điều đó dường như phụ thuộc vào pmount, điều mà bạn đã tuyên bố không hoạt động. pmountbị bỏ rơi và ivmangần như nhau.

Sự thay thế cho ivmanhalevt, và nó có sẵn trong Karmic. Đây là một sự tái hiện của ivman(đọc: "duy trì" và "không phụ thuộc vào pmount"). Gói không có sẵn trên Jaunty, mặc dù bạn có thể tự xây dựng nó nếu bạn không có kế hoạch nâng cấp.

Cả hai công cụ này đều nằm phía trên các lớp DBus và HAL và phản hồi các sự kiện từ chúng. Rõ ràng cả hai có thể chạy như một trình nền hệ thống hoặc như một trình quản lý gắn kết phiên người dùng (a la Gnome-VFS) - các /etc/defaults/{ivman,halevt}tệp chịu trách nhiệm cài đặt hệ thống.

Dưới đây là một số hướng dẫn để điều chỉnh ivmanđể sử dụng /media/<LABEL>mountpoint. Có thể đó halevtlà một cách đơn giản hơn để làm điều đó, nhưng có lẽ họ sẽ giúp bạn tìm thấy câu trả lời.


Làm việc với HALEVT

Cập nhật : Vì lợi ích của việc gắn CD tự động, mà câu trả lời UDEV của tôi không cung cấp, tôi đã xem xét sâu hơn halevt. Tôi tìm thấy bài viết trên blog này đã giúp giải thích rất nhiều về quá trình. Tôi đã phải biên dịch halevtgói riêng của mình cho Debian Lenny (may mắn thay, tất cả các phụ thuộc đều nằm trong phần lenny-backports). Sau khi cài đặt, quá trình này hầu như không khủng khiếp:

  1. Đảm bảo hệ thống halevt-daemon được bật trong /etc/default/halevt
  2. Cho phép người dùng halevt hệ thống gắn thiết bị vào /etc/PolicyKit/PolicyKit.conf(xem bên dưới; nguồn )
  3. Sửa đổi chính sách HAL để sao chép nhãn âm lượng vào điểm gắn kết ưa thích trong /etc/hal/fdi/policy/preferences.fdi(xem bên dưới)
  4. Nếu bạn muốn hỗ trợ CD / DVD, hãy lấy eject.haltập lệnh từ nhóm blog trên, sửa đổi và lưu vào /usr/local/bin.
  5. Sửa đổi cấu hình hệ thống halevt để cho phép gắn kết /etc/halevt/halevt.xml
  6. Thêm mã vào tập lệnh trước và sau phiên của người quản lý đăng nhập của bạn để dừng halevt-daemon của hệ thống khi ai đó đăng nhập và khởi động lại khi họ đăng xuất.

Nếu bạn cần khởi động lại trình nền HAL và HALEVT để kiểm tra cấu hình mới của mình, hãy sử dụng tùy chọn này để có được chúng theo đúng thứ tự:

sudo sh -c "/etc/init.d/halevt stop ; /etc/init.d/hal restart ; /etc/init.d/halevt start"

Bước 1

Kiểm tra xem START_DAEMON=yestrong /etc/default/halevt.

Bước 2

Trong /etc/PolicyKit/PolicyKit.conf, thêm này bên trong các <config></config>phần:

<match action="org.freedesktop.hal.storage.mount-removable">
   <match user="halevt">
      <return result="yes"/>
   </match>
</match>

Bước 3

Trong /etc/hal/fdi/policy/preferences.fdi, thêm phần này vào bên trong phần `:

<match key="volume.label" empty="false">
    <match key="volume.label" is_absolute_path="false">
        <merge key="volume.policy.desired_mount_point" type="copy_property">volume.label</merge>
    </match>
</match>

Bước 4

Kịch bản là tốt nhưng cần phải chạy /bin/bash; một số hệ thống thực sự có thể sử dụng /bin/dashkhi /bin/shđược gọi. Vì vậy, thay đổi dòng trên cùng trong tập lệnh để đảm bảo bạn chọn đúng:

#!/bin/sh         <------ old first line

#!/bin/bash       <------ new first line

Bước 5

Đây là phần thú vị. Hệ thống của bạn có thể đã cung cấp cơ bản /etc/halevt/halevt.xmlrồi, vì vậy bạn sẽ phải điều chỉnh nó để sử dụng cho riêng mình. Trong trường hợp của tôi, hệ thống của tôi đã cung cấp tính năng tháo lắp cơ bản, nhưng tôi phải thêm hỗ trợ cho việc gắn CDROM và nút nhả.

Bài đăng blog tôi đã đề cập có một cấu hình XML ví dụ tốt để xem xét các chỉnh sửa của riêng bạn. Chủ yếu là về việc thiết lập một thay thế gnome-mount cho fluxboxmôi trường của tác giả , do đó, ví dụ XML của anh ta làm được nhiều hơn những gì bạn muốn, nhưng đó là một cách tuyệt vời để cảm nhận những gì bạn có thể làm. Ngoài ra còn có một số ví dụ tốt trong /usr/share/doc/halevt/examples.

Tôi cũng phải chạy sudo sh -c "mkdir /var/halevt ; chown halevt:plugdev /var/halevt"trước khi mọi thứ hoạt động.

Đây là những bổ sung của tôi để làm cho CD / DVD tự động hoạt động:

<!-- CD/DVD mount -->
<halevt:Device match="hal.block.device &amp; hal.block.is_volume = true  &amp; hal.volume.is_disc = true &amp; hal.volume.disc.has_data = true">
   <halevt:Property name="hal.volume.is_mounted">
      <halevt:Action value="true" exec="halevt-mount -u $hal.udi$ -p $hal.volume.policy.desired_mount_point$ -m 002"/>
   </halevt:Property>
</halevt:Device>

<!-- CD/DVD eject button support -->
<halevt:Device match="hal.storage.drive_type = cdrom">
   <halevt:Condition name="EjectPressed" exec='/usr/local/bin/eject.hal $hal.block.device$'/>
</halevt:Device>

Bước 6

Khi bạn đã làm cho hệ thống halevt-daemon hoạt động, bạn sẽ cần phải vô hiệu hóa nó khi bạn đăng nhập vào Gnome và khởi động lại nó khi bạn đăng xuất. (Xem câu trả lời của tôi cho câu hỏi này cho người quản lý đăng nhập không phải GDM.) Công cụ này là lý thuyết vì tôi không sử dụng nó, nhưng nó sẽ hoạt động.

Trong /etc/gdm/PreSession/Default, thêm phần này để dừng hệ thống halevt-daemon:

/etc/init.d/halevt stop

Trong /etc/gdm/PostSession/Default, thêm phần này để khởi động lại hệ thống halevt-daemon:

/etc/init.d/halevt start

3
Đối với những người đọc điều này vào năm 2013, bây giờ họ nên biết rằng HAL đã bị phản đối, và họ nên sử dụng các giải pháp dựa trên udev như một quixote quackote đã đưa ra ở trên.
oligofren

6

Thời gian trôi qua, giải pháp dễ dàng hơn xuất hiện.

Giải pháp này dựa trên gói phần mềm udevil được viết cho mục đích này và không yêu cầu phải sửa đổi các quy tắc udev. Có lẽ tốt hơn (đối với người dùng mới và cũ) là một giải pháp đơn giản.

Các devmonkịch bản từ udevil hiện tất cả sự kỳ diệu trong khi chỉ phụ thuộc vào udev và lém lỉnh. Hoạt động gần như ra khỏi hộp mà không cần cấu hình ban đầu.

Tất cả những gì tôi đã làm trên máy trạm của mình là gọi devmon rc.localnhư thế này:
devmon 2>&1 >> /var/log/devmon &
Để bạn thoải mái, bạn có thể muốn nhúng đoạn mã này vào tập lệnh init thay vì rc.localsử dụng một công cụ tự động như pleaserunđể tạo nó: https://unix.stackexchange.com/ a / 124609/42673

Sau khi chạy, bộ lưu trữ mà tôi cắm được kiểm tra (nó tìm phân vùng và nếu tìm thấy sẽ nhìn vào nhãn hệ thống tập tin của chúng) rồi gắn vào /media/FILESYSTEM_LABEL.
Không thể tưởng tượng bất cứ điều gì đơn giản hơn thế, ngoại trừ có thể hệ thống nổi tiếng (trong) sẽ kết hợp chức năng này vào một thời điểm nào đó trong tương lai.

udevil At A Glance ( github.io/udevil )
Script: devmon ( igurublog / script-devmon )


3

Câu trả lời của quack quixote không hoạt động trên Ubuntu Lucid Lynx (10.04) - không có /sbin/vol_idlệnh.

Thay vì ưa thích và sử dụng udev, hãy đặt nó vào /etc/rc.local của bạn và được thực hiện:

for dev in $(ls -1 /dev/disk/by-label/* | grep -v EFI) ; do
  label=$(basename $dev)
  mkdir -p /media/$label
  $(mount | grep -q /media/$label) || mount $dev /media/$label
done

1
CẢM ƠN BẠN .. đây là cách đơn giản nhất cho những gì tôi muốn thực hiện. Thậm chí hoạt động trên Ubuntu Server 16 với khối lượng ntfs
ChrisPrime

3

Đối với các hệ thống dựa trên Debian (ví dụ: Ubuntu, v.v.), có gói usbmount tự động gắn ổ đĩa USB cho bạn. Về cơ bản, nó sử dụng một cách tiếp cận dựa trên udev như đã vạch ra - chỉ có nó chỉ là một gói cài đặt đơn giản. Có vẻ như tác giả ban đầu của gói đã hết hơi nhưng Ubuntu / Debian vẫn xuất hiện để duy trì nó (tôi đoán nó không phức tạp lắm) - vì vậy nó vẫn có sẵn trong các bản phát hành mới nhất.

Các tập lệnh được cài đặt có thể được cấu hình (/etc/usbmount/usbmount.conf) để cung cấp các điểm gắn kết thích hợp.


1
USBmount không thể gắn kết theo nhãn mặc dù, trừ khi bạn điền vào danh sách các nhãn trong tệp cấu hình.
Gilles

1
Xem bài esite.ch/2014/04/11/ trên nếu bạn muốn thêm gắn vào nhãn vào usbmount mà không cần duy trì một danh sách.
Oliver Sauder

3

Để tuôn ra các hướng dẫn tuyệt vời của quack quixote để loại bỏ:

Thêm dòng sau vào tệp quy tắc udev bạn đã tạo trước đó (/etc/udev/rules.d) "

ENV{ID_FS_LABEL_ENC}=="?*",   ACTION=="remove",      SUBSYSTEMS=="usb", \
         RUN+="/usr/local/sbin/udev-autounmounter.sh %k"

Tiếp theo tạo tập lệnh sau và chmod nó có thể thực thi được (/usr/local/sbin/udev-autounm gặp.sh) với nội dung sau:

#!/bin/sh
#
# USAGE: usb-autounmounter.sh DEVICE 
#   DEVICE   is the actual device node at /dev/DEVICE

/usr/local/sbin/udev-auto-unmount.sh ${1} &

Cuối cùng, chính tập lệnh unmount (udev-auto-unmount.sh):

#!/bin/sh
#
# USAGE: udev-auto-unmount.sh DEVICE
#   DEVICE   is the actual device node at /dev/DEVICE
# 
# This script takes a device name, looks up the partition label and
# type, creates /media/LABEL and mounts the partition.  Mount options
# are hard-coded below.

DEVICE=$1

# check input
if [ -z "$DEVICE" ]; then
   exit 1
fi

#test that the device is already mounted
MOUNTPT=`mount | grep ${DEVICE} | cut -d ' ' -f 3`
if [ -z "${MOUNTPT}" ]; then
   echo "error: the device is not already mounted"
   exit 1
fi

# test mountpoint - it should exist
if [ -e "${MOUNTPT}" ]; then

   # very naive; just run and pray
   umount -l "${MOUNTPT}" && rmdir "${MOUNTPT}" && exit 0

   echo "error: ${MOUNTPT} failed to unmount."
   exit 1
fi

echo "error: ${MOUNTPT} does not exist"
exit 1

Vì vậy, với các hướng dẫn khác, thư mục sẽ tự động xuất hiện và biến mất trong các sự kiện udev.


Tôi nghĩ là if [ -n "$device_is_mounted" ]; thennên if [ -z "${MOUNTPT}" ]; then, không nên?
thay đổi

2

Bạn có thể muốn thử Pysdm


Đó chỉ là một trình soạn thảo fstab, phải không?
endolith

Có, nhưng "Nó cũng cho phép tạo ra các quy tắc udev cho cấu hình động của các thiết bị lưu trữ"
Sathyajith Bhat

"Tạo ra các quy tắc udev" sẽ giúp tôi theo một cách nào đó? Tôi không biết điều đó có nghĩa là gì. Nó có gắn các thiết bị di động không xác định trước đó mà không có người dùng đăng nhập cục bộ không?
endolith

Xin lỗi, tôi không có bất kỳ manh mối nào về các quy tắc udev. Bạn có thể có một cái nhìn tại fredericiana.com/2006/03/15/wr-udev-rules-short-noteskích hoạt
lại.net/wr_udev_rules.html

2

Bạn có thể thử đặt su username -c gnome-volume-manager/etc/rc.local. Nó có thể là đủ để chỉ cần chạy gnome-volume-manager.

Chỉnh sửa: Có vẻ như gnome-volume-manager không còn là một phần của phân phối mặc định, ngay cả trên máy tính để bàn Ubuntu.

wajig policy  gnome-volume-manager
gnome-volume-manager:
  Installed: (none)
  Candidate: 2.24.0-0ubuntu1
  Version table:
     2.24.0-0ubuntu1 0
        500 http://ubuntu.secs.oakland.edu jaunty/universe Packages

Tuy nhiên, có thể nếu bạn cài đặt nó, nó vẫn sẽ hoạt động. Rất đáng để thử. Nếu nó không hoạt động, loại bỏ nó một lần nữa.

Ngoài ra còn có usbmountgói, thực hiện những gì bạn muốn, nhưng có thể có thể can thiệp vào tính năng tự động thông thường.


Lệnh Unknown gnome-volume-manager '. Tôi đang ở trong Ubuntu Jasyy.
endolith

Có một / usr / lib / gnome-volume-manager / gnome-volume-manager, nhưng nó không làm gì cả.
endolith

Ồ tôi hiểu rồi. Cũng có một gói gọi là gnome-volume-manager. Liên quan: crunchbanglinux.org/forums/topic/239/ Quảng
endolith

Có vẻ như gnome-volume-manager sử dụng HAL để gắn kết mọi thứ? Và "Kể từ năm 2009, HAL đang trong quá trình bị từ chối ủng hộ DeviceKit." Tại sao mọi thứ trong Linux luôn như thế này? Họ chỉ bắt đầu để có được một cái gì đó hoạt động gần như đúng và sau đó họ rút nó ra và thay thế nó bằng một cái gì đó mới không hoạt động.
endolith

pmount thậm chí không hoạt động nữa. > Pmount / dev / disk / by-nhãn / BẢO QUẢN Lỗi: thiết bị / dev / sdc1 không phải là di togaware.com/linux/survivor/Using_Gnome_Volume_Manager.html
endolith

2

Các phụ lục được chỉnh sửa của tôi cho giải pháp dựa trên udev của quack quixote đã bị từ chối, vì vậy tôi sẽ đặt chúng ở đây. Hãy tham khảo bài viết của mình trước.

Trước hết, nếu bạn muốn quy tắc udev của mình hoạt động khi bất kỳ thiết bị nào được gắn thông qua hệ thống con SCSI (bao gồm cả USB, FireWire và eSATA), hãy thay đổi đối sánh SUBSYSTEMS trong quy tắc udev thành SUBSYSTEMS=="scsi".

Mặc dù vậy, hãy nhớ rằng điều này sẽ tự động gắn kết khá nhiều thứ, kể cả các ổ đĩa trong nếu bạn cắm chúng trong khi hệ thống đang chạy, vì vậy nó có thể không phải là điều bạn muốn.

Thứ hai, đây là tập lệnh tôi đang sử dụng thay thế tất cả các tập lệnh trong bài viết đó. Nó cũng tự động dọn sạch các điểm gắn kết được tạo trong / media / ngay khi thiết bị khối gắn kết được gỡ bỏ - không cần can thiệp thủ công. Hơn nữa, thay vì gọi một tập lệnh khác để chạy trong nền, nó đặt chính nó vào nền khi nó không được thực thi từ một thiết bị đầu cuối (ví dụ như khi được thực thi thông qua udev).

Nó sử dụng inotifywait để đợi cho đến khi thiết bị được gắn biến mất, và sau đó xóa thư mục mà nó đã tạo. Do đó, bạn cần cài đặt các công cụ inotify trên hệ thống của mình. Trên các bản phân phối dựa trên Debian (bao gồm Ubuntu), sudo apt-get install inotify-toolssẽ đủ.

#!/bin/bash
#
# Auto-mounter script, to be executed by udev on the addition of a
# mass storage device.
#
# Takes one argument; the base block device partition, e.g. "sdb3".
#
# Creates a mountpoint for the partition using its FS label, in
# /media/{fslabel} and mounts it there, read-only, unsynced.
#
# If the filesystem has no label, "Untitled" is used instead.
#
# If another filesystem is already mounted at that location, the
# newcomer will be mounted with an integer number appended to its
# label.

MOUNT_OPTS="ro,noatime,nodiratime"



# If we're called from a non-tty and not explicitly told to continue,
# we call ourselves in a subshell and thus return immediately (udev
# gets impatient):
if [[ "$2" != "backgrounded" ]] && ! tty &> /dev/null; then
    ($0 $1 backgrounded &)
    exit
fi



# Determine the desired mountpoint from the label of the fs on the partition:
MOUNTPOINT="/media/$(blkid /dev/$1 | grep LABEL | sed -E 's:^.+LABEL="([^"]+).+:\1:')"

# If it had no label, use "Untitled":
[[ "$MOUNTPOINT" = "/media/" ]] && MOUNTPOINT="/media/Untitled"

# If something's already mounted there, append a number:
if [[ -e "$MOUNTPOINT" ]] && mountpoint "$MOUNTPOINT" &> /dev/null; then
    NUM=1
    while mountpoint "$MOUNTPOINT $NUM" &> /dev/null; do NUM=$((NUM+1)); done
    MOUNTPOINT="$MOUNTPOINT $NUM"
fi

# Create the mountpoint and mount there:
mkdir "$MOUNTPOINT" && mount -o $MOUNT_OPTS /dev/$1 "$MOUNTPOINT"



# Wait until the device is removed (the block device is "deleted"):
inotifywait -e delete /dev/$1

# Then clean up. If it fails, retry every second for up to 5 mins:
TRIES=0
while [[ -e "$MOUNTPOINT" ]] && [[ $TRIES -lt 300 ]]; do
    rmdir "$MOUNTPOINT"
    sleep 1s
    TRIES=$((TRIES+1))
done

Bạn sẽ lưu ý rằng tôi gắn thiết bị mà không đồng bộ hóa và chỉ đọc. Đó chỉ là vì 99% thời gian, trường hợp sử dụng của tôi là đọc từ ổ đĩa ngoài và bất cứ khi nào tôi cần ghi vào nó, tôi sẽ hoạt động trên máy chủ và có thể dễ dàng ra mount -o remount,rw <mountpoint>lệnh. Chỉnh sửa cho phù hợp với nhu cầu của bạn :)


Làm thế nào để bạn chạy tập lệnh này? halevtdường như không phải là một apt-getgói có thể hiện tại cho các phiên bản hiện đại.
Campbeln

À ... có lẽ nếu tôi theo dõi mục Trả lời
HÀNG

1

Hãy thử định cấu hình qua mountmanager để bạn không phải nhập dữ liệu theo cách thủ công.

Nó nên là một phần của kho lưu trữ Ubuntu.


Bạn sẽ cần phải kích hoạt phần vũ trụ để có được nó.
quix quixote

apt: mountmanager? phần = vũ trụ;)
endolith

Có phải đó chỉ là để thiết lập một fstab cho tôi?
endolith

@endolith: Sẽ không apt: vũ trụ? install = mountmanager hợp lý hơn? ;)
Bobby

Định dạng đó có hoạt động không? Nó không nói như vậy trong trang man man.ubfox.com/manpages/karmic/en/man8/apturl.8.html
endolith

-5

Nếu bạn chỉ có một ổ đĩa được gắn tại một thời điểm, bạn chỉ cần chỉnh sửa nó vào /etc/fstabtệp của mình . Một cái gì đó dọc theo dòng:

/dev/sdb1     /mnt/usbdrive     ext3     defaults 0   0

Điều này sẽ gắn kết nó khi khởi động, và làm cho nó có thể truy cập được cho bất cứ ai có perms. Nếu bạn có nhiều ổ đĩa, bạn vẫn có thể làm điều này với:

/dev/sdb1     /mnt/usbdrive1     ext3     defaults 0   0
/dev/sdc1     /mnt/usbdrive2     ext3     defaults 0   0

6
rõ ràng không phải những gì câu hỏi yêu cầu.
quack quixote
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.