Secara otomatis me-mount drive eksternal ke / media / LABEL saat boot tanpa pengguna masuk?


73

Pertanyaan ini mirip, tapi agak kebalikan dari yang saya inginkan. Saya ingin drive USB eksternal dipasang secara otomatis saat boot, tanpa ada yang masuk, ke lokasi seperti /media/<label>.

Saya tidak ingin harus memasukkan semua data ke fstab, sebagian karena itu membosankan dan menjengkelkan, tetapi kebanyakan karena saya tidak dapat memprediksi apa yang akan saya tancapkan ke dalamnya atau bagaimana partisi akan berubah di masa depan.

Saya ingin drive dapat diakses untuk hal-hal seperti GKG , dan tersedia ketika saya masuk dengan SSH. gnome-mounttampaknya hanya me-mount hal-hal ketika Anda masuk secara lokal ke sesi grafis Gnome.


4
Pertanyaan yang bagus, andai saya punya jawaban untuk Anda, sekarang saya ingin tahu bagaimana ini diselesaikan.
terbalik

1
Saya memperbarui jawaban saya.
Ryan Thompson

1
Dan saya, sebagai catatan, tidak memiliki masalah dengan Gnome yang diinstal, seperti yang sudah saya lakukan, tetapi solusi untuk server tanpa GUI tanpa kepala adalah yang terbaik.
endolith

1
ARRRGHH ... bug dalam jawaban saya. dalam RUN. /usr/local/sbin/udev-automounter.sh mount %kseharusnya /usr/local/sbin/udev-automounter.sh %k. Maaf.
quack quixote

1
OK, pada Pembaruan-3, ini berfungsi dengan spasi. ia melakukannya dengan menggunakan versi <LABEL> "yang disandikan" yang mengubah spasi menjadi \x20. jadi tidak cantik, tapi itu akan berhasil. udev tidak menangani label-dengan-spasi dengan baik, tetapi ada opsi lain yang menggunakan garis bawah alih-alih \x20(jadi setidaknya terlihat bagus). Sepertinya penanganan ruang harus masuk ke shellscripts.
quack quixote,

Jawaban:


74
  • Catatan untuk Ubuntu Server 11.10: Skrip ini gagal pada Ubuntu Server 11.10 karena vol_idperintah usang . vol_idtelah digantikan oleh blkid. Untuk memperbaiki skrip, ganti "vol_id" dengan "blkid -o udev" di udev-auto-mount.shskrip.

Saya telah membenturkan kepala saya di sekitar ini untuk sementara waktu sekarang, dan saya pikir saya telah menemukan solusi yang berhasil. Ini dikembangkan dan diuji pada sistem berbasis Debian, sehingga harus bekerja di Ubuntu. Saya akan menunjukkan asumsi yang dibuatnya sehingga dapat disesuaikan dengan sistem lain juga.

  • Ini akan secara otomatis memasang drive USB pada plugin, dan tidak perlu banyak beradaptasi dengan Firewire.
  • Ini menggunakan UDEV, jadi tidak ada monyet dengan HAL / DeviceKit / GNOME-Apa pun.
  • Ini secara otomatis membuat /media/LABELdirektori untuk memasang perangkat.

  • Namun, itu dapat mengganggu pembuat mobil lain; Saya tidak bisa menguji untuk itu. Saya berharap bahwa, dengan Gnome-VFS aktif, keduanya dapat mencoba melakukan mount ... jika Gnome-VFS gagal me-mount, mungkin tidak mengkonfigurasi ikon desktop. Melepas dari Gnome harus dimungkinkan, tetapi mungkin memerlukan gksudoatau serupa.

Saya belum menguji ini pada boot sistem, tetapi satu-satunya alasan saya dapat melihat bahwa itu mungkin tidak berhasil adalah jika mencoba untuk memasang drive USB sebelum sistem siap untuk mount. Jika itu masalahnya, Anda mungkin perlu satu tweak tambahan untuk skrip mount. (Saya memeriksa dengan ServerFault untuk melihat apakah ada saran, tetapi tidak banyak minat di sana.)

