Cara meng-unmount perangkat yang sibuk

246

Saya punya beberapa drive samba yang sedang diakses oleh banyak pengguna setiap hari. Saya sudah memiliki kode untuk mengenali drive bersama (dari tabel SQL) dan memasangnya di direktori khusus di mana semua pengguna dapat mengaksesnya.

Saya ingin tahu, jika saya menghapus drive dari tabel SQL saya (secara efektif mengambil offline) bagaimana, atau bahkan, ada cara untuk meng-unmount perangkat yang sibuk? Sejauh ini saya telah menemukan bahwa segala bentuk umounttidak berfungsi.

Mengabaikan kemungkinan menghancurkan data - apakah mungkin untuk melepas perangkat yang sedang dibaca?

Maks
sumber
3
Jawaban yang lebih umum untuk mengatasi lebih banyak penyebab kegagalan umount ditemukan di sini oletange.blogspot.dk/2012/04/umount-device-is-busy-why.html
Ole Tange
2
Halo, mungkin Anda cdme-mount dir, maka Anda menjadi root atau login lagi maka shell lainnya terperangkap. Lakukan exitpada semua kerang.
Smeterlink

Jawaban:

458

IYA!! Ada cara untuk melepaskan perangkat yang sibuk dengan segera (bahkan jika perangkat itu sibuk dan tidak dapat dilepas dengan paksa). Anda dapat membersihkan semuanya nanti:

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

CATATAN:

  1. Perintah-perintah ini dapat mengganggu proses yang sedang berjalan, menyebabkan kehilangan data, atau merusak file yang terbuka. Program yang mengakses file PERANGKAT / NFS target dapat melempar kesalahan ATAU tidak bisa berfungsi dengan baik setelah dipaksa unmount.
  2. Cobalah untuk menjalankan perintah-perintah ini ketika TIDAK di dalam folder / Drive / Perangkat yang terpasang.
Amit Verma
sumber
22
Catatan: di -lsini adalah huruf kecil L(untuk "malas unmount"). (Lihat jawaban terkait ini .)
ジ ョ ー ジ
4
Bekerja. Satu nuansa, jika Anda masuk melalui klien FTP, Anda harus keluar untuk berhasil melepas folder.
Alexander Kim
Mereka tidak bekerja. Mereka berdua hanya bertahan selamanya. (Debian 8, cifs-utils 2: 6.4-1)
Hubro
1
-lSaya --lazytidak akan merusak file yang terbuka, tetapi di Linux sepertinya Anda tidak tahu kapan perangkat ini benar-benar dilepas dan dapat dihapus
Tom Hale
1
Agak menakutkan. Saya malas-unmount kemudian remounted sementara beberapa proses lain masih mengaksesnya. Jadi saya kira saya memasangnya dua kali pada akhirnya ke lokasi yang sama? Tidak yakin apa yang terjadi.
sudo
121

Jika memungkinkan, mari cari / identifikasi proses yang sibuk, matikan prosesnya, lalu unmount share samba untuk meminimalkan kerusakan.

  • lsof | grep '<mountpoint of /dev/sda1>' (atau apa pun perangkat yang terpasang)

  • pkill target_process(membunuh proc sibuk. dengan nama | kill PID| killall target_process)

  • umount /dev/sda1 (atau apa pun perangkat yang terpasang)

Frank Tudor
sumber
6
Itu tidak mengembalikan apa pun. Saya menganggap itu karena drive jaringan dan saya tidak dapat melihat proses komputer lain mengakses drive. Kesepakatan yang sama dengan perintah "fuser".
Maks
oh sial ... Anda memerlukan perintah samba ... / usr / bin / layanan smbclient <kata sandi>: Lihat apakah ini dapat Anda mulai ... tldp.org/HOWTO/SMB-HOWTO-8.html
Frank Tudor
2
Perintah seseorang sebenarnya telah ditinggalkan dan diganti oleh "umount.cifs" .... yang juga tidak berfungsi. Tampaknya saya terjebak dengan tidak dapat melakukan umount sementara sedang sibuk.
Maks
Jika Anda menggunakan Asuswrt-Merlin, Anda harus menginstal lsof:# opkg install lsof
Tonatio
1
Anda perlu sudo lsof untuk mendapatkan beberapa hasil
aheigins
78

Pastikan Anda tidak berada di perangkat yang terpasang saat Anda mencoba melakukan umount.

