Meşgul bir cihazın bağlantısı nasıl kaldırılır


246

Her gün birden fazla kullanıcı tarafından erişilen bazı samba sürücülerim var. Zaten paylaşılan sürücüleri (SQL tablosundan) tanımak ve tüm kullanıcıların erişebileceği özel bir dizine monte etmek için kod var.

SQL tablomdan bir sürücüyü kaldırırsam (etkin bir şekilde çevrimdışı duruma getirme) nasıl, hatta meşgul bir cihazın bağlantısını kesmenin bir yolu olduğunu bilmek isterim? Şimdiye kadar herhangi bir umountşekilde çalışmadığını gördüm .

Veri yok etme olasılığını yok saymak - şu anda okunmakta olan bir cihazın bağlantısını kesmek mümkün mü?


3
Arızalı miktarın
Ole Tange

2
Merhaba, muhtemelen cddir monte edilmiş, daha sonra root oldunuz veya tekrar giriş yaptıktan sonra diğer kabuk tuzağa düşürüldü. Do exitbütün kabuklar üzerine.
Smeterlink

Yanıtlar:


458

EVET!! Meşgul bir cihazı hemen ayırmanın bir yolu vardır (meşgul olsa ve zorla çıkarılamıyor olsa bile). Hepsini daha sonra temizleyebilirsiniz:

umount -l /PATH/OF/BUSY-DEVICE
umount -f /PATH/OF/BUSY-NFS(NETWORK-FILE-SYSTEM)

NOT:

  1. Bu komutlar çalışan bir işlemi bozabilir, veri kaybına veya bozuk açık dosyalara neden olabilir. Hedef DEVICE / NFS dosyalarına erişen programlar hata verebilir veya YA DA zorla çıkarıldıktan sonra düzgün çalışmayabilir.
  2. Takılı Klasör / Sürücü / Aygıt içinde DEĞİLSE bu komutları çalıştırmayı deneyin.

22
Not: -lişte küçük harf L("tembel sökme" için). ( Bu ilgili cevaba bakınız .)
ジ ョ ー ジ

4
Çalışmış. Bir nüans, FTP istemcisi aracılığıyla oturum açtıysanız, klasörü başarıyla çıkarmak için oturumu kapatmanız gerekir.
Alexander Kim

Çalışmıyorlar. İkisi de sonsuza dek takılıyor. (Debian 8, cifs-utils 2: 6.4-1)
Hubro


1
Korkutucu gibi. Tembel-monte edilmemiş sonra diğer bazı süreçler hala erişirken yeniden monte. Yani sanırım sonunda iki kez aynı yere mi monte ettim? Bunun ne yaptığından emin değilim.
sudo

120

Mümkünse, süreci meşgul edip tespit edelim, süreci öldürelim ve ardından hasarı en aza indirmek için samba paylaşımını sökelim.

  • lsof | grep '<mountpoint of /dev/sda1>' (veya takılı cihaz ne olursa olsun)

  • pkill target_process(meşgul işlemi adıyla öldürür | kill PID| killall target_process)

  • umount /dev/sda1 (veya takılı cihaz ne olursa olsun)


6
Bu hiçbir şey döndürmez. Ben onun bir ağ sürücüsü çünkü ben varsayıyorum ve sürücüye erişen diğer bilgisayarların süreçlerini göremiyorum. "Kaynaştırıcı" komutlarıyla aynı anlaşma.
Maksimum

oh cehennem ... samba komutlarına ihtiyacın var ... / usr / bin / smbclient service <parola>: Bakalım başlasın mı ... tldp.org/HOWTO/SMB-HOWTO-8.html
Frank Tudor

2
Smb komutları aslında kullanımdan kaldırıldı ve "umount.cifs" ile değiştirildi. Ben meşgul iken umount mümkün değil sıkışmış gibi görünüyor.
Maksimum

Asuswrt-Merlin kullanıyorsanız, aşağıdakileri kurmanız gerekir lsof:# opkg install lsof
Tonatio

1
bazı sonuçlar almak için sudo lsof gerekir
aheigins

78

Takılmaya çalışırken hala takılı aygıtta olmadığınızdan emin olun.


4
Tam olarak, sadece mevcut klasörün (hedef cihazda bulunan) terminalinizde açılması (örneğin cd komutu ile), unmnounting işlemini durdurmak için yeterli :)
jave.web

2
Evet, cihazdaki bir dizinde çalışan bir kabuğum vardı. Terminal penceresi ve voila kapalı
SH78

Ayrıca, denemek istediğinizin içinde başka bağlama noktalarının olmadığından emin olun umount.
zafer

@victe Teşekkürler; Pfexec mount -F vboxfs carpetacompartida ~ / Solaris 11 Belgeler kullanarak bir klasöre dökülüyordu; ancak Belgelerin alt klasörleri vardı ve sorun buydu.
Dani Aya

44

Aşağıdakileri deneyin, ancak çalıştırmadan önce bayrağın cihazı meşgul eden çalışan işlemleri öldüreceğini unutmayın -k.

