Bagaimana cara memasang media yang dapat dipindahkan di / media / <LABEL> secara otomatis saat dimasukkan, tanpa lingkungan desktop?

7

Saya memiliki sistem sid Debian (Wheezy) (dan pertanyaan yang sama untuk arch juga), tanpa lingkungan desktop (dan tidak ada Xorg sama sekali).

Saya dapat memasang kartu SD, stik USB, HDD eksternal secara manual dengan mount / umount dengan entri yang sesuai, /etc/fstabtetapi ini menarik, dan untuk membatasi: jika saya ingin memasangkannya di /media/<LABEL>setiap perangkat dengan <LABEL>kebutuhan yang berbeda dengan entri sendiri, dan setiap <LABEL>direktori perlu dibuat / dihapus secara manual /media/juga).

Jadi, apa cara terbaik untuk memasangnya secara otomatis /media/<LABEL>saat penyisipan (dan melepasnya dari sistem file segera setelah dicabut)?

Solusi ideal akan:

  1. mendeteksi ketika media removable terpasang-in (ditambahkan dalam /dev/seperti sdax, sdbx, ... oleh udev)
  2. buat direktori /media/sesuai dengan labelnya (label media yang bisa dilepas)
  3. pasang di direktori /media/<LABEL>dalam mode RW (jika sistem file didukung)
  4. mendeteksi apakah media telah dicabut
  5. jika demikian, batalkan dari sistem file
  6. hapus direktori yang sesuai dari /media/

(perangkat harus dipasang dalam mode sinkron sebelumnya, untuk menghindari kehilangan data saat panas dicabut karena caching)

Saya menemukan beberapa info tentang autofs, HAL, udisks, udisks2, dll, tetapi tidak jelas mana yang usang atau disukai, dan lagi pula, saya belum menemukan cara untuk mengkonfigurasi mereka dengan mudah pada sistem saya untuk melakukan itu, sampai sekarang ...

Minimalisme, keanggunan, KISS, * nix-minded, tidak ada file kebijakan XML gila yang tak tertahankan, dan terkini sangat dihargai.

sunting: mencoba membuat pertanyaan saya lebih jelas

cedbeu
sumber
1
Saya memposting pertanyaan saya di unix.stackexchange.com/questions/44454 , mungkin saya akan memiliki beberapa jawaban lagi ... Saya tidak yakin apakah itu harus dihapus dari sini atau tidak?
cedbeu
Anda melakukan posting yang sama di situs yang berbeda, dengan jawaban yang sama di kedua jawaban sendiri ...
Francisco Tapia

Jawaban:

3

Ok, sudah lama, tapi saya masih akan menjawab pertanyaan saya dengan opsi terbaik yang saya temukan sampai sekarang.

Cara terbaik adalah membuat udevaturan, yang terkait dengan beberapa skrip (yang akan membuat / menghapus direktori dan me-mount / melepas perangkat yang bisa dilepas), dan dilampirkan ke partition udevjenis acara perangkat.

1 - Membuat skrip tambah / hapus

Tambahkan script ini storage-automount.shdi /lib/udev/dan set ke executable ( sudo chmod +x /lib/udev/storage-automount.sh):

#!/bin/sh

