it-swarm.asia

Harici sürücüleri, kullanıcı oturum açmadan açılışta / media / LABEL öğesine otomatik olarak bağla?

Bu sor benzer, ancak istediklerimin tam tersi. Harici USB sürücülerinin, hiç kimseye giriş yapmadan /media/<label> gibi konumlara otomatik olarak önyükleme sırasında takılmasını istiyorum.

Kısmen sıkıcı ve sinir bozucu olduğu için tüm verileri fstab'a girmek zorunda kalmak istemiyorum, ancak çoğunlukla ne ekleyeceğimi ya da bölümlerin gelecekte nasıl değişeceğini tahmin edemediğim için.

Sürücülerin MPD gibi şeylere erişilebilir olmasını ve SSH ile oturum açtığımda erişilebilir olmasını istiyorum. gnome-mount, yalnızca bir Gnome grafik oturumuna yerel olarak oturum açtığınızda bazı şeyleri bağlar gibi görünmektedir.

72
endolith
  • Ubuntu Server 11.10 için not: Bu betik, eski vol_id komutundan dolayı Ubuntu Server 11.10'da başarısız olur. vol_id, blkid tarafından değiştirildi. Komut dosyasını düzeltmek için, "vol_id" ifadesini udev-auto-mount.sh komut dosyasında "blkid -o udev" ile değiştirin.

Bir süredir bu konuda kafamı çarpıyordum ve sanırım çalışan bir çözüm buldum. Bu, Debian tabanlı bir sistemde geliştirilmiş ve test edilmiştir, bu nedenle Ubuntu üzerinde çalışmalıdır. Diğer varsayımlara da uyarlanabilmesi için yaptığı varsayımlara dikkat çekeceğim.

  • USB sürücülerini otomatik olarak eklentiye bağlar ve Firewire'a uyum sağlamak için fazla zaman harcamamalıdır.
  • UDEV kullanır, bu yüzden HAL/DeviceKit/GNOME-Anything ile karışmaz.
  • Cihazı otomatik olarak bağlamak için otomatik olarak bir /media/LABEL dizini oluşturur.

  • Ancak, diğer otomatik sayaçlarla etkileşime girebilir ; Bunun için test edemiyorum. Gnome-VFS etkinken her ikisinin de bağlamayı deneyebileceğini düşünüyorum ... Gnome-VFS bağlantıyı kuramazsa, bir masaüstü simgesi yapılandırmayabilir. Gnome'dan bağlantı kaldırılması mümkün olmalı, ancak gksudo veya benzeri bir işlem gerektirebilir.

Bunu sistem önyüklemesinde test etmedim, ancak işe yaramadığını görebilmemin tek nedeni, sistem takılmaya hazır olmadan önce USB sürücüsünü takmaya çalışırsa. Bu durumda, büyük olasılıkla mount komut dosyasına bir ek Tweak gerekir. (Ben ServerFault ile kontrol ediyorum herhangi bir tavsiye olup olmadığını görmek için orada çok fazla ilgilenmiyorum.)

Bunun üzerine, o zaman.


UDEV referansları:


Arkaplan (UDEV? Whuzzat?)

UDEV, çekirdeğin hotplug sistemidir. Hem önyükleme sırasında hem de sistem çalışırken eklenen cihazlar için uygun cihazları ve cihaz işaretlerini (örn. /dev/disk/by-label/<LABEL>) otomatik olarak yapılandırır.

D-Bus ve HAL, Masaüstü Ortamları gibi dinleyicilere donanım olayları göndermek için kullanılır. Dolayısıyla, GNOME'da oturum açıp bir CD veya bir USB sürücüye taktığınızda, bu olay şu zinciri izler:

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

Presto, sürücünüz monte edilir. Ancak başsız bir sistemde, otomatik sıralamadan faydalanmak için giriş yapmak zorunda değiliz.

Udev Kuralları

UDEV bize kurallar yazmamıza ve aygıtları yerleştirme programlarını çalıştırmamıza izin verdiğinden, bu ideal bir seçimdir. Debian/Ubuntu'nun mevcut kurallarından yararlanacağız, bizim için /dev/disk/by-label/<LABEL> sembolik bağlantıyı kurmalarına izin verin ve aygıtı bizim için monte edecek başka bir kural ekleyin.

UDEV'in kuralları /etc/udev/rules.d (ve Karmic'te /lib/udev/rules.d) biçiminde tutulur ve sayısal sırada işlenir. Numara ile başlamayan herhangi bir dosya, numaralandırılmış dosyalardan sonra işlenir. Sistemimde HAL kuralları 90-hal.rules adlı bir dosyada bulunuyor, bu yüzden kurallarımı 89-local.rules içine koydum, böylece HAL'e ulaşmadan önce işlenmeleri için. Öncelikle, bu kuralların 60-persistent-storage.rules öğesinden sonra olmasını sağlamanız gerekir. local.rules yeterince iyi olabilir.