Kalau begitu, ke sana.


Referensi UDEV:


Latar Belakang (UDEV? Whuzzat?)

UDEV adalah sistem hotplug kernel. Itulah yang secara otomatis mengkonfigurasi perangkat yang tepat dan symlink perangkat (mis. /dev/disk/by-label/<LABEL>), Baik pada saat boot maupun untuk perangkat yang ditambahkan saat sistem sedang berjalan.

D-Bus dan HAL digunakan untuk mengirim acara perangkat keras ke pendengar seperti Lingkungan Desktop. Jadi, ketika Anda masuk ke GNOME dan memasukkan CD atau mencolokkan drive USB, peristiwa itu mengikuti rantai ini:

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

Dan presto, drive Anda dipasang. Tetapi dalam sistem tanpa kepala, kami tidak ingin harus masuk untuk mendapatkan manfaat dari penghitungan otomatis.

Aturan Udev

Karena UDEV memungkinkan kami menulis aturan dan menjalankan program dengan penyisipan perangkat, ini adalah pilihan yang ideal. Kita akan mengambil keuntungan dari aturan Debian / Ubuntu yang ada, biarkan mereka mengatur /dev/disk/by-label/<LABEL>symlink untuk kita, dan menambahkan aturan lain yang akan memasang perangkat untuk kita.

Aturan UDEV disimpan di /etc/udev/rules.d(dan /lib/udev/rules.ddi Karmic), dan diproses dalam urutan numerik. File apa pun yang tidak dimulai dengan nomor akan diproses setelah file bernomor. Di sistem saya, aturan HAL ada dalam file yang dipanggil 90-hal.rules, jadi saya memasukkan aturan saya 89-local.rulessehingga mereka diproses sebelum mereka sampai ke HAL. Terutama, Anda perlu memastikan aturan ini terjadi setelah 60-persistent-storage.rules. local.rulesmungkin cukup baik.

Masukkan ini ke file aturan baru Anda:

# /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"
  • Pastikan tidak ada spasi setelah \, hanya a newline( \n).

  • Ubah SUBSYSTEMS=="usb"ke SUBSYSTEMS=="usb|ieee1394"untuk dukungan Firewire.

  • Jika Anda ingin perangkat selalu dimiliki oleh pengguna tertentu, tambahkan OWNER="username"klausa. Jika Anda hanya perlu file yang dimiliki oleh pengguna tertentu, ubah skrip pemasangan sebagai gantinya.

Membaca Aturan

Ini menambahkan program untuk dijalankan ke daftar program perangkat untuk dijalankan. Ini mengidentifikasi perangkat partisi USB dengan <LABEL>, kemudian meneruskan informasi ini ke skrip yang melakukan mount. Secara khusus, aturan ini cocok:

  1. ENV{ID_FS_LABEL_ENC}=="?*"- variabel lingkungan yang ditetapkan oleh aturan sistem sebelumnya. Tidak ada untuk sistem non-file, jadi itu sebabnya kami memeriksanya. Kami sebenarnya ingin menggunakan ID_FS_LABELuntuk mount point, tetapi saya belum meyakinkan UDEV untuk menghindarinya bagi saya, jadi kami akan membiarkan skrip mount menangani hal itu.

    Variabel lingkungan ini dan lainnya diperoleh oleh udev menggunakan vol_idperintah ( usang ). Ini adalah alat yang berguna untuk melihat detail cepat yang bagus di partisi:

    $ 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"- hanya addacara pertandingan ...

  3. SUBSYSTEMS=="usb"- hanya cocok dengan perangkat yang ada di bus USB. Kami menggunakan di SUBSYSTEMSsini karena ini cocok dengan orangtua perangkat kami; perangkat yang kami minati sebenarnya adalah SUBSYSTEM == "scsi". Menyesuaikan dengan perangkat USB induk menghindari penambahan program kami ke drive internal.

  4. RUN+="..."- bukan kecocokan, tetapi tindakan: tambahkan program ini ke daftar program yang akan dijalankan. Dalam argumen program, %kdiperluas ke nama perangkat (misalnya sdc1, tidak /dev/sdc1) dan $env{FOO}mendapatkan konten variabel lingkungan FOO.

