Umount'ta Meşgul Cihaz


41

Bir dizini silmek için genellikle bir sorunla karşılaşırım:

umount / mnt / dir
umount: / mnt / dir: cihaz meşgul

Cihazın meşgul olmasının birçok nedeni var. Bazen üzerinde açık kilitleri olan işlemler vardır, bazen üzerine monte edilmiş başka dizinler de vardır /mnt/dir.

Benim sorum:

Bir dizinin neden kaldırılamadığını kontrol etme adımları nelerdir?

Bunun birçok nedeni olduğunu biliyorum, ancak belirli bir çözümü açıklarsanız sorun değil.

[DÜZENLE]

[X] monte edilmiş hacimlerde işlem yürütüyor.
[X] başka bir birim, kaldırmak istediğimiz birimin üzerine monte edildi
[_] NFS, çıkarmak istediğimiz birimi kilitledi


Yanıtlar:


75

Kontrol etmenin yolu fuser -vm /mnt/dir, hangi root olarak çalıştırılmalıdır. Hangi işlemlerin bağlama noktasına eriştiğini size söyleyecektir.

Bir alternatif, lsof /mnt/dirmount'daki her açık dosyayı gösterecektir. Yine en iyi kök olarak çalıştırın.

Bunlardan herhangi birini root olmayan olarak çalıştırabilirsiniz, ancak daha sonra çıktı işlemlerinizle sınırlı olacaktır - diğer kullanıcılardan gelenler dosya sisteminin çıkarılmasını engelleseler bile sessizce gösterilmezler.

Örnek:

Watt:~# fuser -vm /mnt/Zia/src
                     USER        PID ACCESS COMMAND
/mnt/Zia/src:        root     kernel mount /mnt/Zia/src
                     anthony   24909 ..c.. bash
                     anthony   25041 F.c.. gvim

