Menghindari umount -l
Pada saat penulisan, jawaban terpilih merekomendasikan penggunaan umount -l
.
umount -l
berbahaya 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 -l
menyembunyikan 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 000
atas 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,ro
lencana, 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 fuser
kalah denganlsof
Mengapa tidak menggunakan yang fuser
tadi? Yah, Anda bisa saja, tetapi fuser
beroperasi 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 /mnt
untuk 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 -w
beralih Membatasi menulis proses, dan -i
interaktif, 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 umount
pada mountpoint dua kali jika Anda telah memasang 000
direktori 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/device
untuk 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-point
implikasi . Pada dasarnya, jika mountpoint dipasang di bawah sistem /
file, Anda ingin menghindari ini.