Menguji Aturannya

Tautan referensi pertama (di atas) adalah tutorial UDEV yang luar biasa, tetapi sedikit kedaluwarsa. Program yang dijalankan untuk menguji aturan Anda ( udevtestkhususnya) telah digantikan oleh udevadmutilitas catch-all .

Setelah Anda menambahkan aturan, masukkan perangkat Anda. Berikan waktu beberapa detik, lalu periksa untuk melihat perangkat apa yang ditugaskan kepadanya:

$ 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

Jika drive Anda yang dapat dihapus berisi label_Baz, itu ada di perangkat sdc1. Jalankan ini dan lihat output menjelang akhir:

$ 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'

Cari nama skrip dari RUN+=aturan kami di beberapa baris terakhir (ke-3 dari bawah dalam contoh ini). Anda dapat melihat argumen yang akan digunakan untuk perangkat ini. Anda dapat menjalankan perintah itu sekarang untuk memeriksa apakah argumennya benar; jika berfungsi pada commandline Anda, itu akan bekerja secara otomatis ketika perangkat dimasukkan.

Anda juga dapat memantau acara UDEV secara realtime: lari sudo udevadm monitor(lihat man udevadmdetail tentang sakelar). Kemudian cukup colokkan perangkat baru dan saksikan acara bergulir. (Mungkin berlebihan kecuali kamu benar-benar detail tingkat rendah ...)

Muat Ulang Aturan

Setelah Anda memverifikasi aturan tersebut dibaca dengan benar, Anda perlu memberitahu UDEV untuk memuat ulang aturannya sehingga yang baru berlaku. Gunakan salah satu dari metode ini (jika yang pertama tidak berhasil, yang kedua harus ... tetapi coba yang pertama):

  • Lari sudo udevadm control --reload-rules

  • Lari sudo /etc/init.d/udev reload

  • reboot


Naskah! Sebenarnya, 2 Script ...


Ini skrip pertama. Karena program yang kita jalankan perlu diselesaikan dengan cepat, ini hanya memutar script kedua di latar belakang. Masukkan ini /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} &

Ini skrip kedua. Ini melakukan sedikit lebih banyak input input. Menempatkan ini dalam /usr/local/sbin/udev-auto-mount.sh. Anda mungkin ingin mengubah opsi pemasangan di bawah. Script ini sekarang menangani menemukan LABEL partisi sendiri; UDEV hanya mengirim nama PERANGKAT.

Jika ada masalah saat memasang drive saat boot , Anda dapat menaruh banyak waktu sleep 60dalam skrip ini, untuk memberi waktu bagi sistem untuk melakukan semuanya sebelum skrip mencoba memasang drive.

Saya telah memberikan saran di komentar untuk cara memeriksa (jalankan psuntuk melihat apakah server web sedang berjalan), tetapi Anda ingin mengubahnya untuk sistem Anda. Saya pikir sebagian besar server jaringan yang mungkin Anda gunakan akan mencukupi untuk tujuan ini - nfsd, smbd, apache, dll. Risikonya, tentu saja, skrip mount akan gagal jika layanan tidak berjalan, jadi mungkin menguji Keberadaan file tertentu akan menjadi solusi yang lebih baik.

#!/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

Skrip Pembersihan Bonus Super!

Satu lagi skrip. Yang dilakukan adalah melepas perangkat dan menghapus direktori mountpoint. Diasumsikan memiliki privs untuk melakukan ini, jadi Anda harus menjalankannya sudo. Script ini sekarang mengambil titik mount penuh pada commandline, misalnya:

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

Masukkan ini /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
Kamu hebat! :)
kolypto

1
Jika saya menjalankan auto-mount.sh secara manual itu berfungsi, tetapi tidak jika saya mencolokkan drive, dan tidak saat boot. : /
endolith