Bunu yeni kurallar dosyasına ekleyin:

# /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"
  • \ 'den sonra boşluk olmadığından, sadece bir newline (\n) olduğundan emin olun.

  • Firewire desteği için SUBSYSTEMS=="usb"SUBSYSTEMS=="usb|ieee1394" olarak değiştirin.

  • Aygıtın her zaman belirli bir kullanıcıya ait olmasını istiyorsanız, bir OWNER="username" yan tümcesi ekleyin. Sadece belirli bir kullanıcının sahip olduğu dosyalara ihtiyacınız varsa, bunun yerine mount betiğini Tweak yapın.

Kural Okuma

Bu, cihazın çalışacak programlar listesine çalıştırılacak bir program ekler. USB bölüm aygıtlarını <LABEL> ile tanımlar, daha sonra bu bilgiyi montajı yapan bir komut dosyasına iletir. Özellikle, bu kural eşleşiyor:

  1. ENV{ID_FS_LABEL_ENC}=="?*" - daha önceki bir sistem kuralı tarafından ayarlanan bir ortam değişkeni. Dosya sistemi olmayanlar için mevcut değil, bu yüzden araştırıyoruz. Aslında takma noktası için ID_FS_LABEL kullanmak istiyoruz, ancak UDEV'yi benim için kaçmaya ikna etmedim, bu yüzden mount komut dosyasının bunu yapmasına izin vereceğiz.

    Bu ve diğer ortam değişkenleri, udev tarafından vol_id komutu kullanılarak elde edilir ( kullanımdan kaldırıldı ). Bir bölümdeki Nice hızlı ayrıntılarını görmek için kullanışlı bir araçtır:

    $ 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" - yalnızca add olaylarıyla eşleşir ...

  3. SUBSYSTEMS=="usb" - yalnızca USB veri yolu üzerindeki aygıtlarla eşleşir. Burada SUBSYSTEMS işlevini kullanıyoruz çünkü bu cihazımızın ebeveynleriyle eşleşiyor; İlgilendiğimiz cihaz aslında SUBSYSTEM == "scsi" olacak. Bir ana USB cihazıyla eşleştirmek, programımızı dahili sürücülere eklemekten kaçınır.

  4. RUN+="..." - eşleşme değil, eylem: bu programı çalıştırılacak programlar listesine ekleyin. Programın argümanlarında, %k aygıt adına genişletilir (örneğin, sdc1, /dev/sdc1 değil) ve $env{FOO}, FOO ortam değişkeninin içeriğini alır.

Kural Testi

İlk referans bağlantısı (yukarıdaki) mükemmel bir UDEV dersidir, ancak biraz güncel değildir. Kurallarınızı sınamak için çalıştırdığı programlar (özellikle udevtest), tümünü değiştir udevadm yardımcı programı ile değiştirildi.

Kuralı ekledikten sonra cihazınızı takın. Birkaç saniye verin, ardından hangi cihaza atandığını görmek için kontrol edin:

$ 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

Çıkarılabilir sürücünüz label_Baz içeriyorsa, sdc1 cihazındadır. Bunu çalıştırın ve çıktının sonuna doğru bakın:

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

Komut dosyası adını, son birkaç satırdaki (= buradaki alttan 3.) RUN+= kurallarımızdan arayın. Bu cihaz için kullanılacak argümanları görebilirsiniz. Argümanların sağlam olduğunu kontrol etmek için şimdi bu komutu çalıştırabilirsiniz; Komut satırınızda çalışıyorsa, bir cihaz takıldığında otomatik olarak çalışması gerekir.

UDEV olaylarını gerçek zamanlı olarak da izleyebilirsiniz: run Sudo udevadm monitor (anahtarlarla ilgili ayrıntılar için man udevadm bakın). Ardından, yeni bir cihaz takın ve olayların yan yana geldiğini izleyin. (Gerçekten düşük seviyeli ayrıntılara girmediğiniz sürece büyük olasılıkla overkill ...)

Kuralların Yeniden Yüklenmesi

Kuralın doğru bir şekilde okunduğunu doğruladıktan sonra, yeni kuralın yürürlüğe girmesi için UDEV'ye kurallarını yeniden yüklemesini söylemeniz gerekir. Bu yöntemlerden herhangi birini kullanın (ilk işe yaramazsa, ikincisi gerekir ... ama ilkini deneyin):

  • Sudo udevadm control --reload-rules komutunu çalıştır

  • Sudo /etc/init.d/udev reload komutunu çalıştır

  • reboot