# set the mountpoint name according to partition or device name
mount_point=$ID_FS_LABEL
if [ -z $mount_point ]; then
    mount_point=${DEVNAME##*/}
fi

# if a plugdev group exist, retrieve its gid set & it as owner of mountpoint
plugdev_gid="$(grep plugdev /etc/group|cut -f3 -d:)"
if [ -z $plugdev_gid ]; then
    gid=''
else
    chown root:plugdev $mount_point
    gid=",gid=$plugdev_gid"
fi

# create the mountpoint directory in /media/ (if not empty)
if [ -n $mount_point ]; then
    mkdir -p /media/$mount_point
    # other options (breaks POSIX): noatime,nodiratime,nosuid,nodev
    mount -t $ID_FS_TYPE \
      -o rw,flush,user,uid=0$gid,umask=002,dmask=002,fmask=002 \
      $DEVNAME /media/$mount_point
fi

Tambahkan script ini storage-autounmount.shdi /lib/udev/dan set ke executable ( sudo chmod +x /lib/udev/storage-autounmount.sh):

#!/bin/sh

# set the mountpoint name according to partition or device name
mount_point=$ID_FS_LABEL
if [ -z $mount_point ]; then
    mount_point=${DEVNAME##*/}
fi

# remove the mountpoint directory from /media/ (if not empty)
if [ -n $mount_point ]; then
    umount -l /media/$mount_point
    rm -R /media/$mount_point
fi

2 - Membuat udevaturan untuk melampirkan skrip tersebut ke acara

Dan akhirnya, tambahkan udevaturan /etc/udev/rules.d, misalnya 85-storage-automount.rules:

ENV{DEVTYPE}=="partition", RUN+="/lib/udev/storage-automount.sh", ENV{REMOVE_CMD}="/lib/udev/storage-autounmount.sh"

Dan itu saja.

Sekarang, ketika Anda mencolokkan perangkat penyimpanan, direktori akan dibuat /media/sesuai dengan nama partisi (saya tidak ingat tapi saya pikir itu berfungsi dengan partisi NTFS juga) dan partisi Anda akan dipasang ke dalamnya. R / W untuk pengguna jika Anda memiliki plugdevgrup di sistem Anda. Selain itu, perangkat dipasang dalam mode sinkron untuk membatasi risiko kehilangan data jika dicabut.

Ketika perangkat dihapus, itu dilepas dan direktori dihapus dari /media.

Juga, alat untuk memantau udevacara adalah udevadm monitor, dengan opsi-opsi seperti --envatau --property:

$ udevadm monitor --env

Ini diuji dan bekerja dengan baik pada Debian dan Arch, tetapi mungkin berfungsi pada semua distribusi yang bergantung udev.

cedbeu
sumber
1

Anda mungkin ingin memeriksa /dev/disk/by-uuiddirektori Anda saat drive-drive spesifik itu dicolokkan. Menggunakannya ls -lakan menunjukkan kepada Anda perangkat (misalnya /dev/sdb1) bersama dengan cairannya. Setelah menemukan yang cocok, perbarui /etc/fstabsesuai dengan Anda , ganti /dev/sd*dengan /dev/disk/by-uuid/*entri yang sesuai .

Untuk perincian, lihat jawaban saya untuk Bagaimana saya mencegah USB flash drive mendapatkan nama perangkat Linux baru setelah bangun dari tidur? .

Izzy
sumber
1
Sebenarnya, seperti yang saya katakan, perangkat dicolokkan, saya tahu UUID / LABEL mereka melalui salah satu blkidatau /dev/disk/by-uuiddirektori. Dan saya bisa memasangnya secara manual juga. Sekarang, saya sudah memilikinya /etc/fstab, sebenarnya dengan labelatau oleh UUID, keduanya bekerja dengan benar. Itu tidak terlalu membantu, karena mereka dipasang pada waktu boot saja (selama saya tidak menentukan noauto). Tetapi jika saya menghapus mereka dan jika saya memasukkan kembali mereka saat sistem sedang berjalan, mereka tidak secara otomatis di-unmount / di-mout di direktori yang saya tentukan di fstab... Ini adalah masalah saya.
cedbeu
Sepertinya sesuatu yang aneh - seperti yang saya gunakan selama bertahun-tahun untuk dapat dilepas (mis. SD-card dari kamera saya, perangkat seluler sebagai pemutar MP3, smartphone, tablet ... Dan semuanya terpasang dengan benar di titik mount yang ditentukan. Jika Anda menghapusnya: apakah Anda meng-unmount sebelumnya, dan mount lagi ketika memasukkan kembali? Anda harus melakukannya, dan kemudian itu akan berhasil
Izzy
1
Jika saya meng-unmount mereka dan memasangnya secara manual, semuanya bekerja dengan baik jelas. Tetapi masalah saya adalah bahwa saya ingin mereka meng-unmount ( syncopsi masuk fstab) dan me-mount mereka secara otomatis (dan userjuga root) ketika saya menghapus / memasukkannya. Itu sebabnya saya kira baik AutoFS, HAL, udisks, udisks2(atau hotplug, mungkin ...?) Atau yang serupa terlibat ... Tapi tidak tahu apa yang saya hilang persis.
cedbeu
Anda mungkin kehilangan bahwa Anda masih harus melepasnya secara manual - atau bagaimana sistem tahu Anda akan melakukan itu? Obvioulsy, sekali Anda mencabutnya tidak dapat disinkronkan lagi, dan tidak bersih unmount. Jadi sistem mengasumsikan beberapa kesalahan-drive - tetapi berkali-kali hanya membuang "drive lama" setelah Anda terhubung ke "drive baru" lagi. Jadi pada auto-mount, titik mount lama masih ditempati - yang membuat drive "baru" dipasang di tempat lain.
Izzy
Sistem hot plug / cabut seperti hal(antara lain disebutkan) harus mengurus unmount perangkat fs jika tidak dicolokkan lagi. The syncpilihan di /etc/fstabdigunakan dalam hal ini untuk sinkronisasi file dari perangkat tanpa caching, meskipun menghindari kehilangan data saat panas-mencabut (w / o unmount manual sebelum).
cedbeu
0

Terima kasih atas petunjuknya. Saya menyederhanakan skrip mount dan unmount Anda seperti ini:

meningkat:

#!/bin/sh

udisks --mount $DEVNAME

unmount:

#!/bin/sh

udisks --unmount $DEVNAME

File /etc/udev/rules.d/ saya terlihat seperti ini:

# UDISKS_FILESYSTEM_SHARED
# ==1: mount filesystem to a shared directory (/media/VolumeName)
# ==0: mount filesystem to a private directory (/run/media/$USER/VolumeName)
# See udisks(8)
ENV{ID_FS_USAGE}=="filesystem|other|crypto",       ENV{UDISKS_FILESYSTEM_SHARED}="1"
ENV{DEVTYPE}=="partition", RUN+="/lib/udev/storage-automount.sh",     ENV{REMOVE_CMD}="/lib/udev/storage-autounmount.sh"

Ini sederhana dan harus menjadi kasus penggunaan biasa.

Kekuatan penuh
sumber