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:
- Semua data yang tertunda telah ditulis ke disk
- Semua upaya menulis di masa mendatang akan gagal
- 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:
- Gandakan titik mount sementara
mount -o bind /media/hdd /mntuntuk ke lokasi lain
- 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:
- Namespace asli disembunyikan (tidak ada lagi file yang dapat dibuka, masalahnya tidak menjadi lebih buruk)
- 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.