Btrfs bodur tam olarak ne yapar? Tamamen belirsiz olan manuel sayfaya göre, bazı hata kontrolü yapıyor. Ne tür bir hata kontrolü? Ne kadar güvenilir? Bazı hataları kurtarabilir mi? O nasıl çalışır? Her btrfs diskinde çalışır mı?
Btrfs bodur tam olarak ne yapar? Tamamen belirsiz olan manuel sayfaya göre, bazı hata kontrolü yapıyor. Ne tür bir hata kontrolü? Ne kadar güvenilir? Bazı hataları kurtarabilir mi? O nasıl çalışır? Her btrfs diskinde çalışır mı?
Yanıtlar:
Başka bir şey yapıp yapmadığını bilmiyorum, ama en azından btrfs scrub
tam disk veri ovma yaptığını biliyorum . Temel olarak, diskteki tüm verileri * okur, sağlama toplamını yeniden hesaplar ve yeniden hesaplanan sağlama toplamını depolananla karşılaştırır. Depolanan ve yeniden hesaplanan sağlama toplamları eşleşmediğinde, sistem bozulma olduğunu bilir.
Bir kez bozulma algılandığında, davranış disk kurulumunuza bağlıdır. Örneğin, RAID 1 (yansıtma) varsa, btrfs scrub
bozuk bir sürümü başka bir diskten kopyalayarak bozuk verileri düzeltebilir. Bazı verilerin tüm kopyaları bozulursa (örn., Çoklu disk hasarı veya ilk etapta yedek kopyaların olmaması), btrfs scrub
sizi uyarmanın yanında yapabileceğiniz çok şey yoktur.
Bunun önemli olmasının nedeni, sabit sürücülerin bit okuma ve yazma işlemlerinde yalnızca% 99.999999999999 güvenilir olmasıdır. Bu nedenle, her birkaç terabaytlık veri G / Ç'sinde bir hata olması muhtemeldir. Her ne kadar normal disk erişimi sırasında hatalar tespit edilse ve algılanabilse (ve düzeltilse de, gereksiz bir kopyanın hala geçerli olduğu varsayılarak), rutin tam disk fırçalama, aynı verilerin tüm kopyalarının bozulduğunu birikmeden önce hataları bulabilir ve düzeltebilir.
* Meta verileri eklemek için "dosya" yerine "veri" kullanıyorum. Btrfs, dosyaları ve karşılık gelen meta verileri (sağlama toplamları dahil) veri bloklarında saklar ve bunların tümü kontrol toplamı ile kontrol edilir btrfs scrub
.
Ayrıca bakınız:
100-1/10^14
16 dokuz ve yazıların sadece 14'ü var (10 ^ 12'ye karşılık geliyor).
1-10^n
insanlar önde gelen ondalık sayıları sevmediği için yüzde olarak dönüştürülür. Ayrıca, önceki yorumumda sürücülerin RAID 1'de (dolayısıyla her birinde aynı 270-300 GiB verisi olduğu) bahsetmeyi ihmal ettim, bu da başka bir belirgin hesaplama hatasını düzeltir.
Mark Haferkamp'ın mükemmel cevabına genişleyerek, tüm dosyalar yerine btrfs scrub
tüm verileri okumak kritik bir özelliktir ve aslında onu bu kadar kullanışlı kılan şeydir. Unutmayın, btrfs yerleşik RAID desteğine sahiptir. RAID1 kullanacak şekilde yapılandırdığınız iki sürücüyü kapsayan bir btrfs dosya sisteminiz olduğunu varsayalım. Bu durumda, bir dosyaya yazdığınızda, bu yazma her iki diske de çoğaltılır. (Daha karmaşık bir örnekle daha karmaşık hale gelir, ancak bu basit durum için her zaman böyle olur.) Ancak bu dosyadan okuduğunuzda, okuma yalnızca bir diske çarpar (çünkü dosyayı iki kez okumak bir israftır) ilk kopya bir nedenle kullanılamazsa).
Şimdi ikinci btrfs sürücünüzün bozulduğunu ve dosya sisteminizdeki verileri bozmaya başladığını varsayalım. Bu diskten blokları okuduğunuzda, btrfs sağlama toplamının eşleşmediğini fark eder ve bant içi blok bilinen iyi bir kopyadan (ilk sürücüdeki kopya) geri yüklenir. Verileri, read()
hiçbir şey olmamış gibi uygulama çağrısına (veya her neyse) döndürür .
Peki ya btrfs ikinci diskten okumaya karar vermezse? Unutmayın, iki kopya vardır, böylece birinci veya ikinci diskten okuyabilir . İlk diskten okursa, yanlış bir şey fark etmez. Bir şeyin yanlış olduğunu farkedeceği tek zaman, ilk diskin de bozulduğu zamandır. Şimdi verileri kurtarmak için çok geç kaldınız - ikinci diskin kopyası bir süreliğine bozuldu ve ilk kopya (ikinci diski geri yüklemek için kullanacağınız şey) artık bozuk!
Burası devreye btrfs scrub
giriyor. Tüm dosyaları değil, tüm verileri okuyor . Bu, meta verileri içerir, ancak normalde okuma yolunda olmayacak dosyaların ikincil kopyalarını da içerir. Bu ikincil kopyaları okuduğunda, btrfs'nin bant içi hata düzeltmesi için tek bir kopyadan veri alma ve geri yükleme için bir fırsat yaratır.