Luci
sumber
4
Tepatnya, membuka folder saat ini (terdapat di perangkat target) di terminal Anda (melalui mis. Perintah cd) cukup untuk menghentikan proses unmnount :)
jave.web
2
Yap, saya memiliki shell yang berjalan di direktori di perangkat. Tutup jendela terminal dan voila
sh78
Juga, pastikan tidak ada titik pemasangan lain di dalam yang Anda coba umount.
menang
@victe Terima kasih; Saya sedang mouting folder menggunakan pfexec mount -F vboxfs carpetacompartida ~ / Documents on Solaris 11; tetapi Dokumen memiliki subfolder dan itulah masalahnya.
Dani Aya
44

Coba yang berikut, tetapi sebelum menjalankannya perhatikan bahwa -kflag akan mematikan semua proses yang sedang berjalan yang membuat perangkat sibuk.

The -imerek Bendera fusermeminta sebelum membunuh.

fuser -kim /address  # kill any processes accessing file
unmount /address
pengguna3751769
sumber
5
lsof | grep '/dev/<my-device>tidak mengembalikan apa pun, tetapi ini bekerja dengan baik! Mungkin ingin juga menyarankan fuser -m /dev/<my-device>jika Anda ingin mengetahui prosesnya sebelum mematikannya.
modulitos
3
Menjalankan perintah fuser segera memutus saya dari VPS.
giorgio79
21

Menghindari umount -l

Pada saat penulisan, jawaban terpilih merekomendasikan penggunaan umount -l.

umount -lberbahaya atau paling tidak aman . Singkatnya:

  • Sebenarnya tidak meng-unmount perangkat, itu hanya menghapus sistem file dari namespace. Menulis untuk membuka file dapat dilanjutkan.
  • Ini dapat menyebabkan kerusakan sistem file btrfs

Bekerja di sekitar / alternatif

Perilaku yang berguna dari umount -lmenyembunyikan filesystem dari akses dengan nama path absolut , sehingga meminimalkan penggunaan moutpoint lebih lanjut.

Perilaku yang sama ini dapat dicapai dengan memasang direktori kosong dengan izin di 000atas direktori yang akan dilepas.

Maka setiap akses baru ke nama file di bawah mountpoint akan mengenai direktori yang baru saja dilapis dengan izin nol - dengan demikian pemblokir baru ke unmount dicegah.

Coba dulu dulu remount,ro

Pencapaian unmount utama yang akan dibuka adalah remount hanya-baca. Saat Anda mendapatkan remount,rolencana, Anda tahu bahwa:

  1. Semua data yang tertunda telah ditulis ke disk
  2. Semua upaya menulis di masa mendatang akan gagal
  3. Data dalam keadaan konsisten, jika Anda perlu melepas perangkat secara fisik.

mount -o remount,ro /dev/device dijamin gagal jika ada file yang terbuka untuk ditulis , jadi cobalah langsung. Anda mungkin merasa beruntung, punk!

Jika Anda kurang beruntung, fokus hanya pada proses dengan file yang terbuka untuk ditulis :

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

Anda kemudian harus dapat memasang kembali perangkat hanya-baca dan memastikan kondisi yang konsisten.

Jika Anda tidak dapat me-remount read-only pada saat ini, selidiki beberapa kemungkinan penyebab lain yang tercantum di sini .

Hanya baca-pasang kembali pencapaian tidak terkunci 🔓☑

Selamat, data Anda di mountpoint sekarang konsisten dan terlindungi dari penulisan di masa mendatang.

Mengapa fuserkalah denganlsof

Mengapa tidak menggunakan yang fusertadi? Yah, Anda bisa saja, tetapi fuserberoperasi pada direktori , bukan perangkat , jadi jika Anda ingin menghapus mountpoint dari ruang nama file dan masih menggunakan fuser, Anda harus:

  1. Gandakan titik mount sementara mount -o bind /media/hdd /mntuntuk ke lokasi lain
  2. Sembunyikan titik pemasangan asli dan blokir namespace:

Begini caranya:

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"

Anda kemudian akan memiliki:

  1. Namespace asli disembunyikan (tidak ada lagi file yang dapat dibuka, masalahnya tidak menjadi lebih buruk)
  2. Direktori yang diikat bind duplikat (sebagai lawan dari perangkat) untuk dijalankan fuser.

Ini lebih berbelit-belit [1] , tetapi memungkinkan Anda untuk menggunakan:

fuser -vmMkiw <mountpoint>

yang secara interaktif akan meminta untuk menghentikan proses dengan file yang terbuka untuk ditulis. Tentu saja, Anda bisa melakukan ini tanpa menyembunyikan titik mount sama sekali, tetapi mimik di atas umount -l, tanpa ada bahaya.

The -wberalih Membatasi menulis proses, dan -iinteraktif, jadi setelah read-hanya remount, jika Anda itu terburu-buru Anda kemudian dapat menggunakan:

fuser -vmMk <mountpoint>