jadi masalahnya adalah dengan aturan UDEV. biar sedikit memperluas bagian itu untuk membantu Anda men-debug.
quack quixote

3
Saya telah mengumpulkan semua skrip di github: github.com/fatso83/Code-Snippets/tree/master/system-utils/... Mereka berfungsi dengan baik di Ubuntu 10.10, dan juga termasuk auto-unmount
oligofren

1
Referensi: udev_237 - man udev (Ubuntu_18.04) Perhatikan bahwa menjalankan program yang mengakses jaringan atau me - mount sistem file tidak diizinkan di dalam aturan udev , karena kotak pasir default yang diberlakukan pada systemd-udevd.service. sumber: unix.stackexchange.com/questions/200194/… Untuk solusinya, lihat serverfault.com/questions/766506/…
Pro Backup

9

Satu opsi terakhir yang disarankan orang lain di internet adalah ivman, tetapi tampaknya bergantung pada pmount, yang sudah Anda nyatakan tidak berfungsi. pmountditinggalkan dan ivmanhampir sama.

Penggantinya ivmanadalah halevt, dan tersedia di Karmic. Ini adalah implementasi ulang ivman(baca: "dipertahankan" dan "tidak tergantung pada pmount"). Paket tidak tersedia di Jaunty, meskipun Anda mungkin bisa membuatnya sendiri jika Anda tidak berencana untuk meningkatkan.

Kedua alat ini berada di atas lapisan DBus dan HAL dan merespons peristiwa dari mereka. Tampaknya keduanya dapat berjalan baik sebagai daemon sistem atau sebagai pengelola mount sesi pengguna (ala Gnome-VFS) - /etc/defaults/{ivman,halevt}file-file tersebut bertanggung jawab atas pengaturan sistem.

Berikut adalah beberapa instruksi untuk mengubah ivmanmenggunakan /media/<LABEL>mountpoints. Kemungkinan halevtmemiliki cara yang lebih sederhana untuk melakukannya, tetapi mungkin mereka akan membantu Anda menemukan jawaban.


Bekerja dengan HALEVT

Pembaruan : Demi mendapatkan pemasangan CD otomatis, yang jawaban UDEV saya tidak berikan, saya melihat lebih dalam halevt. Saya menemukan posting blog ini yang membantu menjelaskan banyak tentang prosesnya. Saya memang harus mengkompilasi halevtpaket saya sendiri untuk Debian Lenny (untungnya semua dependensi ada di bagian lenny-backports). Setelah diinstal, prosesnya sebagian besar tidak mengerikan:

  1. Pastikan sistem halevt-daemon diaktifkan /etc/default/halevt
  2. Izinkan sistem yang menghentikan pengguna untuk memasang perangkat di /etc/PolicyKit/PolicyKit.conf(lihat di bawah; sumber )
  3. Ubah kebijakan HAL untuk menyalin label volume ke dalam mountpoint yang disukai di /etc/hal/fdi/policy/preferences.fdi(lihat di bawah)
  4. Jika Anda menginginkan dukungan CD / DVD, ambil eject.halskrip dari blogpost di atas, modifikasi, dan simpan /usr/local/bin.
  5. Ubah konfigurasi sistem halevt untuk mengaktifkan mount di /etc/halevt/halevt.xml
  6. Tambahkan kode ke skrip pra-dan pasca-manajer manajer masuk Anda untuk menghentikan daemon halevt sistem ketika seseorang log on, dan mulai ulang ketika log off.

Jika Anda perlu me-restart daemon HAL dan HALEVT untuk memeriksa konfigurasi baru Anda, gunakan ini untuk mendapatkannya dalam urutan yang benar:

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

Langkah 1

Periksa itu START_DAEMON=yesdi /etc/default/halevt.

Langkah 2

Di /etc/PolicyKit/PolicyKit.conf, tambahkan ini di dalam <config></config>bagian:

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

Langkah 3

