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


73

Bu soru benzer, ancak istediklerimin tam tersi. Harici USB sürücülerinin, herhangi biri oturum açmadan, herhangi bir yere girmeden, açılışta otomatik olarak bağlanmasını istiyorum /media/<label>.

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-mountGnome grafik oturumuna yerel olarak giriş yaptığınız zaman bazı şeyleri bağladığınız görülüyor.


4
Harika bir soru, keşke size bir cevabım olsaydı, şimdi bunun nasıl çözüldüğünü merak ediyorum.
ters çevir

1
Cevabımı güncelledim.
Ryan Thompson

1
Ve ben, kayıt için, Gnome'un kurulu olduğu gibi, benim zaten yaptığım gibi bir sorunum yok, ama başsız GUI'siz sunucular için bir çözüm en iyisi olacaktır.
Endolith

1
ARRRGHH ... cevabımdaki hata. RUN'da. /usr/local/sbin/udev-automounter.sh mount %kolmalı /usr/local/sbin/udev-automounter.sh %k. üzgünüm.
quix quixote

1
Tamam, Güncelleme-3'ten itibaren boşluklarla çalışıyor. Bunu, boşlukları \x20's' ye dönüştüren "LABEL>" kodlanmış "bir versiyonunu kullanarak yapar . bu yüzden hoş değil, ama işe yarayacak. udev boşluklu etiketleri iyi kullanmıyor, ancak \x20's' yerine alt çizgi kullanan başka bir seçenek daha var (bu yüzden en azından iyi görünüyor). Uzay işleme shellscripts gitmek zorunda gibi görünüyor.
quix quixote

Yanıtlar:


74
  • Ubuntu Server 11.10 için not: Bu komut, kullanılmayan vol_idkomut nedeniyle Ubuntu Server 11.10'da başarısız olur . vol_idtarafından yerini aldı blkid. Komut dosyasını düzeltmek için komut dosyasında "vol_id" yerine "blkid -o udev" yazın udev-auto-mount.sh.

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.
  • /media/LABELCihazı otomatik olarak bağlamak için bir dizin oluşturur .

  • Bununla birlikte, 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 sökme işlemi mümkün olmalı, ancak gerekli gksudoveya benzeri olabilir .

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 ince ayar yapmanız gerekir. ( Herhangi bir tavsiye olup olmadığını görmek için ServerFault ile kontrol ediyorum , ancak bu konuda çok fazla ilgi duymadım .)

Bunun üzerine, o zaman.


UDEV referansları:


Arkaplan (UDEV? Whuzzat?)

UDEV, çekirdeğin hotplug sistemidir. /dev/disk/by-label/<LABEL>Hem önyükleme sırasında hem de sistem çalışırken eklenen cihazlar için uygun cihazları ve cihaz işaretlerini (örn. ) 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 faydalanacağız, /dev/disk/by-label/<LABEL>bize bağ kuracaklar ve cihazı bizim için monte edecek başka bir kural ekleyelim.

UDEV'in kuralları /etc/udev/rules.d(ve Karmik'te) tutulur ve /lib/udev/rules.dsayısal sırada işlenir. Numara ile başlamayan herhangi bir dosya, numaralandırılmış dosyalardan sonra işlenir. Sistemimde, HAL kuralları adı verilen bir dosyada 90-hal.rules, bu yüzden de kurallarını koydum, böylece 89-local.rulesHAL'e ulaşmadan önce işlenmelerini sağladım. Öncelikle, bu kuralların bundan sonra olmasına dikkat etmeniz gerekir 60-persistent-storage.rules. local.rulesyeterince 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"
  • Bundan sonra boşluk olmadığından emin olun \, sadece newline( \n).

  • Değişim SUBSYSTEMS=="usb"için SUBSYSTEMS=="usb|ieee1394"Firewire desteği için.

  • Aygıtın her zaman belirli bir kullanıcıya ait olmasını istiyorsanız, bir OWNER="username"fıkra ekleyin . Sadece belirli bir kullanıcının sahip olduğu dosyalara ihtiyacınız varsa, bunun yerine mount komut dosyasını düzenleyin.