untuk membunuh semua proses yang tersisa dengan file yang terbuka di bawah mountpoint.

Semoga pada titik ini, Anda dapat melepas perangkat. (Anda harus menjalankan umountpada mountpoint dua kali jika Anda telah memasang 000direktori mode di atas.)

Atau gunakan:

fuser -vmMki <mountpoint>

untuk secara interaktif membunuh proses read-only yang tersisa memblokir unmount.

Sial, aku masih mengerti target is busy!

Buka file bukan satu-satunya penghambat unmount. Lihat di sini dan di sini untuk sebab lain dan obatnya.

Bahkan jika Anda memiliki beberapa gremlin bersembunyi yang mencegah Anda melepas perangkat sepenuhnya, Anda setidaknya memiliki sistem file Anda dalam keadaan konsisten.

Anda kemudian dapat menggunakan lsof +f -- /dev/deviceuntuk mendaftar semua proses dengan file terbuka di perangkat yang berisi sistem file, dan kemudian membunuh mereka.


[1] Ini tidak terlalu berbelit-belit untuk digunakan mount --move, tetapi itu membutuhkan mount --make-private /parent-mount-pointimplikasi . Pada dasarnya, jika mountpoint dipasang di bawah sistem /file, Anda ingin menghindari ini.

Tom Hale
sumber
1
Jika --lazysangat berbahaya, mengapa tidak ada peringatan di umounthalaman manual? Yang dikatakannya adalah " Malas unmount. Lepaskan filesystem dari hirarki file sekarang, dan bersihkan semua referensi ke filesystem ini segera setelah tidak sibuk lagi. "
bitinerant
7

Periksa sistem file NFS yang diekspor dengan exportfs -v. Jika ditemukan, hapus dengan direktori exportfs -d share: /. Ini tidak muncul di daftar fuser / lsof, dan dapat mencegah umount dari berhasil.

numberer6
sumber
1
Terima kasih atas saran ini. Saya harus menggunakan exportfs -ua untuk menghapus kunci.
FuePi
6

Lihat umount2:

Linux 2.1.116 menambahkan umount2 () system call, yang, seperti umount (), meng-unmount target, tetapi memungkinkan flag tambahan yang mengontrol perilaku operasi:

MNT_FORCE (sejak Linux 2.1.116) Paksa unmount bahkan jika sibuk. (Hanya untuk mount NFS.) MNT_DETACH (sejak Linux 2.4.11) Lakukan unmount malas: buat jalur mount tidak tersedia untuk akses baru, dan lakukan unmount saat mount point tidak lagi sibuk. MNT_EXPIRE (sejak Linux 2.6.8) Tandai titik mount sebagai kedaluwarsa. Jika titik mount tidak sedang digunakan, maka panggilan awal ke umount2 () dengan flag ini gagal dengan kesalahan EAGAIN, tetapi menandai titik mount sebagai kedaluwarsa. Titik pemasangan tetap kedaluwarsa selama tidak diakses oleh proses apa pun. Panggilan umount2 kedua () yang menentukan MNT_EXPIRE melepas gunung titik kadaluarsa. Bendera ini tidak dapat ditentukan dengan MNT_FORCE atau MNT_DETACH. Nilai Pengembalian

Pada kesuksesan, nol dikembalikan. Pada kesalahan, -1 dikembalikan, dan errno diatur dengan tepat.

dikunyah
sumber
Sayangnya ini bukan NFS mounts, tetapi CIFS. Saya akan mencoba MNT_DETACH. Namun jika umount -l tidak berfungsi saya tidak bisa membayangkan ini akan jauh berbeda. Terimakasih Meskipun!
Maks
2

Seseorang telah menyebutkan bahwa jika Anda menggunakan terminal dan direktori Anda saat ini berada di dalam jalur yang ingin di-unmount, Anda akan mendapatkan kesalahan.
Sebagai pelengkap, dalam hal ini, Anda lsof | grep path-to-be-unmountedharus memiliki output di bawah:

bash ... path-to-be-unmounted
Eugene
sumber
1

Alternatif lain ketika sesuatu berfungsi adalah mengedit /etc/fstab, menambahkan noautotanda dan me-reboot mesin. Perangkat tidak akan dipasang, dan ketika Anda selesai melakukan apa saja, hapus bendera dan reboot lagi.

Jesjimher
sumber
0

Niche Answer:

Jika Anda memiliki kumpulan zfs di perangkat itu, setidaknya saat kumpulan berbasis file, lsoftidak akan menunjukkan penggunaannya. Tapi Anda bisa langsung lari

sudo zpool export mypoo

dan kemudian lepaskan.

lucidbrot
sumber