-iBayrak markaları fuseröldürmeden önce sor.

fuser -kim /address  # kill any processes accessing file
unmount /address

5
lsof | grep '/dev/<my-device>hiçbir şey iade etmedi, ama bu harika çalışıyor! fuser -m /dev/<my-device>İşlemi öldürmeden önce öğrenmek istemeniz durumunda da önermek isteyebilirsiniz.
modulitos

3
Kaynaştırıcı komutunu çalıştırmak beni VPS'den hemen ayırdı.
giorgio79

21

Önlemek umount -l

Yazma sırasında, en çok oy alan cevap kullanılmasını önerir umount -l.

umount -ltehlikeli veya en iyi ihtimalle güvensizdir . Özetle:

  • Aslında cihazın bağlantısını kesmez, sadece dosya sistemini ad alanından kaldırır. Dosya açma yazma işlemine devam edilebilir.
  • Btrfs dosya sistemi bozulmasına neden olabilir

Geçici çözüm / alternatif

Kullanışlı davranışı umount -l, dosya sistemini mutlak erişimden gizlemektir. yol adları ile erişmesini engellemek ve böylece daha fazla nokta noktası kullanımını en aza indirmektir.

Aynı davranış, izinleri olan boş bir dizin bağlayarak da gerçekleştirilebilir 000 bağlayarak da gerçekleştirilebilir.

Daha sonra, bağlama noktasının altındaki dosya adlarına yeni erişim, yeni yerleştirilmiş dizine sıfır izinle vurur - bu nedenle, çıkarılan yeni engelleyiciler engellenir.

İlk önce remount,ro

Kilidi açılacak en büyük sökme başarısı salt okunur remoldur. Eğer kazanmak zaman remount,rorozeti, bunu biliyor:

  1. Bekleyen tüm veriler diske yazıldı
  2. Gelecekteki tüm yazma girişimleri başarısız olur
  3. Cihazın fiziksel olarak bağlantısını kesmeniz gerekiyorsa veriler tutarlı bir durumdadır.

mount -o remount,ro /dev/device yazma için açık dosyalar varsa başarısız olacağı garanti edilir , bu yüzden hemen deneyin. Kendini şanslı hissediyorsun, punk!

Şanssızsanız, yalnızca yazmaya açık dosyaları olan işlemlere odaklanın :

lsof +f -- /dev/<devicename> | awk 'NR==1 || $4~/[0-9]+[uw -]/'

Ardından, cihazı salt okunur olarak yeniden monte edebilmeniz ve tutarlı bir durum sağlayabilmeniz gerekir.

Bu noktada salt okunur yeniden bağlayamıyorsanız, burada listelenen diğer olası nedenlerden bazılarını araştırın .

Salt okunur yeniden bağlama başarısı kilidi 🔓☑

Tebrikler, bağlama noktasındaki verileriniz artık tutarlı ve gelecekteki yazılardan korunuyor.

Neden fuserdaha düşüklsof

Neden fuserdaha önce kullanmıyorsunuz ? Eh, sahip olabilirsiniz, ancak bir aygıtfuser üzerinde değil, bir dizin üzerinde çalışır , bu nedenle bağlama noktasını dosya adı alanından kaldırmak ve hala kullanmak istiyorsanız, şunları yapmanız gerekir:fuser

  1. Bağlantı noktasını geçici mount -o bind /media/hdd /mntolarak başka bir konuma kopyalayın
  2. Orijinal bağlama noktasını gizleyin ve ad alanını engelleyin:

Bunu nasıl yapacağınız aşağıda açıklanmıştır:

null_dir=$(sudo mktemp --directory --tmpdir empty.XXXXX")
sudo chmod 000 "$null_dir"

# A request to remount,ro will fail on a `-o bind,ro` duplicate if there are
# still files open for writing on the original as each mounted instance is
# checked.  https://unix.stackexchange.com/a/386570/143394
# So, avoid remount, and bind mount instead:
sudo mount -o bind,ro "$original" "$original_duplicate"

# Don't propagate/mirror the empty directory just about hide the original
sudo mount --make-private "$original_duplicate"

# Hide the original mountpoint
sudo mount -o bind,ro "$null_dir" "$original"

Daha sonra sahip olacaksınız:

  1. Orijinal ad alanı gizlendi (başka dosya açılamadı, sorun daha kötüye gidemez)
  2. Çalıştırılacağı yinelenen bağlanan bir dizin (bir aygıtın aksine) fuser.

Bu daha kıvrımlıdır [1] , ancak şunları kullanmanızı sağlar:

fuser -vmMkiw <mountpoint>

bu da etkileşimli olarak süreçleri yazmaya açık dosyalar ile öldürmeyi isteyecektir. Tabii ki, bunu montaj noktasını gizlemeden yapabilirsiniz, ancak yukarıdaki taklit eder.umount -l tehlikeler olmadan eder.

-wAnahtar süreçlerini yazmaya kısıtlar ve -ibunu daha sonra kullanabileceği bir acele iseniz, salt okuma yeniden bağlama böylece sonra interaktif:

fuser -vmMk <mountpoint>

bağlama noktasının altında kalan dosyalarla tüm kalan işlemleri öldürmek.

Umarım bu noktada, cihazın bağlantısını kesebilirsiniz. ( umountBir modu bağlarsanız bağlama noktasında iki kez koşmanız gerekir000 dizini .)

Veya kullan:

fuser -vmMki <mountpoint>

bağlantısını keserek geri kalan salt okunur işlemleri etkileşimli olarak öldürmek.

Lanet olsun, hala alıyorum target is busy !

Açık dosyalar tek sökme engelleyici değildir. Buraya ve buraya bakınDiğer nedenler ve çözümleri için .

Cihazın bağlantısını tamamen kesmenizi engelleyen gizli bir gremlin olsa bile, en azından dosya sisteminizi tutarlı bir durumda tuttunuz.

Daha sonra lsof +f -- /dev/device, dosya sistemini içeren aygıtta açık dosyaları olan tüm işlemleri listelemek ve sonra bunları öldürmek için kullanabilirsiniz.


[1] Kullanmak daha az kıvrımlıdır mount --move, ancak bunun mount --make-private /parent-mount-pointsonuçları olan gerektirir . Temel olarak, bağlama noktası /dosya sisteminin altına monte edilirse, bundan kaçınmak istersiniz.


1
Eğer --lazybu kadar tehlikeli ise, neden umountman sayfasında bir uyarı kadar fazla yok ? Tek söylediği " Tembel bağlantıyı kesmek. Dosya sistemini şimdi dosya hiyerarşisinden ayırın ve artık meşgul olmadığında bu dosya sistemine yapılan tüm referansları temizleyin. "
bitinerant

7

Exportfs -v ile dışa aktarılan NFS dosya sistemlerini kontrol edin. Bulunursa exportfs -d share: / diziniyle kaldırın. Bunlar kaynaştırıcı / lsof listesinde görünmüyor ve umount'un başarılı olmasını engelleyebilir.


1
Bu tavsiye için teşekkürler. Kilidi kaldırmak için exportfs -ua kullanmak zorunda kaldım.
FuePi

6

Çıkış umount2:

Linux 2.1.116, umount () gibi bir hedefin bağlantısını kesen, ancak işlemin davranışını kontrol eden ek bayraklara izin veren umount2 () sistem çağrısını ekledi:

MNT_FORCE (Linux 2.1.116'dan beri) Meşgul olsa bile bağlantısını kesmeye zorlayın. (Yalnızca NFS montajları için.) MNT_DETACH (Linux 2.4.11'den bu yana) Tembel bir bağlantı kesme işlemi gerçekleştirin: yeni erişim için bağlama noktasını kullanılamaz duruma getirin ve bağlantı noktası meşgul olduğunda bağlantıyı kaldırma işlemini gerçekleştirin. MNT_EXPIRE (Linux 2.6.8'den beri) Bağlama noktasını süresi doldu olarak işaretleyin. Bir bağlama noktası şu anda kullanımda değilse, bu işaretli bir umount2 () çağrısı EAGAIN hatasıyla başarısız olur, ancak bağlama noktasını süresi dolmuş olarak işaretler. Bağlama noktasının süresi, herhangi bir işlem tarafından erişilmediği sürece geçerliliğini korur. MNT_EXPIRE değerini belirten ikinci bir umount2 () çağrısı, süresi dolmuş bir bağlama noktasını kaldırır. Bu bayrak MNT_FORCE veya MNT_DETACH ile belirtilemez. Geri dönüş değeri

Başarı durumunda sıfır döndürülür. Hata durumunda -1 döndürülür ve errno uygun şekilde ayarlanır.


Neyse ki bunlar NFS montajı değil, CIFS. Ben MNT_DETACH olsa çalışacağız. Ancak umount -l işe yaramazsa bunun çok farklı olacağını düşünemiyorum. Yine de teşekkürler!
Maksimum

2

Birisi terminal kullanıyorsanız ve geçerli dizininizin bağlantısını kesmek istediğiniz yolun içindeyse, hatayı alacağınızdan bahsetmiştir.
Tamamlayıcı olarak, bu durumda, lsof | grep path-to-be-unmountedaşağıdaki çıktıya sahip olmalısınız:

bash ... path-to-be-unmounted

1

Bir şey işe yaradığında başka bir alternatif, düzenleme /etc/fstab, eklemenoauto bayrak ve makineyi yeniden başlatmadır. Cihaz takılmayacak ve her şeyi bitirdiğinizde bayrağı kaldırın ve yeniden başlatın.


0

Niş Cevap:

Bu cihazda bir zfs havuzunuz varsa, en azından dosya tabanlı bir havuz olduğunda, lsofkullanımı gösterilmez. Ama sadece koşabilirsin

sudo zpool export mypoo

ve sonra bağlantısını kesin.

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.