Pertama, mari kita singkirkan beberapa mitos.
itu atomik sehingga inkonsistensi tidak bisa terjadi
Memindahkan file di dalam filesystem yang sama (yaitu rename
) system call adalah atom terhadap lingkungan perangkat lunak. Atomicity berarti bahwa setiap proses yang mencari file akan melihatnya di lokasi yang lama atau di lokasi yang baru; tidak ada proses yang dapat mengamati bahwa file memiliki jumlah tautan yang berbeda, atau bahwa file tersebut ada di direktori sumber setelah ada di direktori tujuan, atau bahwa file tersebut tidak ada di direktori target setelah tidak ada di sumber direktori.
Namun, jika sistem macet karena bug, kesalahan disk atau kehilangan daya, tidak ada jaminan bahwa sistem file dibiarkan dalam keadaan konsisten, apalagi bahwa langkah tersebut tidak dibiarkan setengah jadi. Linux secara umum tidak menawarkan jaminan atomicity sehubungan dengan peristiwa perangkat keras.
pertama Anda menyalin entri dir di dir baru dan kemudian menghapus entri pada dir sebelumnya, sehingga Anda mungkin memiliki inkonsistensi memiliki file yang direferensikan dua kali, tetapi jumlah ref adalah 1
Ini mengacu pada teknik implementasi spesifik. Ada yang lain.
Kebetulan ext2 di Linux (pada kernel 3.16) menggunakan teknik khusus ini. Namun, ini tidak menyiratkan bahwa konten disk melewati urutan [lokasi lama] → [kedua lokasi] → [lokasi baru], karena dua operasi (menambah entri baru, menghapus entri lama) tidak atom pada tingkat perangkat keras baik : ada kemungkinan salah satu dari mereka terganggu, meninggalkan sistem file dalam keadaan tidak konsisten. (Semoga fsck akan memperbaikinya.) Selanjutnya lapisan blok dapat menyusun ulang penulisan, sehingga babak pertama dapat dilakukan ke disk tepat sebelum crash dan babak kedua tidak akan dilakukan.
Jumlah referensi tidak akan pernah diamati berbeda dari 1 selama sistem tidak crash (lihat di atas) tetapi jaminan itu tidak meluas ke crash sistem.
pertama-tama menghapus pointer dan kemudian menyalin pointer sehingga ketidakkonsistenan adalah bahwa file tersebut memiliki referensi 0
Sekali lagi, ini mengacu pada teknik implementasi tertentu. File yang menggantung tidak dapat diamati jika sistem tidak macet, tetapi kemungkinan konsekuensi dari sistem macet, setidaknya dalam beberapa konfigurasi.
Menurut posting blog oleh Alexander Larsson , ext2 tidak memberikan jaminan konsistensi pada sistem crash, tetapi ext3 tidak dalam data=ordered
mode. (Perhatikan bahwa posting blog ini bukan tentang rename
dirinya sendiri, tetapi tentang kombinasi penulisan ke file dan memanggil rename
file itu.)
Theodore Ts'o, penulis utama sistem file ext2, ext3 dan ext4, menulis posting blog tentang masalah yang sama . Posting blog ini membahas atomicity (hanya berkenaan dengan lingkungan perangkat lunak) dan daya tahan (yang merupakan atomicity sehubungan dengan crash plus jaminan komitmen, yaitu mengetahui bahwa operasi telah dilakukan). Sayangnya saya tidak dapat menemukan informasi tentang atomicity sehubungan dengan crash saja. Namun, jaminan daya tahan yang diberikan untuk ext4 mengharuskannya rename
bersifat atomik. Dokumentasi kernel untuk ext4 menyatakan bahwa ext4 dengan auto_da_alloc
opsi (yang merupakan default di kernel modern), serta ext4, memberikan jaminan daya tahan untuk write
diikuti olehrename
, Yang menyiratkan bahwa itu rename
adalah atom sehubungan dengan crash perangkat keras.
Untuk Btrfs, sebuah rename
yang menimpa file yang sudah ada dijamin akan atom sehubungan dengan crash, tapi sebuah rename
yang tidak menimpa file dapat mengakibatkan tidak file atau kedua file yang ada.
Singkatnya, jawaban atas pertanyaan Anda adalah bahwa tidak hanya memindahkan file bukan atom sehubungan dengan crash pada ext2, tetapi bahkan tidak dijamin untuk meninggalkan file dalam keadaan konsisten (meskipun kegagalan yang fsck
tidak dapat memperbaiki jarang terjadi) - tidak ada apa-apa, itulah sebabnya sistem file yang lebih baik telah ditemukan. Ext3, ext4 dan btrf memang memberikan jaminan terbatas.
rename
atom, tetapi btrfs tidak sesuai dengan wiki (lihat jawaban saya). Mungkin juga untuk menjamin keaslian tanpa jurnal (saya tidak tahu contoh di Linux tetapi mungkin ada beberapa). Apakah Anda memiliki informasi tepercaya tentang ext2?Pertanyaan ini ditanyakan dengan sedikit berbeda pada Super User. Halaman Wikipedia pada
mv
perintah juga menjelaskannya dengan cukup baik:Linux memiliki nama syscall dan karenanya akan mengubah nama file sebagai operasi atom, yaitu tidak terputus. Jadi tidak, sistem file tidak dapat menjadi tidak konsisten dalam situasi yang Anda jelaskan.
sumber
rename
system call tidak dapat menghasilkan filesystem menjadi dalam keadaan tidak konsisten bahkan jika ada kegagalan daya. Saya merasa ini adalah inti dari pertanyaan @ graphtheory92.