Dosya taşınırken dosya sistemi kesintiye uğrarsa tutarsız hale gelebilir mi?


13

Aynı bölümde iki klasör var (EXT2) Ben mv folder1/file folder2ve bazı kesintiler oluşursa (örn. Elektrik kesintisi) dosya sistemi hiç tutarsız olabilir?

mvOperasyon atomik değil mi?

Güncelleme: Şimdiye kadar IRC'de şu perspektiflere sahibim:

  1. atomik olduğu için tutarsızlıklar olamaz
  2. 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.
  3. önce işaretçiyi siler ve sonra işaretçinin kopyalanması, dosyanın referans 0 olması

Birisi açıklığa kavuşturabilir mi?

Yanıtlar:


11

İ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=orderedmodu. (Bu blog gönderisinin renamekendisiyle ilgili olmadığını , bir dosyaya yazma ve renameo 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 renameatomik olması gerekir. Ext4'ün için çekirdek belgeleri devletlerle ext4 olduğu auto_da_allocgibi ext4 (modern çekirdeklerinde varsayılan) seçeneği, bir bir dayanıklılık garantisi sağlayan writea, ardındanrenamerenamedonanım çökmelerinde atomik olduğunu gösterir.

Btrfs için, bir renamevarolan dosyanın üzerine yazar olduğunu çöker göre atomik olması sağlanır, ancak bir renamebir 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 fsckedilmiyor (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.


13

Kesintiye pek mümkün olmakla birlikte, klasik bir dosya sistemi üzerinde kesinlikle böylece yeniden adlandırma işlemi, herhangi bir dosya sistemi üzerinde çok hızlı olabilir ilk hedef bağlantı oluşturur, eğer bir dosya üzerinde iki bağlantı bırakabilir - - yasaldır, kesilebilir ancak dosya düşünen sadece bir sonraki silinirse sorunlara neden olabilecek bir tane vardır. Öte yandan, önce kaynak bağlantısını kaldırırsa, dosya kaybolabilir. Dosyayı çalıştırmak genellikle her iki durumu da algılar ve düzeltir, ancak dosya kaybolursa, istenen konumda değil rastgele bir adla "kayıp + bulunan" bir dizine yerleştirilir - ve iki bağlantı varsa, bağlantı sayısı basitçe dosya sistemi bunu destekliyorsa dosya iki konumda bulunur.

Elektrik kesintileri karşısında sağlam bir dosya sistemine ihtiyacınız varsa , NTFS, EXT3 veya XFS gibi günlük kaydı dosya sistemini kullanmalısınız . Modern sistemlerin çoğu varsayılan olarak günlük kaydı dosya sistemini kullanır, ancak harici sürücüler için kullanıyorsanız FAT'in günlük kaydı dosya sistemi olmadığının farkında olmalısınız.

Günlük kaydı dosya sistemi "çift girişli" bir sistem kullanır - günlük dosyasına taşımaya niyet ettiği gerçeğini yazar, sonra hareketi gerçekleştirir. Dosya sistemi başlangıçta kontrol edildiğinde, kesintiye uğradıysa, taşıma işleminin tamamlanmadığını fark eder ve ardından yeniden yapar.

İki tür günlük kaydı dosya sistemi vardır: meta veri günlük kaydı ve tam günlük kaydı. Meta veri günlük kaydı, günlük sistemindeki dosya içeriğindeki değişiklikleri izlemediği anlamına gelir (bu nedenle, bir dosyaya yazıyorsanız içeriği kaybedebilirsiniz), ancak yine de dizin içeriği gibi önemli dosya sistemi bilgilerini izler. , dosya özellikleri vb.


İnsanlar yeniden adlandırma işleminin atomik olduğu hakkında konuştuğunda, sistemdeki başka bir işlem tarafından geçişin ortasında gözlemlenemeyeceği ve örneğin mvkomutun kendisiyle kesilmesiyle yarı yarıya bırakılamayacağı anlamına gelir ^C. Depolama alanı disk üzerinde çok farklı yerlerde olabilen her dizine fiziksel yazma işlemi, donanım düzeyinde gerçekten atomik bir işlem olamaz.


Tamlık için, hedef dizinde yeni bağlantı oluşturmaya ve eski dizinde kaldırmaya ek olarak bir yeniden adlandırma ile ilişkili bazı rastlantısal G / Ç işlemleri olduğunu da unutmayın. hedef dizinin ayırma boyutu .., dosya bir dizinse üst dizinlerin bağlantısını ve bağlantı sayılarını değiştirme . Ayrıca, dosyanın kendisinin atime etkilenir olup olmadığından emin değilim.


Bir dergi, elektrik kesintilerinde atomikliği garanti etmez. Ext3 ve ext4'ün renameatomik 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ı?
Gilles 'SO- kötü olmayı bırak'

@Gilles, dergi olmadan teorik olarak nasıl garanti edilebileceği hakkında bilginiz var mı? Demek istediğim, temel düzeyde, yalnızca bir tanesinin gerçekleştirildiği sonucunu asla almamanızı sağlamak için yazıları iki farklı dosyaya senkronize etmekten bahsediyoruz.
Random832

Günlük yapılı dosya sistemleri , kullanımda olan blokların üzerine yazarak tutarlılığı korur. Bu, mevcut verilerin üzerine yazmanın pahalı olduğu flash ortamlar için çok uygundur. Günlük gerçekten bir günlük gibi değildir, çünkü montaj sırasında hiçbir şey yeniden oynatılmaz - ancak tüm dosya sisteminin dergi olduğunu söyleyebilirsiniz (ancak bu montaj hiçbir zaman hafızadaki her şeyi çok yavaş olacağı gibi tekrar oynatmayı içermez). LogFS açıklaması Wikipedia'da iyi bir genel bakış.
Gilles 'SO- kötü olmayı bırak'

1

Bu soru Süper Kullanıcı'da biraz farklı bir şekilde sorulmuştur . Komuttaki Wikipedia sayfası mvda bunu oldukça iyi açıklıyor :

Dosyaların aynı dosya sistemi içinde taşınması genellikle dosyayı kopyalayıp orijinali kaldırmadan farklı şekilde uygulanır. Syscall yeniden adlandırmayı desteklemeyen platformlarda, yeni dizine yeni bir bağlantı eklenir ve orijinal dizin silinir. Dosya verilerine erişilemiyor.

Linux syscall adını değiştirir ve bu nedenle dosyayı atomik, yani kesintisiz bir işlem olarak yeniden adlandırır. Yani hayır, dosya sistemi tanımladığınız durumda tutarsız olamaz.


2
sys yeniden adlandırma os soyutlama çağırmak mı? Donanım akıllıca olduğundan, yeniden adlandırma bir dizi işlem olması gerektiğinden her zaman bir dizi işlemi
kesebilirim

Hayır, bir işletim sistemi soyutlaması değil, ama "bu nedenle dosya sisteminin tutarsız hale gelmesi pek olası değildir ..." diye düşündüm. Yine de sana katılıyorum.
Benjamin B.

2
Bu cevap , sistem çağrısının, elektrik kesintisi olsa bile neden dosya sisteminin tutarsız bir duruma nedenrename olamayacağını merak etmemi sağlıyor . Bunun @ graphtheory92'nin sorusunun çekirdeği olduğunu hissettim.
Tanner Swett

1
@ graphtheory92: Bir sistem çağrısı atomsa, sonuçta elde edilen disk işleminin (veya bir dizi disk işleminin!) atomik olacağı anlamına gelmez. ------ Bir dosyayı (sabit bağlantı sayısı 1) taşıyarak ve gücü, sabit disk bağlantısını keserek veya çekirdeği doğru zamanda kilitleyerek iki sabit bağlantıyla (orijinal ve yenisi) ) sabit bağlantı sayısı hala 1 ile dosyaya. ------ Bence sorunun iki temel çözüm olduğunu düşünüyorum: a) yazılım - otomatik olarak tutarsız durumlardan kurtarabilirsiniz FS günlük kaydı. b) HW destekli işlemler.
pabouk

2
Bahsettiğiniz atomikliğin garantisi, diğer işlemlerin gözlemlenmesi ile ilgilidir. Sistem çökerse beklemez.
Gilles 'SO- kötü olmayı bırak'
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.