Di /etc/hal/fdi/policy/preferences.fdi, tambahkan ini di dalam bagian `:

<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>

Langkah 4

Naskahnya bagus tetapi perlu dijalankan /bin/bash; beberapa sistem sebenarnya dapat digunakan /bin/dashsaat /bin/shdipanggil. Jadi, ubah baris teratas dalam skrip untuk memastikan Anda mendapatkan yang benar:

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

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

Langkah 5

Ini bagian yang menyenangkan. Sistem Anda mungkin sudah menyediakan dasar /etc/halevt/halevt.xml, jadi Anda harus menyesuaikan ini untuk Anda gunakan sendiri. Dalam kasus saya, sistem saya sudah menyediakan pemasangan dasar removeable, tetapi saya harus menambahkan dukungan untuk pemasangan CDROM dan tombol eject.

Posting blog yang saya sebutkan memiliki contoh konfigurasi XML yang baik untuk melihat tweak Anda sendiri. Ini sebagian besar tentang menyiapkan pengganti gnome-mount untuk lingkungan penulis fluxbox, jadi XML contohnya melakukan lebih dari yang Anda inginkan, tapi ini cara yang bagus untuk merasakan apa yang dapat Anda lakukan. Ada juga beberapa contoh bagus di /usr/share/doc/halevt/examples.

Saya juga harus berlari sudo sh -c "mkdir /var/halevt ; chown halevt:plugdev /var/halevt"sebelum semuanya berjalan.

Inilah tambahan saya untuk membuat pekerjaan CD / DVD otomatis:

<!-- 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>

Langkah 6

Setelah sistem halevt-daemon Anda berfungsi, Anda harus menonaktifkannya saat Anda masuk ke GNOME, dan mulai lagi ketika Anda logout. (Lihat jawaban saya untuk pertanyaan ini untuk manajer login non-GDM.) Hal ini bersifat teoritis karena saya tidak menggunakannya, tetapi harus berfungsi.

Di /etc/gdm/PreSession/Default, tambahkan ini untuk menghentikan sistem halevt-daemon:

/etc/init.d/halevt stop

Di /etc/gdm/PostSession/Default, tambahkan ini untuk me-restart sistem halevt-daemon:

/etc/init.d/halevt start

3
Bagi orang yang membaca ini pada 2013, mereka sekarang harus tahu bahwa HAL telah ditinggalkan, dan mereka harus menggunakan solusi berbasis udev seperti yang diberikan quix quixote di atas.
oligofren

6

Seiring berjalannya waktu, solusi yang lebih mudah muncul.

Solusi ini bergantung pada paket perangkat lunak udevil yang ditulis untuk tujuan ini dan tidak perlu bermain-main dengan aturan udev. Mungkin lebih disukai (untuk pengguna baru dan lama) sebagai solusi langsung.

The devmonScript dari udevil melakukan semua keajaiban sementara hanya tergantung pada udev dan fasih. Bekerja hampir di luar kotak tanpa memerlukan konfigurasi awal.

Semua yang telah saya lakukan di workstation saya adalah memanggil devmon dari rc.localseperti ini:
devmon 2>&1 >> /var/log/devmon &
Untuk kenyamanan Anda, Anda mungkin ingin menanamkan ini ke skrip init daripada rc.localmenggunakan alat otomatis seperti pleaserununtuk membuatnya: https://unix.stackexchange.com/ a / 124609/42673

Setelah menjalankannya, penyimpanan yang saya pasang diperiksa (mencari partisi dan jika ditemukan melihat label sistem file mereka) kemudian dipasang ke /media/FILESYSTEM_LABEL.
Tidak bisa membayangkan sesuatu yang lebih sederhana dari itu kecuali mungkin bahwa (dalam) systemd terkenal untuk menggabungkan fungsi ini di beberapa titik di masa depan.

Sekilas tentang udevil ( github.io/udevil )
Script: devmon ( igurublog / script-devmon )


3

jawaban quack quixote tidak berfungsi di Ubuntu Lucid Lynx (10.04) - tidak ada /sbin/vol_idperintah.

Daripada bersikap mewah dan menggunakan udev, masukkan ini ke /etc/rc.local Anda dan lakukan:

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
TERIMA KASIH .. ini adalah cara paling sederhana untuk apa yang ingin saya capai. Bahkan bekerja pada Ubuntu Server 16 dengan volume ntfs
ChrisPrime

3

Untuk sistem berbasis Debian (misalnya Ubuntu dll) ada paket usbmount yang secara otomatis memasang drive USB untuk Anda. Ini pada dasarnya menggunakan pendekatan berbasis udev seperti yang sudah diuraikan - hanya itu hanya menginstal paket sederhana. Tampaknya penulis asli paket telah kehabisan tenaga tetapi Ubuntu / Debian tampaknya masih mempertahankannya (saya kira itu tidak serumit itu) - jadi masih tersedia dalam rilis terbaru.

Script yang terinstal dapat dikonfigurasi (/etc/usbmount/usbmount.conf) untuk memberikan poin mount yang sesuai.


1
Usbmount tidak bisa dipasang oleh label, kecuali jika Anda mengisi daftar label di file konfigurasi.
Gilles 'SANGAT berhenti menjadi jahat'

1
Lihat posting esite.ch/2014/04/11/... jika Anda ingin menambahkan pemasangan ke label ke usbmount tanpa mempertahankan daftar.
Oliver Sauder

3

Untuk menghapus instruksi hebat quack quixote untuk dihapus:

Tambahkan baris berikut ke file aturan udev yang Anda buat sebelumnya (/etc/udev/rules.d) "

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

Selanjutnya buat skrip berikut dan chmod dapat dieksekusi (/usr/local/sbin/udev-autounmounter.sh) dengan konten berikut:

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

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

Akhirnya skrip unmount itu sendiri (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

Jadi dengan instruksi lain, direktori akan otomatis muncul dan hilang pada acara udev.


Saya pikir if [ -n "$device_is_mounted" ]; thenseharusnya begitu if [ -z "${MOUNTPT}" ]; then, bukan?
eresonance

2

Anda mungkin ingin mencoba Pysdm


Itu hanya editor fstab yang lain, bukan?
endolith

Ya, tapi "Ini juga memungkinkan pembuatan aturan udev untuk konfigurasi dinamis perangkat penyimpanan"
Sathyajith Bhat

Apakah "pembuatan aturan udev" akan membantu saya dalam beberapa hal? Saya tidak tahu apa artinya itu. Apakah itu memasang perangkat yang sebelumnya tidak dikenal yang dilepas tanpa pengguna masuk secara lokal?
endolith

Maaf, saya tidak tahu petunjuk tentang aturan udev. Anda dapat melihat fredericiana.com/2006/03/15/writing-udev-rules-short-notes dan reactivated.net/writing_udev_rules.html
Sathyajith Bhat

2

Anda dapat mencoba memasukkan su username -c gnome-volume-manager/etc/rc.local. Mungkin cukup dengan menjalankan gnome-volume-manager.

Sunting: Tampaknya gnome-volume-manager tidak lagi menjadi bagian dari distribusi default, bahkan pada desktop 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

Namun, mungkin jika Anda menginstalnya, masih akan berfungsi. Ini patut dicoba. Jika tidak berhasil, hapus lagi.

Ada juga usbmountpaket, yang melakukan apa yang Anda inginkan, tetapi mungkin mengganggu penghitungan otomatis.


Perintah tidak dikenal "gnome-volume-manager". Saya di Ubuntu Riang.
endolith

Ada / usr / lib / gnome-volume-manager / gnome-volume-manager, tetapi tidak melakukan apa-apa.
endolith

Oh begitu. Ada paket yang disebut gnome-volume-manager juga. Terkait: crunchbanglinux.org/forums/topic/239/…
endolith

Sepertinya gnome-volume-manager menggunakan HAL untuk me-mount sesuatu? Dan "Pada 2009, HAL sedang dalam proses menjadi usang demi DeviceKit." Mengapa semua yang ada di Linux selalu seperti ini? Mereka baru saja mulai membuat sesuatu bekerja hampir benar dan kemudian mereka mengeluarkannya dan menggantinya dengan sesuatu yang baru yang tidak berfungsi.
endolith

pmount bahkan tidak berfungsi lagi. > pmount / dev / disk / oleh-label / STORAGE Kesalahan: perangkat / dev / sdc1
endolith

2

Adendum saya yang diedit untuk solusi berbasis udev quack quixote ditolak, jadi saya akan meletakkannya di sini. Silakan merujuk ke posnya terlebih dahulu.

Pertama-tama, jika Anda ingin aturan udev Anda bertindak ketika perangkat apa pun terpasang melalui subsistem SCSI (yang mencakup USB, FireWire, dan eSATA), ubah kecocokan SUBSYSTEMS dalam aturan udev SUBSYSTEMS=="scsi".

Namun perlu diingat bahwa ini akan secara otomatis me-mount apa saja, termasuk drive internal jika Anda menyumbatnya saat sistem sedang berjalan, jadi ini mungkin bukan yang Anda inginkan.

Kedua, ini adalah skrip yang saya gunakan yang menggantikan semua skrip dalam posting itu. Ini juga secara otomatis membersihkan mountpoint yang dibuat di / media / segera setelah perangkat blok yang dipasang dihapus - tidak perlu intervensi manual. Lebih lanjut, alih-alih memanggil skrip yang berbeda untuk dijalankan di latar belakang, skrip menempatkan dirinya di latar belakang ketika skrip tidak dieksekusi dari terminal (misalnya ketika dijalankan melalui udev).

Menggunakan menunggu tidak menunggu untuk menunggu sampai perangkat yang dipasang menghilang, dan kemudian menghapus direktori yang dibuatnya. Oleh karena itu, Anda perlu menginstal alat yang tidak sah pada sistem Anda. Pada distro berbasis Debian (termasuk Ubuntu), sudo apt-get install inotify-toolssudah cukup.

#!/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

Anda akan perhatikan bahwa saya memasang perangkat tanpa sinkronisasi, dan hanya baca. Itu hanya karena 99% dari waktu, kasus penggunaan saya membaca dari drive eksternal, dan setiap kali saya perlu menulis, saya akan tetap aktif di server, dan dapat dengan mudah mengeluarkanmount -o remount,rw <mountpoint> perintah. Edit sesuai dengan kebutuhan Anda :)


Bagaimana Anda menjalankan skrip ini? halevttampaknya tidak menjadi apt-getpaket yang mampu saat ini untuk versi modern.
Campbeln

Agh ... mungkin jika saya mengikuti entri TOP / Jawaban yang Diterima dari quack quixote ... Akan tetap menyenangkan memiliki jawaban yang lebih lengkap di sini :)
Campbeln

1

Coba konfigurasikan melalui mountmanager, sehingga Anda tidak harus memasukkan data secara manual.

Itu harus menjadi bagian dari repositori ubuntu.


Anda harus mengaktifkan bagian semesta untuk mendapatkannya.
Quack quixote

apt: mountmanager? section = universe;)
endolith

Apakah itu hanya akan membuat fstab untukku?
endolith

@endolith: Bukankah apt: universe? install = mountmanager lebih logis? ;)
Bobby

Apakah format itu berfungsi? Itu tidak mengatakan demikian di halaman manual manpages.ubuntu.com/manpages/karmic/en/man8/apturl.8.html
endolith

-5

Jika Anda hanya memiliki satu drive yang dipasang pada satu waktu, Anda dapat mengedit ini ke dalam /etc/fstabfile Anda . Sesuatu di sepanjang garis:

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

Ini harus memasangnya saat boot, dan membuatnya dapat diakses oleh siapa saja dengan perms. Jika Anda memiliki lebih dari satu drive, Anda masih dapat melakukan ini dengan:

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

6
jelas bukan pertanyaannya.
Quack quixote
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.