Kural Okuma

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

  1. ENV{ID_FS_LABEL_ENC}=="?*"- ö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 ID_FS_LABELbağlama noktası için 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_idkomut kullanılarak ( kullanımdan kaldırılmış ) elde edilir . Bir bölümdeki güzel hızlı ayrıntıları 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"- sadece maç addetkinlikleri ...

  3. SUBSYSTEMS=="usb"- sadece USB veri yolu üzerindeki cihazlarla eşleşin. Burada kullanıyoruz, SUBSYSTEMSçü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, %kcihaz adına genişletilir (örn sdc1. Değil /dev/sdc1) 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 ( udevtestözellikle de), hepsini yakala udevadmyardımcı program tarafından 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 içeriyorsa label_Baz, aygıtta bulunur sdc1. 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'

RUN+=Son birkaç satırdaki kuralımızın kod adını arayın (bu örnekte alttan 3.). 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( man udevadmanahtarlarla ilgili detaylar için bakınız). 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):

  • Çalıştırmak sudo udevadm control --reload-rules

  • Çalıştırmak sudo /etc/init.d/udev reload

  • reboot


Senaryo! Aslında, 2 Script ...


İşte ilk senaryo. Çalıştırdığımız programın hızlı bir şekilde tamamlanması gerektiğinden, bu sadece arka plandaki ikinci yazıyı döndürür. Bunu içine koy /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} &

İşte ikinci senaryo. Bu biraz daha fazla giriş kontrolü yapar. Bunu içine koy /usr/local/sbin/udev-auto-mount.sh. 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 takmakta bir sorun varsasleep 60 , komut dosyası sürücüyü monte etmeyi denemeden önce sisteme sonuna kadar gelmesi için uzun süre bu komut dosyasında uzun süre kullanabilirsiniz.

Nasıl kontrol edileceğine ( psbir web sunucusunun çalışıp çalışmadığını görmek için çalıştırın) yorumlarda bir öneride bulundum , ancak bunu sisteminiz için ince ayar 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ışmadığı durumda elbette mount komut dosyasının başarısız olması riskidir; 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 çalıştırmanız gerekir sudo. 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 içine koy /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
Sen müthişsin! :)
kolypto

1
Auto-mount.sh dosyasını manuel olarak çalıştırırsam çalışır, ancak sürücüyü takmazsam ve önyükleme yapmazsam. : /
endolith

bu yüzden sorun UDEV kurallarındadır. Hata ayıklamanıza yardımcı olması için bu bölümü biraz genişletin.
quix quixote

3
Github tüm komut dosyalarını oluşturduk: github.com/fatso83/Code-Snippets/tree/master/system-utils/... Onlar Ubuntu 10.10 üzerinde iyi çalışır ve aynı zamanda oto-çıkart şunlardır
oligofrenlerine

1
Referans: udev_237 - erkek Udev (Ubuntu_18.04) ağına erişmek veya programları çalıştıran unutmayın bağlantısını kesme / bağlama dosya sistemlerini edilir Udev kuralları içinde izin nedeniyle varsayılan için, kum havuzu systemd-udevd.service yürürlüğe girer. kaynak: unix.stackexchange.com/questions/200194/… Bir çözüm için serverfault.com/questions/766506/…
Pro Yedekleme

9

Diğerlerinin net etrafında önerdiği bir son seçenek ivman, ancak pmountdaha önce belirttiğinize bağlı olmadığına bağlı gibi görünüyor . pmountterk edilmiş ve ivmanneredeyse aynı.

Bunun yerine ivmanis halevt, ve Karmic de mevcut. Bu bir uygulama ivman(okuma: "devam ettirildi" ve "başkalarına bağlı değil"). 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ı 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 bağlama ivmannoktalarını kullanmak için ince ayar yönergeleri/media/<LABEL> . Bunu halevtyapmanın daha basit bir yolu olabilir, ancak belki de bir cevap bulmanıza yardımcı olurlar.


HALEVT ile çalışmak