Senaryo! Aslında, 2 Script ...


İşte ilk komut dosyası. Çalıştığımız programın hızlı bir şekilde tamamlanması gerekiyor, bu sadece ikinci komut dosyasını arka planda çeviriyor. Bunu /usr/local/sbin/udev-automounter.sh içine koyun:

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

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

İşte ikinci senaryo. Bu, biraz daha fazla giriş kontrolü yapıyor. Bunu /usr/local/sbin/udev-auto-mount.sh içine koyun. Aşağıdaki montaj seçeneklerini değiştirmek isteyebilirsiniz. Bu senaryo şimdi LABEL bölümünü kendi başına bulmayı ele alıyor; UDEV sadece CİHAZ adını gönderir.

Sürücüleri önyükleme sırasında takmakla ilgili bir sorun varsa , bu betiğe Nice uzun bir sleep 60 koyabilirsiniz, sisteme sonuna kadar gelmesi için komut dosyası sürücüyü takmayı denemeden önce.

Nasıl kontrol edileceğine ilişkin bir öneride bulundum (bir web sunucusunun çalışıp çalışmadığını görmek için ps komutunu çalıştırın), ancak bunu sisteminiz için yapmak isteyeceksiniz. Kullanmakta olduğunuz herhangi bir ağ sunucusunun bu amaç için yeterli olacağını düşünüyorum - nfsd, smbd, Apache, vb. Tabii ki, hizmetin çalışmaması durumunda takma komut dosyasının başarısız olması riski elbette test etmek. belirli bir dosyanın varlığı daha iyi bir çözüm olacaktır.

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

Süper Bonus Temizleme Script!

Bir komut dosyası daha. Tüm bunlar cihazın bağlantısını kesmek ve bağlama noktası dizinlerini kaldırmaktır. Bunu yapmak için ayrıcalıkları olduğunu varsayar, bu nedenle Sudo ile çalıştırmanız gerekir. Bu komut dosyası şimdi komut satırında tam bağlama noktasını alır, örneğin:

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

Bunu /usr/local/sbin/udev-unmounter.sh içine koyun:

#!/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
73
quack quixote

Başkalarının net etrafında önerdiği son seçenek ise, ivman'dır, ancak daha önce belirttiğiniz pmountname__' e bağlı görünüyor. pmountterk edildi ve ivmanneredeyse aynı.

ivmanyerine halevtname__, ve Karmic içinde mevcuttur. Bu, ivman'nin bir tekrar uygulamasıdır (okuma: "tutulan" ve "düzene bağlı değildir"). Paket Jaunty'de mevcut değildir, ancak yükseltme yapmayı planlamıyorsanız, kendiniz oluşturabilirsiniz.

Bu araçların her ikisi de DBus ve HAL katmanlarının üzerinde oturur ve bunlardan olaylara yanıt verir. Görünüşe göre her ikisi de bir sistem arka plan programı olarak ya da bir kullanıcı oturumu bağlanma yöneticisi (la Gnome-VFS) olarak çalışabilir - /etc/defaults/{ivman,halevt} dosyaları sistem ayarlarından sorumludur.

İşte bazı talimatlar , /media/<LABEL> mountpoints kullanmak için ivmanayarını değiştirmek için. Muhtemelen halevtbunu yapmak için daha basit bir yol var, ama belki de bir cevap bulmanıza yardımcı olurlar.


HALEVT ile çalışmak

Güncelleme : UDEV cevabımın sağlamadığı, otomatik CD montajları da dahil olmak üzere, halevtadresinde daha derine baktım. Bunu blog yazısı buldum, bu da süreç hakkında çok şey anlattı. Debian Lenny için kendi halevtpaketimi derlemek zorunda kaldım (Neyse ki bütün bağımlılıklar lenny-backports bölümünde idi). Kurulduktan sonra, işlem çoğunlukla korkunç değildi:

  1. Sistem halevt-daemon'un /etc/default/halevt içinde etkin olduğundan emin olun
  2. Sistemin kullanıcısını cihazları /etc/PolicyKit/PolicyKit.conf içine bağlamasına izin verin (aşağıya bakın; kaynak )
  3. Birim etiketini /etc/hal/fdi/policy/preferences.fdi içinde tercih edilen mountpoint'e kopyalamak için HAL politikasını değiştirin (aşağıya bakınız)
  4. CD/DVD desteği istiyorsanız, yukarıdaki blogdan eject.hal script 'i alın, değiştirin ve /usr/local/bin içine kaydedin.
  5. /etc/halevt/halevt.xml içinde mountları etkinleştirmek için halevt sistem config'i değiştirin
  6. Birisi oturum açtığında sistemin halevt-daemon'unu durdurmak için oturum açma yöneticinizin oturum öncesi ve sonrası komut dosyalarına kod ekleyin ve oturumu kapattıklarında yeniden başlatın.

