Perangkat Sibuk di Umount

41

Saya sering mengalami masalah untuk melakukan umount direktori:

umount / mnt / dir
umount: / mnt / dir: perangkat sedang sibuk

Ada banyak alasan mengapa perangkat ini sibuk. Kadang-kadang ada proses yang berjalan yang memiliki kunci terbuka di atasnya, kadang-kadang ada direktori lain yang dipasang di atas /mnt/dir.

Pertanyaan saya:

Apa langkah-langkah untuk memeriksa mengapa direktori tidak dapat dilepas.

Saya tahu ada banyak alasan, tetapi tidak masalah jika Anda menjelaskan solusi spesifik.

[EDIT]

[X] menjalankan proses pada volume yang terpasang.
[X] volume lain dipasang di atas volume yang ingin kita lepas
[N] NFS mengunci volume yang ingin kita lepas


sumber

Jawaban:

76

Cara untuk mengeceknya adalah fuser -vm /mnt/dir, yang harus dijalankan sebagai root. Ini akan memberi tahu Anda proses mana yang mengakses titik pemasangan.

Alternatifnya adalah lsof /mnt/dir, yang akan menampilkan setiap file yang terbuka di mount. Sekali lagi terbaik jalankan sebagai root.

Anda dapat menjalankan semua ini sebagai non-root, tetapi kemudian output akan terbatas pada proses Anda — yang dari pengguna lain hanya akan diam-diam tidak ditampilkan, meskipun mereka akan mencegah unmount sistem file.

Contoh:

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

Kolom "akses" memberi tahu Anda cara mengaksesnya. Dalam hal ini, kernel menggunakannya sebagai mount (ya, tetapi unmount akan baik-baik saja hanya dengan ini). bashmemilikinya sebagai direktori kerja saat ini (harus ke cddirektori yang berbeda sebelum unmount) dan gvim keduanya memiliki direktori saat ini dan memiliki file yang terbuka (harus menutup gvim itu).

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)

Dalam output ini, Anda dapat melihat direktori saat ini untuk bash dan gvim (sebagai tipe DIR). Anda juga dapat melihat file gvim mana yang terbuka untuk ditulis.

Cara memaksa masalah:

fusermemiliki -kopsi yang akan mengirim sinyal (default:) SIGKILLke setiap proses menggunakan mount. Ini adalah cara yang agak kuat untuk menghentikan gunung agar tidak sibuk. (Dan tentu saja, berhati-hatilah dengan apa yang kamu SIGKILL!)

umountmemiliki -lopsi untuk melakukan unmount malas. Mount akan dihapus dari namespace filesystem (jadi Anda tidak akan melihatnya di bawah /mnt/Zia/src, dalam contoh) tetapi tetap terpasang, sehingga program yang mengaksesnya dapat terus melakukannya. Ketika program terakhir yang mengaksesnya keluar, unmount akan benar-benar terjadi.

Ada satu penyebab final yang bisa diperbaiki dari unmount gagal, dan itu adalah server NFS turun. Di sini Anda dapat menggunakan umount -f, tetapi Anda berisiko kehilangan data jika melakukannya. (Klien mungkin telah membuat cache penulisan yang belum dikonfirmasi oleh server, dan penulisan itu akan dibuang. Aplikasi, bagaimanapun, telah diberitahu bahwa penulisan berhasil.)

derobert
sumber
4
Perhatikan bahwa fuser -kadalah sangat berisiko, karena Anda akan melakukannya sebagai root dan jika Anda tidak sangat yakin yang proses akan membunuh Anda dapat melakukan kerusakan benar-benar spektakuler dengan perintah ceroboh ...
Shadur
1
@ Shadur, semoga Anda sudah menjalankannya tanpa -kopsi, jadi Anda akan tahu proses mana yang akan Anda bunuh. Tapi saya akan menambahkan peringatan.
derobert
1
fuser -vmmenunjukkan "kernel mount". harus melakukan systemctl stop opt.mountalih - alih manual umount.
lkraav
2
Untuk beberapa alasan umount -f tidak bekerja untuk saya tetapi menjalankan umount -l bekerja dengan sempurna.
Firze
Terima kasih atas catatan tentang umount -fdan NFS. Masalah saya terkait NFS di mana mesin dev saya mengubah IP dan saya tidak bisa menghapus bagiannya.
Eric
19

Kamu harus menggunakan:

sudo umount -l <path>
Felipe
sumber
7
⁺¹, aku tidak tahu orang bodoh apa yang bisa menurunkannya. Ini -ladalah opsi yang tepat untuk digunakan ketika bahkan -ftidak berfungsi.
Hi-Angel
@ Hai-Malaikat Karena ini bukan yang diminta OP?
xhienne
@xheinne stack exchange bukan hanya tentang menjawab pertanyaan seperti bot yang bodoh, jawaban ini sangat membantu. banyak orang datang dari pencarian google juga. Saya pribadi menemukan ini bermanfaat. Op harus menerima jawaban yang menurutnya relevan, itulah sebabnya tombol terima ada di sana.
user1735921
6

Volume lain dipasang di atas volume yang ingin kami lepas:

The mountperintah memungkinkan Anda tahu semua terpasang volume jika invoqued tanpa argumen atau pilihan (kecuali -v). Anda dapat memiliki daftar mountpoints aktif dengan menambahkan sedikit perl:

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

Kemudian, cukup ambil titik moint dari mana Anda ingin meng-unmount dan Anda akan tahu jika ada mount filesystem yang satu ini.

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

Maka Anda memiliki dua solusi . Lepaskan sistem file, atau pindahkan dengan mount --move olddir newdir(kernel> 2.5.1)

mveroone
sumber
1
Ya terima kasih. / etc / mtab dan / proc / mounts juga dimungkinkan.
Ah itu benar, saya selalu lupa itu. Katakanlah mengetik "mount" memerlukan lebih sedikit karakter (tetapi lebih banyak sumber daya untuk dieksekusi?)
mveroone
1
Saya memiliki perangkat penyimpanan USB eksternal "permanen" yang terpasang pada direktori tertentu di laptop saya, Terkadang kabel terputus karena kesalahan. Sangat merepotkan untuk memasang kembali perangkat di direktori (karena "perangkat sibuk") sampai saya membaca jawaban ini. Sekarang saya diketahui menggunakan mount --move olddir newdir. Terima kasih.
Silvio Levy
3

Buka file

Proses dengan file terbuka adalah biang keladinya. Perlihatkan mereka:

lsof +f -- <mountpoint or device>

Ada keuntungan menggunakan /dev/<device>daripada /mountpoint: mountpoint akan hilang setelah umount -l, atau mungkin disembunyikan oleh mount overlay.

fuserjuga dapat digunakan, tetapi menurut saya lsofmemiliki output yang lebih berguna. Namun fuserberguna untuk membunuh proses yang menyebabkan drama Anda sehingga Anda dapat melanjutkan hidup Anda.

Daftar file di <mountpoint>(lihat peringatan di atas):

fuser -vmM <mountpoint>

Hanya membunuh proses secara interaktif dengan file yang terbuka untuk ditulis:

fuser -vmMkiw <mountpoint>

Setelah menghitung ulang read-only ( mount -o remount,ro <mountpoint>), aman (r) untuk mematikan semua proses yang tersisa:

fuser -vmMk <mountpoint>

Mountpoints

Pelakunya bisa menjadi kernel itu sendiri. Filesystem lain yang terpasang pada filesystem yang Anda coba umountakan menyebabkan kesedihan. Periksa dengan:

mount | grep <mountpoint>/

Untuk pemasangan loopback, periksa juga output dari:

losetup -la

Inode anonim (Linux)

Inode anonim dapat dibuat oleh:

  • File sementara ( opendengan O_TMPFILE)
  • batalkan jam tangan
  • [eventfd]
  • [eventpoll]
  • [timerfd]

Ini adalah jenis yang paling sulit dipahami dari pokemon, dan muncul di lsof's TYPEkolom sebagai a_inode(yang didokumentasikan di lsofhalaman manual ).

Mereka tidak akan muncul lsof +f -- /dev/<device>, jadi Anda harus:

lsof | grep a_inode

Untuk mematikan proses yang menyimpan inode anonim, lihat: Daftar jam tangan yang tidak berizin saat ini (pathname, PID) .

Tom Hale
sumber
1

Pertanyaan bagaimana memeriksa apakah NFS mengakses direktori yang akan dilepas masih belum terjawab.

Yang saya miliki hanya ini:

Periksa apakah nfsd sedang berjalan:

pidof nfsd

Tampilkan direktori yang dipasang oleh klien:

showmount -a

dan tanpa showmountargumen hanya menunjukkan host klien meskipun tidak aktif. Saya menganggap ini adalah perilaku khusus NFS.


sumber
1

Bagi saya, masalahnya adalah saya login lebih dari satu kali (via ssh) dan pada salah satu login saya berada di command prompt di mana pwd berada di dalam folder yang lebih rendah dari mount-point.

Lonniebiz
sumber