İlk olarak, bazı efsaneleri ortadan kaldıralım.
atomik olduğu için tutarsızlıklar olamaz
Bir dosyayı aynı dosya sistemi (yani rename
) sistem çağrısı içinde taşımak, yazılım ortamına göre atomiktir . Atomisite, dosyayı arayan herhangi bir işlemin eski konumunda veya yeni konumunda göreceği anlamına gelir; hiçbir işlem, dosyanın farklı bir bağlantı sayısına sahip olduğunu veya dosyanın hedef dizinde bulunduktan sonra kaynak dizinde bulunduğunu veya dosyanın kaynakta bulunmadığında hedef dizinde bulunmadığını gözlemleyemez. dizin.
Ancak, sistem bir hata, disk hatası veya güç kaybı nedeniyle çökerse, taşıma sisteminin yarı yarıya bırakılmamasına rağmen, dosya sisteminin tutarlı bir durumda bırakıldığının garantisi yoktur. Linux genel olarak donanım olaylarıyla ilgili olarak atomiklik garantisi vermez.
ilk önce dir girdisini yeni dizine kopyalayıp daha sonra önceki dizindeki girdiyi sildiğinizde, iki kez başvurulan bir dosyaya sahip olmanın tutarsızlığına sahip olabilirsiniz, ancak ref sayısı 1'dir.
Bu belirli bir uygulama tekniğini ifade eder. Başkaları da var.
Öyle ki Linux'ta ext2 (çekirdek 3.16'dan itibaren) bu belirli tekniği kullanır. Ancak bu, disk içeriğinin [eski konum] → [her iki konum] → [yeni konum] dizisinden geçtiğini göstermez, çünkü iki işlem (yeni girdi ekle, eski girişi kaldır) donanım düzeyinde de atomik değildir : dosya sistemini tutarsız bir durumda bırakarak bunlardan birinin kesintiye uğraması mümkündür. (Umarım fsck tamir eder.) Ayrıca blok katmanı yeniden sıralayabilir, böylece ilk yarı çökmeden hemen önce diske işlenebilir ve ikinci yarı gerçekleştirilemezdi.
Referans sayısının, sistem çökmediği sürece (yukarıya bakın) asla 1'den farklı olduğu gözlenmeyecektir, ancak bu garanti bir sistem çökmesine kadar uzanmaz.
önce işaretçiyi siler ve sonra işaretçinin kopyalanması, dosyanın referans 0 olması
Bir kez daha, bu belirli bir uygulama tekniğini ifade eder. Sistem çökmezse sarkan bir dosya gözlemlenemez, ancak en azından bazı yapılandırmalarda sistem çökmesinin olası bir sonucudur.
Göre Alexander Larsson tarafından bir blog yayınında , ext2 bir sistem çökmesi üzerine tutarlılık garanti verir, ama ext3 yapar data=ordered
modu. (Bu blog gönderisinin rename
kendisiyle ilgili olmadığını , bir dosyaya yazma ve rename
o dosyayı çağırmanın birleşimi olduğunu unutmayın.)
Ext2, ext3 ve ext4 dosya sistemlerinin baş yazarı Theodore Ts'o da aynı konuda bir blog yazısı yazdı . Bu blog yazısı atomisitesi (sadece yazılım ortamına göre) ve dayanıklılığı (çökmelere karşı atomisite artı bir taahhüt garantisi, yani işlemin gerçekleştirildiğini bilmek ) tartışır . Ne yazık ki atom kazaları hakkında tek başına çökmelere ilişkin bilgi bulamıyorum. Ancak ext4 için verilen dayanıklılık garantilerinin rename
atomik olması gerekir. Ext4'ün için çekirdek belgeleri devletlerle ext4 olduğu auto_da_alloc
gibi ext4 (modern çekirdeklerinde varsayılan) seçeneği, bir bir dayanıklılık garantisi sağlayan write
a, ardındanrename
rename
donanım çökmelerinde atomik olduğunu gösterir.
Btrfs için, bir rename
varolan dosyanın üzerine yazar olduğunu çöker göre atomik olması sağlanır, ancak bir rename
bir dosyanın üzerine etmediğini de dosya veya varolan iki dosyada da neden olabilir.
Özetle, sorunuzun cevabı, ext2'deki çökmelere göre sadece atomik olmayan bir dosyayı taşımakla kalmıyor, aynı zamanda dosyayı tutarlı bir durumda bırakması bile garanti fsck
edilmiyor (tamir edilemeyen arızalar nadir olsa da) - hemen hemen hiçbir şey yoktur, bu yüzden daha iyi dosya sistemleri icat edilmiştir. Ext3, ext4 ve btrfs sınırlı garantiler sağlar.
rename
atomik olduğunu garanti ettiğini düşünüyorum , ancak btrfs wiki'ye göre değil (cevabıma bakın). Dergi olmadan atomikliği garanti etmek de mümkündür (Linux'ta örnekleri bilmiyorum ama bazıları olabilir). Ext2 hakkında güvenilir bilginiz var mı?