Güncelleme : UDEV cevabımın sağlamadığı otomatik CD montajları almak için daha derinlere baktım halevt. Bu blog gönderisini buldum, bu süreç hakkında çok fazla açıklama yaptı. halevtDebian Lenny için kendi paketimi derlemek zorunda kaldım (Neyse ki tüm 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 etkin olduğundan emin olun. /etc/default/halevt
  2. Sistemin kullanıcı tarafından cihazları monte etmesine izin ver /etc/PolicyKit/PolicyKit.conf(aşağıya bakın; kaynak )
  3. Birim etiketini içinde tercih edilen mountpoint'e kopyalamak için HAL politikasını değiştirin /etc/hal/fdi/policy/preferences.fdi(aşağıya bakınız)
  4. CD / DVD desteği istiyorsanız, eject.halbetiği yukarıdaki blog yayınından alın, değiştirin ve kaydedin /usr/local/bin.
  5. Bağlantıları etkinleştirmek için halevt sistem yapılandırmasını değiştirin /etc/halevt/halevt.xml
  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ırada 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

Olmadığını kontrol START_DAEMON=yesiçinde /etc/default/halevt.

Adım 2

Olarak /etc/PolicyKit/PolicyKit.conf, bu eklenti içindeki<config></config> bölümün:

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

Aşama 3

Bunu `bölümünün içine/etc/hal/fdi/policy/preferences.fdi ekleyin :

<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

Senaryo iyi ama çalışması gerekiyor /bin/bash; Bazı sistemler aslında kullanabilir /bin/dashzaman /bin/shdenir. 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 /etc/halevt/halevt.xmlzaten bir temel 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 tweaks'larına bakmak için iyi bir örnek XML yapılandırmasına sahip. Çoğunlukla yazarın fluxboxçevresi için cehennem takma bir yedek ayarlamakla ilgilidir , bu nedenle onun örnek XML'i istediğinizden daha fazlasını yapar, ancak yapabilecekleriniz hakkında fikir edinmek için harika bir yoldur. Ayrıca bazı iyi örnekler de var /usr/share/doc/halevt/examples.

Ayrıca sudo sh -c "mkdir /var/halevt ; chown halevt:plugdev /var/halevt"her şey işe yaramadan önce koşmam gerekiyordu.

İş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. ( Bu soruya GDM olmayan giriş yöneticileri için cevabımı görün .) Bu şeyler kullanmamamdan dolayı teorik, ancak çalışması gerekiyor.

Içinde /etc/gdm/PreSession/Default, sistemi halevt-daemon'u durdurmak için şunu ekleyin:

/etc/init.d/halevt stop

Içinde /etc/gdm/PostSession/Default, halevt-daemon sistemini yeniden başlatmak için şunu ekleyin:

/etc/init.d/halevt start

3
Bunu 2013'te okuyan insanlar için, şimdi HAL'nin kullanımdan kaldırıldığını bilmeleri ve yukarıda verilen bir quackot kişisi gibi udev tabanlı çözümlere başvurmaları gerekir.
oligofren

6

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

Bu çözüm, bu amaç için yazılmış 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.

devmonSadece udev ve geveze bağlı iken udevil gelen komut bütün büyüleri yok. İlk konfigürasyona gerek duymadan neredeyse kutudan çıkar.

İş istasyonumda yaptığım tek şey, rc.localbu gibi şeylerden somon çağırmaktı :
devmon 2>&1 >> /var/log/devmon &
Rahatınız için, oluşturmak için rc.localotomatik bir araç kullanmak yerine bunu bir init betiğine gömmek isteyebilirsiniz pleaserun: https://unix.stackexchange.com/ a / 124609/42673

Çalıştırdıktan sonra, taktığım depolama alanı denetlenir (bölümleri arar ve eğer bulunursa dosya sistemi etiketlerine bakar) /media/FILESYSTEM_LABEL.
Bundan daha basit olan herhangi bir şeyi hayal bile edemedik, belki de (bu) ünlü sistemin geleceğin bir noktasında bu işlevi bir araya getirmesi.

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


3

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

Süslü olmak ve udev kullanmak yerine, bunu /etc/rc.local dosyasına 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

1
TEŞEKKÜRLER .. Bu başarmak istediklerimin en basit yoluydu. Ubuntu Server 16'da bir ntfs
birimiyle

3

Debian tabanlı sistemler için (örn. Ubuntu vb.), USB sürücülerini sizin için otomatik olarak bağlayan usbmount paketi var. Temelde, daha önce belirtildiği gibi udev tabanlı bir yaklaşım kullanıyor - sadece basit bir paket kurulumu. Paketin asıl yazarı bitmiş gibi görünüyor ama Ubuntu / Debian hala onu koruyor 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).


1
Usbmount, yapılandırma dosyasındaki etiketlerin listesini doldurmadığınız sürece etikete monte edemez.
Gilles

1
Listeye bakmadan usbmount etiketine montaj eklemek istiyorsanız esite.ch/2014/04/11/… adresine bakınız .
Oliver Sauder

3

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.


Bence if [ -n "$device_is_mounted" ]; thenolmalı if [ -z "${MOUNTPT}" ]; thenbu olmamalı?
eresonance

2

Sen isteyebilirsin Pysdm denemek


Bu sadece başka bir fstab editörü, değil mi?
endolith

Evet, ancak "Depolama aygıtlarının dinamik yapılandırılması için udev kurallarının oluşturulmasına da izin veriyor"
Sathyajith Bhat

"Udev kurallarının oluşturulması" bana bir şekilde yardımcı olur mu? Bunun ne anlama geldiği hakkında hiçbir fikrim yok. Yerel olarak oturum açmış bir kullanıcı olmadan önceden bilinmeyen taşınabilir aygıtları monte ediyor mu?
099'da endolith

Üzgünüm, udev kuralları hakkında hiçbir fikrim yok. Sen bir göz olabilir fredericiana.com/2006/03/15/writing-udev-rules-short-notes ve reactivated.net/writing_udev_rules.html
Sathyajith Bhat

2

su username -c gnome-volume-manager/Etc/rc.local komutunu girmeyi deneyebilirsiniz . Sadece gnome-hacim yöneticisi çalışıyor olması yeterli olabilir.

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

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.

usbmountİstediğiniz şeyi yapan, ancak normal otomatik numaralandırmayı engelleyebilecek bir paket de var .


Bilinmeyen komut “gnome-volume-manager”. Ubuntu Jaunty'deyim.
Endolit

/ Usr / lib / gnome-cilt yöneticisi / gnome-cilt yöneticisi vardır, ancak hiçbir şey yapmaz.
Endolit

Ah anlıyorum. Gnome-volume-manager adlı bir paket de var. İlgili: crunchbanglinux.org/forums/topic/239/...
Endolit

Gnome-volume-manager bir şeyleri bağlamak için HAL kullanıyor gibi görünüyor? Ve "2009 itibariyle, HAL DeviceKit lehine itiraz ediliyor." Neden Linux'taki her şey hep böyle? Neredeyse doğru çalışan bir şey elde etmeye başlarlar ve sonra onu çıkarırlar ve çalışmayan yeni bir şeyle değiştirirler.
09’daki

pmount artık çalışmıyor. > Pmount / dev / disk / by-etiket / DEPOLAMA hatası: / sdc1 çıkarılabilir aygıt / dev değil togaware.com/linux/survivor/Using_Gnome_Volume_Manager.html
Endolit

2

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 SCSI alt sistemi (USB, FireWire ve eSATA dahil) aracılığıyla herhangi bir cihaz bağlandığında harekete geçmesini istiyorsanız, udev kuralındaki SUBSYSTEMS eşleşmesini değiştirin SUBSYSTEMS=="scsi".

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ışmak 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-toolsyeterli 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>komut verebilirim . İhtiyaçlarınıza göre düzenleyin :)


Bu betiği nasıl çalıştırıyorsunuz? modern versiyonlar için halevtgüncel bir apt-getpaket olarak görünmüyor .
Campbeln

Agh ... belki quackote'ın en iyi / kabul edilen cevap girişini takip edersem ... Burada daha dolgulu bir cevap almak güzel olurdu :)
Campbeln

1

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

Ubuntu deposunun bir parçası olmalı.


Bunu elde etmek için evren bölümünü etkinleştirmeniz gerekir.
quack quixote

? apt: mountmanager bölüm = evren;)
Endolit

Bu sadece benim için bir fstab kuracak mı?
endolith

@endolith: apt: universe? install = mountmanager daha mantıklı olmaz mıydı? ;)
Bobby

Bu format çalışıyor mu? Bu adam sayfa kadar demiyor manpages.ubuntu.com/manpages/karmic/en/man8/apturl.8.html
Endolit

-5

Bir seferde yalnızca bir sürücünüz takılıysa, bunu sadece /etc/fstabdosyanızı düzenleyebilirsiniz . Çizgileri boyunca bir şey:

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

Bu açılışta onu monte etmeli ve izinleri olan herkes tarafından erişilebilir olmalıdır. Birden fazla sürücünüz varsa, bunu yine de yapabilirsiniz:

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

6
Açıkça sorulan soru ne değil.
quack quixote
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.