Mengapa MNT_DETACH malas atau `umount -l` tidak aman / berbahaya?

10

Saya telah membaca di beberapa tempat yang umount -ltidak aman:

Di dalam sebuah jawaban oleh @cas :

tidak menggunakan umount's --lazypilihan jika Anda peduli ketika drive eksternal dapat dengan aman dicabut

Komentar dari @frostschutz :

umount --lazytidak aman dan tidak bisa dibuat aman. [...]

Ini util-linux komentar oleh Ruediger Meier :

Anda harus menghindari penggunaan umount -lsama sekali. Cukup bunuh semua proses yang menggunakan /tmp/mountpointlalu umount tanpa opsi -l.

Mengapa umount -ltidak aman / berbahaya?

Apakah ada cara untuk membuatnya aman?

Tom Hale
sumber

Jawaban:

12

Unmount yang malas menciptakan mount kucing Schrödinger

  • Anda tidak dapat mengetahui apakah perangkat ini benar-benar dilepas atau tidak
  • Sistem file "unmount" tetap dapat diakses dalam beberapa keadaan
  • Sistem file "unmount" tidak dapat diakses dalam beberapa keadaan

Ada rasa aman yang keliru : tampaknya sistem file telah di-unmount, tetapi pada kenyataannya itu hanya disembunyikan dari file namespace / heirarchy.

  • Proses masih dapat menulis melalui deskriptor file terbuka
  • File baru atau yang sudah ada dapat dibuka untuk ditulis oleh proses dengan direktori yang berfungsi di dalam mountpoint melalui nama path relatif

Ini berarti bahwa jika Anda umount -l /media/hddtidak dapat lagi mengakses /media/hdd/dir/file(pathname absolut) tetapi jika Anda memiliki proses dengan direktori kerja, /media/hddia masih dapat membuat proses baru yang dapat membaca / menulis ./dir/file(relatif pathname).

Jika Anda mencoba melepas perangkat, Anda akan mendapat pesan yang membingungkan:

# umount --force --all-targets /dev/sdb2
umount: /dev/sdb2: not mounted

Ini membuatnya tampak seperti perangkat telah diurungkan, tetapi masih ada proses menulis ke disk.

Karena ada berbagai situasi yang tidak jelas yang dapat menyebabkan umount diblokir , sistem file mungkin masih belum dilepas meskipun lsof +f -- /dev/devicetidak menunjukkan apa-apa.

Anda tidak akan pernah tahu apakah sistem file benar-benar dilepas. Tidak ada cara untuk mengetahuinya.

Perangkat yang dapat dilepas

Jika Anda melakukan umount -lremovable disk, Anda berada di daratan: Anda tidak dapat memastikan bahwa semua data yang tertunda telah ditulis ke disk.

Yang terbaik yang dapat Anda lakukan setelah a umount -ladalah untuk memastikan semua penulisan selesai dan mencegah penulisan di masa depan , tetapi Anda masih tidak dapat menjamin bahwa itu telah dilepas.

Dengan perangkat yang dapat dilepas, jika perangkat tidak terpasang dengan benar, perilaku aneh dapat terjadi saat berikutnya dicolokkan:

  • Perangkat akan mendapatkan nama perangkat yang ditambahkan, yaitu /dev/sdbmenjadi /dev/sdc. Pesan-pesan log kernel mungkin masih merujuk /dev/sdbmeskipun perangkat itu tidak ada lagi sebagai file di bawah /dev. (Satu-satunya cara saya tahu untuk menyelesaikan ini adalah reboot.)

  • korupsi btrf dapat terjadi. btrfs mengharapkan bahwa hanya satu sistem file dengan UUID yang diberikan hadir pada satu waktu. Kernel masih melihat UUID yang sama yang tersedia pada perangkat phantom dan perangkat baru. (Saya harus membangun kembali HDD cadangan btrfs saya).

systemd Gotchas

Tom Hale
sumber
"File baru atau yang sudah ada dapat dibuka untuk menulis dengan proses dengan direktori yang berfungsi di dalam mountpoint melalui nama path relatif" Ini adalah informasi yang saya cari. Apakah Anda memiliki tautan atau referensi tambahan?
Jonathon Reinhart
@Jonathon periksa man umount. Saya perlu ke google sebaliknya. Silakan kirim temuan Anda jika Anda melakukan ini.
Tom Hale
Saya sudah membaca umount(2)beberapa kali baru-baru ini. Dikatakan hanya "Lakukan unmount malas: membuat titik mount tidak tersedia untuk akses baru, segera lepaskan sistem file dan semua sistem file yang dipasang di bawah satu sama lain dan dari tabel mount, dan benar-benar melakukan unmount ketika titik mount berhenti sibuk. . " Namun sayangnya ini kurang detail bahkan dari apa yang Anda berikan.
Jonathon Reinhart
umount(8)mengatakan bahwa sistem file sedang sibuk "misalnya, ketika ada file yang terbuka di atasnya, atau ketika beberapa proses memiliki direktori kerjanya di sana, atau ketika file swap di dalamnya sedang digunakan." Itu kedengarannya bukan daftar yang pasti, tetapi mungkin sebaik yang bisa saya temukan.
Jonathon Reinhart
Saya sedikit menguraikan apa yang Anda katakan, dan menambahkan beberapa contoh lain dalam jawaban ini . Terima kasih untuk informasi!
Jonathon Reinhart