"Erişim" alanı size nasıl erişildiğini gösterir. Bu durumda, çekirdek bir montaj olarak kullanımdadır (ah, ama çıkarmadan sadece bu durumda tamam olacak). bashmevcut çalışma dizini olarak var ( cdunmount'tan önce farklı bir dizine gitmesi gerekecek ) ve gvim hem geçerli dizine sahip hem de bir dosya açık (o gvim dizisini kapatmanız gerekecek).

Watt:~# lsof /mnt/Zia/src
COMMAND   PID    USER   FD   TYPE DEVICE SIZE/OFF    NODE NAME
bash    24909 anthony  cwd    DIR   0,26    12288 3527682 /mnt/Zia/src/perl (zia.vpn.home:/home/anthony/src)
gvim    25041 anthony  cwd    DIR   0,26    12288 3527682 /mnt/Zia/src/perl (zia.vpn.home:/home/anthony/src)
gvim    25041 anthony    6u   REG   0,26    16384 3526219 /mnt/Zia/src/perl/.utf8.c.swp (zia.vpn.home:/home/anthony/src)

Bu çıktıda, hem bash hem de gvim için geçerli dizinleri görebilirsiniz (tür olarak DIR). Ayrıca hangi gvim dosyasının açılabileceğini de görebilirsiniz.

Sorun nasıl zorlanır:

fusermount'u kullanan her işleme -kbir sinyal (varsayılan:) gönderecek bir seçeneğe sahiptir SIGKILL. Bu, bağlantının meşgul olmasını engellemenin oldukça güçlü bir yoludur. (Ve tabii ki, ne olduğuna dikkat et SIGKILL!)

umount-ltembel bir unmount yapmak için bir seçeneğe sahiptir . Bağlama dosya sistemi ad alanından kaldırılır (böylece /mnt/Zia/src, örnekte daha fazla göremezsiniz ), ancak takılı kalır, böylece erişen programlar bunu yapmaya devam edebilir. Bu programa erişen son program çıktığında, unmount aslında gerçekleşecektir.

Kesinleşemeyen başarısızlığın son bir düzeltilebilir nedeni var ve bu bir NFS sunucusu aşağı gidiyor. Burada kullanabilirsiniz umount -f, ancak bunu yaparsanız veri kaybı riskiyle karşı karşıya kalırsınız. (Müşteriye henüz sunucu tarafından onaylanmayan yazma önbelleğe alınmış olabilir ve bu yazmalara atılacaktır. Ancak, uygulamalara zaten yazmanın başarılı olduğu söylenmiştir.)


4
Not fuser -kolduğu son derece onu root olarak yapıyor olacak gibi riskli ve değilsen çok emin ... dikkatsiz bir komutla gerçekten muhteşem hasar yapabilir kapalı olan işlemler sonlandırılacak
shadur

1
@Shadur, umarım zaten -kseçenek olmadan çalıştırmışsınızdır , böylece hangi süreçleri öldüreceğinizi bileceksiniz. Ama bir uyarı ekleyeceğim.
derobert

1
fuser -vm"çekirdek montajı" gösterdi. systemctl stop opt.mountmanuel yerine yapmak zorunda kaldım umount.
lkraav

2
Nedense umount -f benim için çalışmıyor ama umount -l çalıştırmak mükemmel çalışıyor.
Firze

umount -fVe NFS ile ilgili not için teşekkürler . Sorunum, dev makinelerimin IP'leri değiştirdiği ve paylaşımın kaldırılamadığı NFS ile ilgiliydi.
Eric

19

Kullanmalısın:

sudo umount -l <path>

7
Sil, hangi aptal kişinin onu oy kullanabileceği hakkında hiçbir fikrim yok. -lTam olarak bile kullanmak seçenektir -fçalışmaz.
Hi-Angel

@ Hi-Angel Çünkü OP'nin sorduğu şey bu değil mi?
xhienne

@ xheinne yığın değişimi sadece saçma bir bot gibi bir soruya cevap vermekle ilgili değildir, bu cevap yardımcı olur. birçok kişi de google aramadan gelir. Şahsen bunu yararlı buldum. Op shoudl, kabul et düğmesinin neden orada bulunduğuyla ilgili bulduğu cevabı kabul eder.
user1735921

6

Başka bir cilt, kaldırmak istediğimiz birimin üzerine monte edilmiştir:

mountKomutu (hariç argüman ne de seçeneksiz invoqued eğer tüm birimleri monte haber verir -v). Bir bit perl ekleyerek, etkin bağlama noktalarının bir listesine sahip olabilirsiniz:

mount | perl -pe 's/.*on (\S+) type.*/\1/'

Ardından, kaldırmak istediğiniz hedef noktanın üzerinde durun ve bunun üzerine monte edilmiş bir dosya sistemi olup olmadığını bileceksiniz.

mount | perl -pe 's/.*on (\S+) type.*/\1/' | grep '/mnt/dir/'

O zaman iki çözümün var . Dosya sistemlerini çıkarın ya da ile taşıyın mount --move olddir newdir(çekirdek> 2.5.1)


1
Evet teşekkürler. / etc / mtab ve / proc / mounts da mümkündür.

Ah doğru, bunları hep unuttum. Diyelim ki "mount" yazmak daha az karakter gerektiriyor (ancak yürütülecek daha fazla kaynak?)
mveroone

1
Dizüstü bilgisayarımdaki belirli bir dizine "kalıcı olarak" takılan harici bir USB depolama aygıtım var, Bazen kablo yanlışlıkla kesiliyor. Bu cevabı okuyana kadar, cihazı dizine yeniden yerleştirmek ("meşgul" nedeniyle) çok acı vericiydi. Şimdi mount - move olddir newdir'i kullandım. Teşekkürler.
Silvio Levy

3

Dosyaları aç

Açık dosyalar içeren işlemler olağan suçlulardır. Onları göster:

lsof +f -- <mountpoint or device>

Kullanmanın bir avantajı vardır /dev/<device>ziyade /mountpointbir mountpoint bir sonra kaybolacaktır: umount -lya da monte bindirilmiş bir tarafından gizlenmiş olabilir.

fuserayrıca kullanılabilir, ama aklıma lsofdaha yararlı bir çıktı var. Ancak fuser, dramalarınıza neden olan süreçleri öldürmek konusunda faydalıdır, böylece hayatınıza devam edebilirsiniz.

Dosyaları listele <mountpoint>(yukarıdaki uyarıya bakın):

fuser -vmM <mountpoint>

Yalnızca yazma için açık dosyalar ile etkileşimli olarak öldürme işlemleri:

fuser -vmMkiw <mountpoint>

Salt okunur ( mount -o remount,ro <mountpoint>) yeniden monte ettikten sonra , kalan tüm işlemleri öldürmek güvenlidir (r):

fuser -vmMk <mountpoint>

Mountpoints

Suçlu, çekirdeğin kendisi olabilir. Çalıştırmaya çalıştığınız dosya sistemine bağlı başka bir dosya sistemi, umountüzüntüye neden olacaktır. Şununla kontrol et:

mount | grep <mountpoint>/

Geri döngü montajları için ayrıca aşağıdakilerin çıkışını kontrol edin:

losetup -la

Anonim düğümler (Linux)

Anonim inode'lar şu şekilde oluşturulabilir:

  • Geçici dosyalar ( openile O_TMPFILE)
  • saatler inotify
  • [Eventfd]
  • [Eventpoll]
  • [Timerfd]

Bunlar pokemon en zor türüdür ve görünür lsof'ın TYPEolarak sütun a_inode(belgelenmemiş lsofadam sayfası ).

İçeri girmeyecekler lsof +f -- /dev/<device>, bu yüzden yapmanız gerekenler:

lsof | grep a_inode

İsimsiz inode'ları tutan öldürme işlemleri için, bakınız: Mevcut inotify saatlerini listeleyiniz (yol adı, PID) .


1

NFS'nin bağlantısını kesecek bir dizine erişip erişmediğini kontrol etme sorusu hala cevapsız.

Elimde sadece bu var:

Nfsd'nin çalışıp çalışmadığını kontrol edin:

pidof nfsd

Bağlı dizinleri istemciler tarafından göster:

showmount -a

ve showmountw / o argümanları, çevrimdışı olsalar bile yalnızca müşteri ana bilgisayarlarını gösterir. Bunun NFS'nin özel bir davranışı olduğunu varsayıyorum.


1

Benim için mesele, bir kereden fazla oturum açmam (ssh aracılığıyla) ve girişlerden birinde, komut satırında pwd'nin bağlama noktasına bağlı bir klasörün içinde bulunduğu bir komut istemindeydim.

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.