Yeni yapılandırmalarınızı kontrol etmek için HAL ve HALEVT numaralarını yeniden başlatmanız gerekirse, bunları doğru sırayla almak için bunu kullanın:

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

Aşama 1

START_DAEMON=yes içinde /etc/default/halevt adresini kontrol edin.

Adım 2

/etc/PolicyKit/PolicyKit.conf içine şunu ekleyin inside<config></config> bölümü:

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

Aşama 3

/etc/hal/fdi/policy/preferences.fdi içine şunu ekleyin inside `bölümü:

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

4. adım

Komut dosyası iyi ancak çalışması için /bin/bash; Bazı sistemler /bin/dash çağrıldığında aslında /bin/sh öğesini kullanabilir. Doğru olanı aldığınızdan emin olmak için komut dosyasındaki en üstteki satırı değiştirin:

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

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

Adım 5

Bu eğlenceli kısmı. Sisteminiz zaten temel bir /etc/halevt/halevt.xml sağlayabilir, bu nedenle bunu kendi kullanımınız için uyarlamanız gerekir. Benim durumumda sistemim zaten temel çıkarılabilir montaj sağladı, ancak CDROM montajı ve çıkarma düğmesi için destek eklemek zorunda kaldım.

Bahsettiğim blog yazısı, kendi tweaksinize bakmak için iyi bir örnek XML yapılandırması içeriyor. Çoğunlukla yazarın fluxboxortamı için gnome-mount değişiminin ayarlanmasıyla ilgilidir, bu nedenle onun örnek XML'i istediğinizden daha fazlasını yapar, ancak yapabilecekleriniz için bir fikir edinmenin harika bir yoludur. /usr/share/doc/halevt/examples içinde bazı iyi örnekler de var.

Her şey işe yaramadan önce Sudo sh -c "mkdir /var/halevt ; chown halevt:plugdev /var/halevt" dosyasını çalıştırmak zorunda kaldım.

İşte automounting CD/DVD çalışması yapmak için eklerim:

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

6. adım

Sistem halevt-daemon'un çalışmasını sağladıktan sonra, GNOME'da oturum açtığınızda devre dışı bırakmanız ve oturumu kapattığınızda yeniden başlatmanız gerekir. (Bkz. bu soruya cevabım GDM üyesi olmayan giriş yöneticileri için.) Bu şeyler kullanmamamdan dolayı teoriktir, ancak çalışması gerekir.

/etc/gdm/PreSession/Default içine, sistemi halevt-daemon'u durdurmak için bunu ekleyin:

/etc/init.d/halevt stop

/etc/gdm/PostSession/Default içine, sistemi halevt-daemon'u yeniden başlatmak için bunu ekleyin:

/etc/init.d/halevt start
9
quack quixote

Zaman geçtikçe daha kolay çözümler ortaya çıkar.

Bu çözüm, bu amaç için yazılan udevil yazılım paketine dayanmaktadır ve udev kuralları ile bağlantı kurmayı gerektirmemektedir. Doğrudan ileriye dönük bir çözüm olarak muhtemelen (yeni ve eski kullanıcılara) tercih edilir.

Udevil'den gelen devmon betiği sadece sihir ve glib'e bağlı olarak tüm sihirleri yapar. İlk konfigürasyona gerek duymadan neredeyse kutudan çıkar.

İş istasyonumda yaptığım tek şey rc.local dizisinden devmon çağırmaktı:
devmon 2>&1 >> /var/log/devmon &
Rahatınız için, bunu oluşturmak için pleaserun gibi otomatik bir araç kullanarak rc.local yerine init komut dosyasına gömmek isteyebilirsiniz: https://unix.stackexchange.com/a/124609/ 4267

Çalıştırdıktan sonra taktığım depolama alanı denetlenir (bölümleri arar ve eğer bulundukları dosya sistemi etiketlerine bakarsa) sonra /media/FILESYSTEM_LABEL içine monte edilir.
Gelecekte bir noktada bu işlevi bir araya getirecek (in) ünlü sistem dışında, bundan daha basit bir şey hayal edemiyorum.

bir Bakışta udevil ( github.io/udevil )
Senaryo: devmon ( igurublog/script-devmon )

6
Costin Gușă

Debian tabanlı sistemler için (örneğin Ubuntu vb.) USB sürücülerini sizin için otomatik olarak monte eden sbmount paketi vardır. Temelde, daha önce belirtildiği gibi udev tabanlı bir yaklaşım kullanıyor - sadece basit bir paket kurulumu. Görünüşe göre orjinal paketin yazarı Steam'in tükenmesine rağmen Ubuntu/Debian hala devam ediyor gibi görünüyor (sanırım o kadar karmaşık değil) - bu yüzden hala en yeni sürümlerde mevcut.

Yüklenen komut dosyaları uygun bağlantı noktalarını sağlamak için yapılandırılabilir (/etc/usbmount/usbmount.conf).

3
Pierz

quack quixote'un cevabı Ubuntu Lucid Lynx (10.04) 'de çalışmıyor - /sbin/vol_id komutu yok.

Süslü olmak ve udev kullanmak yerine, bunu /etc/rc.local'inize koyun ve yapı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
3
mrm

Quack Quixote'un mükemmel kaldırma talimatlarını temizlemek için:

Daha önce yaptığınız udev kural dosyasına aşağıdaki satırı ekleyin (/etc/udev/rules.d) "

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

Daha sonra aşağıdaki betiği oluşturun ve aşağıdaki içeriklerle çalıştırılabilir (/usr/local/sbin/udev-autounmounter.sh) chmod yapın:

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

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

Sonunda unmount betiğinin kendisi (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

Böylece diğer talimatlarla, dizin udev olaylarında otomatik olarak görünecek ve kaybolacaktır.

3
chotchki

İsterseniz Pysdm'yi deneyin

2
Sathyajith Bhat

su username -c gnome-volume-manager /etc/rc.local dizinine yerleştirmeyi deneyebilirsiniz. Sadece gnome-hacim yöneticisi çalışıyor olması yeterli olabilir.

Düzenleme: Görünüşe göre gnome-volume-manager artık Ubuntu masaüstünde bile varsayılan dağıtımın bir parçası değil.

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

Ancak, belki kurarsanız, yine de çalışacaktır. Denemeye deger. Çalışmazsa, tekrar kaldırın.

İstediğiniz şeyi yapan, ancak normal otomatik sıralama ile etkileşime girebilecek usbmount paketi de var.

2
Ryan Thompson

Quack quixote'un udev tabanlı çözümü için düzenlediğim eklerim reddedildi, bu yüzden onları buraya koyacağım. Lütfen önce onun gönderisine bakın.

Öncelikle, udev kuralınızın herhangi bir cihaz SCSI alt sistemi (USB, FireWire ve eSATA dahil) üzerinden bağlandığında hareket etmesini istiyorsanız, udev kuralındaki SUBSYSTEMS eşleşmesini SUBSYSTEMS=="scsi" olarak değiştirin .

Yine de, bunun sistem çalışırken çalışırken fişini çekiyorsanız, dahili sürücüler dahil olmak üzere, hemen hemen her şeyi otomatik olarak bağlayacağını unutmayın, bu nedenle istediğiniz şey olmayabilir.

İkincisi, işte kullandığım betiği, o yazıdaki tüm betiğin yerini alır. Ayrıca/media/içinde oluşturulmuş montaj noktalarını, monte edilen blok cihaz çıkarıldığı anda otomatik olarak temizler - manuel müdahaleye gerek yoktur. Ayrıca, arka planda çalıştırmak için farklı bir komut dosyası çağırmak yerine, bir terminalden çalıştırılmadığında (örneğin, udev aracılığıyla çalıştırıldığında) arka planda kendini gösterir.

Takılan aygıt kaybolana kadar beklemek için inotifywait işlevini kullanır ve ardından oluşturduğu dizini kaldırır. Bu nedenle, sisteminizde yüklü inotify araçlarına sahip olmanız gerekir. Debian tabanlı dağıtımlarda (Ubuntu dahil), Sudo apt-get install inotify-tools yeterli olmalıdır.

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

Cihazları senkronize etmeden ve salt okunur olarak monte ettiğimi not edersiniz. Bunun nedeni, zamanımın% 99'unda benim kullanımım harici bir sürücüden okuyor ve ne zaman yazmam gerekiyorsa, sunucuda yine de aktif olacağım ve kolayca bir mount -o remount,rw <mountpoint> komutu verebilirim. İhtiyaçlarınıza göre düzenleyin :)

1

Mountmanager ile yapılandırmayı deneyin, böylece verileri manuel olarak girmek zorunda kalmazsınız.

Ubuntu deposunun bir parçası olmalı.

1
Abhinav