Linux BTRFS - başarısız sürücü ile single'a dönüştür


12

Az miktarda arka plan:

HTPC kurulumum için kullanılan çeşitli filmleri ve TV şovlarını sakladığım küçük bir medya dosya sistemim var. Bu başlangıçta btrfs1 TB WD harici sürücü kullanılarak kuruldu .

Daha sonra, bu dosya sistemine RAID1 yansıtma yetenekleri vermek için başka bir sürücü satın almaya karar verdim. Bu disk bir Seagate Barracuda (2 TB, BARRACUDA 7200.14 AİLESİ). Ne yazık ki, bu sürücü iyi bir seçim değildi. BTRFS bunları düzeltebilmesine rağmen, sürücü kısa süre içinde büyük miktarda okuma hatası geliştirmeye başladı.

Son zamanlarda, bu sürücüdeki okuma hatalarının sayısı arttı, durumu sürekli kötüleşti. BTRFS şimdi çökmeye başlıyor:

kernel: RSP: 0018:ffff88005f0e7cc0  EFLAGS: 00010282
kernel: RIP: 0010:[<ffffffffa0081736>]  [<ffffffffa0081736>] btrfs_check_repairable+0xf6/0x100 [btrfs]
kernel: task: ffff88001b5c4740 ti: ffff88005f0e4000 task.ti: ffff88005f0e4000
kernel: Workqueue: btrfs-endio btrfs_endio_helper [btrfs]
kernel: CPU: 1 PID: 3136 Comm: kworker/u8:3 Tainted: G           O    4.5.3-1-ARCH #1
kernel: invalid opcode: 0000 [#1] PREEMPT SMP 
kernel: kernel BUG at fs/btrfs/extent_io.c:2309!
kernel: ------------[ cut here ]------------
kernel: BTRFS info (device sdc1): csum failed ino 73072 extent 1531717287936 csum 3335082470 wanted 3200325796 mirror 0
kernel: ata3: EH complete
kernel: BTRFS error (device sdc1): bdev /dev/sda3 errs: wr 0, rd 18, flush 0, corrupt 0, gen 0
kernel: blk_update_request: I/O error, dev sda, sector 2991635296

Hatalı sürücüyü RAID1 dizisinden kaldırmak, tek bir sürücüde artıklık olmadan geri dönmek istiyorum. Ne yazık ki, bunun nasıl yapılacağı ile ilgili dokümantasyon eksikliği var gibi görünüyor.

Aşağıdakileri çalıştırabileceğinin farkındayım:

sudo btrfs balance start -dconvert=single /media

veri singlemodunu moda dönüştürmek için kullanılır, ancak verilerin nereye yerleştirileceği konusunda emin değilim. Sürücülerden biri arızalanırken, BTRFS'nin iyi sürücüdeki tüm verileri silerek temizlemediğinden ve bozuk sürücüye tek bir kopya yerleştirdiğinden emin olmak istiyorum - bunun yerine, basitçe diğer sürücü hiç varmamış gibi davran (olduğu gibi, eski kurulumuma geri dön)

Bu işe yaramıyor:

$ sudo btrfs device delete /dev/sda3 /media
ERROR: error removing device '/dev/sda3': unable to go below two devices on raid1

Ben ne yapacağım? Yardım çok takdir edilecektir.

TL; DR: BTRFS'de 1 sürücü ile başladı single, başka bir sürücü ekledi, yaptı RAID1, diğer sürücü şimdi hata veriyor, sadece bir sürücüye (özellikle bilinen iyi olana) nasıl dönebilirim single?


Güncelleme: dconvert=singlebir parça için sadece korktuğum şeyi yapmak ve bilinen iyi kopyayı silmek. :(
eeeeeta

Yanıtlar:


11

Tamam, bu Trello bağlantısının yardımıyla anladım . Başka birinin bunu yapmak istemesi durumunda, prosedür burada.

prosedür

Biri /dev/sdaarızalı ve diğeri /dev/sdcbilinen iyi olan iki diskten oluşan bir RAID1 dizisinden :

  1. Bu dizinin otomatik olarak bağlanmasını devre dışı bırakın /etc/fstab, yeniden başlatın . Temel olarak, btrfs'nin bu dizinin var olduğunu unutmasını istiyoruz, çünkü takılı değilse sürücülerden birini kullanmaya çalışacağı bir hata var.
  2. Dizinizin bağlantısı kesildiğine göre şu komutu yürütün:

    echo 1 | sudo tee /sys/block/sda/device/delete

    sdahatalı cihaz adıyla değiştirme . Bu, diskin dönmesine neden olur (bunu dmesg'de doğrulamanız gerekir) ve çekirdeğe erişilemez hale gelir.

    Alternatif olarak : Başlatmadan önce sürücüyü bilgisayardan çıkarın! Yukarıdaki yöntem benim için iyi çalıştığı için bu yöntemi tercih etmemeyi seçtim.

  3. Dizinizi -o degradedmod ile bağlayın.
  4. İle yeniden dengeleme işlemine başlayın sudo btrfs balance start -f -mconvert=single -dconvert=single /mountpoint. Bu, bilinen iyi sürücüdeki uzantıları yeniden düzenleyerek onları single(RAID olmayan) dönüştürecektir . Bu, sürücünüzün hızına ve dizinizin boyutuna bağlı olarak tamamlanması neredeyse bir gün sürecektir. (benimki ~ 700 GiB vardı ve dakikada 1 1GiB yığın oranında yeniden dengelendi) Neyse ki, bu işlem duraklatılabilir ve gerçekleştiğinde diziyi çevrimiçi tutacaktır.
  5. Bu yapıldıktan sonra sudo btrfs device remove missing /mountpoint, 'eksik' hatalı cihazı kaldırabilirsiniz.
  6. sudo btrfs balance start -mconvert=dup /mountpointMeta veri yedekliliğini geri yüklemek için ile ikinci bir yeniden dengeleme başlatın . Bu benim sistemimde birkaç dakika sürüyor.
  7. Sen bittin! Diziniz artık singletüm artıklık kaldırılmış olarak mod.
  8. Hatalı sürücünüzü dışarıya çıkarın ve bir çekiçle dövün.

Sorun giderme

  • Yardım, btrfs hatalı diskime yazmaya çalıştı, hatalı çıktı ve salt okunur olarak zorladı!
    • 1. adımı izlediniz ve devam etmeden önce yeniden başlattınız mı? Muhtemelen btrfs, çevirdiğiniz sürücünün mevcut olduğunu düşünüyor olabilir. Yeniden başlatma, btrfs'nin hataları unutmasına ve devam etmenize izin verecektir.

2
Bu işe yaramıyor. Ubuntu 16.04 (Çekirdek 4.4) kullanıyorum. dmesg "eksik aygıtlar (1) sınırı (0) aşıyor, yazılabilir bağlama izin verilmiyor" diyor. Böylece "mount -o bozulmuş" adımda
sıkışıp kaldım

@HelloSam: Belki de bu bir hatadır. Bkz. Bbs.archlinux.org/viewtopic.php?id=210541
jaltek

Hâlihazırda hedef profile sahip olan (hepsi olmalıdır) parçaları atlamak için ,softher convert=birini sonra eklemeyi düşünün .
Tom Hale

9

Gönderiniz için teşekkürler. Baskıyı test edebileceğim, sürücüyü hotswap yuvamdan çıkarabildiğim, başka bir sürücü kullandığım ve ardından raid sürücüyü tekrar açabileceğim fikrine sahiptim.

İşte bulduğum şey. Kök olarak:

# sudo btrfs fi show
Label: 'disk'  uuid: 12817aeb-d303-4815-8bba-a3440e36c62c
Total devices 2 FS bytes used 803.10GiB
    devid    1 size 931.51GiB used 805.03GiB path /dev/sda1
    devid    2 size 931.51GiB used 805.03GiB path /dev/sdb1

Her sürücü için listelenen şeytana dikkat edin. Brtrfs dengesi adam devid seçeneğine götürdü, filtrelerin nasıl çalıştığını anlamaya çalıştı (başlangıçta devid = / dev / sdb1). İlk denemeniz böyle bir şey olacak.

# btrfs balance start -dconvert=single,devid=2 -mconvert=single,devid=2 /mnt

Bu bana bir hata verdi.

ERROR: error during balancing '/media/.media': Invalid argument
There may be more info in syslog - try dmesg | tail    

İşte dmesg hatası:

BTRFS error (device sdb1): balance will reduce metadata integrity, use force if you want this

İşte bu işe yarayan final:

# btrfs balance start -f -dconvert=single,devid=2 -mconvert=single,devid=2 /mnt

Umarım bu başka birine yardımcı olur.


Sadece bir sürücüyü başka bir sürücüyle değiştirmek isterseniz, bunu kullanarak yapabilirsiniz btrfs replace.
dma_k

Bu benim için bir yıl önce işe yaradı, ama bugün çalışmıyor. Sonra ne yazdığım önemli değil devid=, ortaya çıkan tek veri cihaz 1'e yerleştirilir.
YtvwlD

Ayrıca -sconvertsistem parçalarını dönüştürmek için göz atın.
Tom Hale

Denge için man sayfasının |yerine şunu kullanmayı düşünün ,:profiles=<profiles> Balances only block groups with the given profiles. Parameters are a list of profile names separated by "|" (pipe)
Tom Hale
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.