Linux BTRFS - konversi ke satu dengan drive yang gagal

12

Sejumlah kecil cerita latar:

Saya memiliki sistem file media kecil, tempat saya menyimpan berbagai film dan acara TV yang digunakan untuk pengaturan HTPC saya. Ini pada awalnya diatur, menggunakan btrfs, pada drive eksternal 1TB WD.

Kemudian, saya memutuskan untuk membeli drive lain, untuk memberikan kemampuan mirroring RAID1 filesystem ini. Drive ini adalah Seagate Barracuda (2TB, BARRACUDA 7200.14 FAMILY). Sayangnya, ini bukan pilihan drive yang baik. Drive mulai mengembangkan sejumlah besar kesalahan baca segera, meskipun BTRFS mampu memperbaikinya.

Baru-baru ini, jumlah kesalahan baca dari drive ini telah meningkat, dengan kondisinya terus memburuk. BTRFS sekarang mulai macet:

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

Saya ingin menghapus drive yang rusak dari array RAID1, kembali ke redundansi pada satu drive. Sayangnya, sepertinya tidak ada dokumentasi tentang bagaimana melakukan ini.

Saya menyadari bahwa seseorang dapat menjalankan yang berikut:

sudo btrfs balance start -dconvert=single /media

untuk mengubah profil data ke singlemode, tapi saya tidak yakin hanya DI MANA data akan ditempatkan. Karena salah satu drive gagal, saya ingin dapat memastikan bahwa BTRFS tidak patuh menghapus semua data pada drive yang baik, dan menempatkan satu salinan pada drive yang buruk - sebagai gantinya, saya ingin hanya bertindak seolah-olah drive lain tidak pernah ada (seperti di, konversikan kembali ke pengaturan lama saya)

Ini tidak berfungsi:

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

Apa yang harus saya lakukan? Bantuan akan sangat dihargai.

TL; DR: dimulai dengan 1 drive di BTRFS single, menambahkan drive lain, membuatnya RAID1, drive lain sekarang sedang error, bagaimana cara kembali ke hanya satu drive (KHUSUS yang dikenal baik) dengan single?

eeeeeta
sumber
Pembaruan: mencoba itu dconvert=singleuntuk satu potong hanya melakukan apa yang saya takutkan dan menghapus salinan yang dikenal baik. :(
eeeeeta

Jawaban:

11

Baiklah, saya menemukannya dengan bantuan tautan Trello ini . Jika ada yang ingin melakukan ini, inilah prosedurnya.

Prosedur

Dari array RAID1 dari dua disk, /dev/sdayang salah dan /dev/sdcbaik-dikenal:

  1. Nonaktifkan pemasangan otomatis array ini di /etc/fstab, reboot . Pada dasarnya, kami ingin btrf lupa bahwa array ini ada, karena ada bug di mana ia masih akan mencoba menggunakan salah satu drive jika itu dicabut.
  2. Sekarang setelah array Anda dilepas, jalankan:

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

    mengganti sdadengan nama perangkat yang salah. Ini menyebabkan disk berputar (Anda harus memverifikasi ini dalam dmesg) dan menjadi tidak dapat diakses oleh kernel.

    Atau : keluarkan saja drive dari komputer sebelum melakukan boot! Saya memilih untuk tidak memilih metode ini, karena cara di atas berfungsi dengan baik untuk saya.

  3. Pasang array Anda, dengan -o degradedmode.
  4. Mulailah operasi penyeimbangan kembali dengan sudo btrfs balance start -f -mconvert=single -dconvert=single /mountpoint. Ini akan mengatur ulang luasan pada drive yang dikenal baik, mengubahnya menjadi single(non-RAID). Ini akan memakan waktu hampir satu hari untuk diselesaikan, tergantung pada kecepatan drive Anda dan ukuran array Anda. (milik saya ~ 700 GiB, dan menyeimbangkan kembali pada tingkat 1 1GiB per menit) Untungnya, operasi ini dapat dihentikan sementara, dan akan membuat array online saat itu terjadi.
  5. Setelah ini selesai, Anda dapat mengeluarkan sudo btrfs device remove missing /mountpointuntuk menghapus perangkat yang salah 'hilang'.
  6. Mulailah menyeimbangkan kedua dengan sudo btrfs balance start -mconvert=dup /mountpointmengembalikan redundansi metadata. Ini membutuhkan beberapa menit pada sistem saya.
  7. Kamu sudah selesai! Array Anda sekarang adalah singlemode, dengan semua redundansi dihapus.
  8. Bawa drive Anda yang salah ke luar, dan kalahkan dengan palu.

Penyelesaian masalah

  • Tolong, btrfs mencoba menulis ke disk saya yang rusak, membuat kesalahan, dan memaksanya hanya untuk dibaca!
    • Apakah Anda mengikuti langkah 1, dan reboot sebelum melanjutkan? Kemungkinan btrf masih berpikir bahwa drive yang Anda gunakan sudah ada. Mem-boot ulang akan menyebabkan btrf melupakan kesalahan, dan akan membiarkan Anda melanjutkan.
eeeeeta
sumber
2
Ini tidak berhasil. Saya di Ubuntu 16.04 (Kernel 4.4). dmesg mengatakan "perangkat yang hilang (1) melebihi batas (0), mount yang dapat ditulis tidak diizinkan". Jadi saya terhenti di langkah "mount -o terdegradasi"
HelloSam
@ HaloSam: Mungkin ini bug. Lihat bbs.archlinux.org/viewtopic.php?id=210541
jaltek
Pertimbangkan untuk menambahkan ,softsetelah setiap convert=untuk melewati potongan yang sudah memiliki profil target (yang seharusnya semuanya).
Tom Hale
9

Terima kasih atas kiriman Anda. Saya memiliki ide bahwa saya dapat menguji serangan, mengeluarkan drive dari ruang hotswap saya, menggunakan drive lain dan kemudian meluncurkan drive itu kembali. Dalam retrospeksi, ini adalah ide yang buruk dan sekarang saya perlu bay hotswap saya.

Inilah yang saya temukan. Sebagai root:

# 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

Perhatikan devid yang terdaftar untuk setiap drive. Man for brtrfs balance membawa saya ke opsi devid, butuh beberapa upaya untuk mencari tahu bagaimana filter bekerja (awalnya mencoba devid = / dev / sdb1). Jadi upaya pertama Anda akan terlihat seperti ini.

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

Yang memberi saya kesalahan.

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

Inilah kesalahan dari dmesg:

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

Jadi ini final yang berhasil:

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

Semoga ini bisa membantu orang lain keluar.

PG
sumber
Jika Anda hanya ingin mengganti satu drive dengan yang lain, Anda bisa melakukannya menggunakan btrfs replace.
dma_k
Ini telah bekerja untuk saya setahun yang lalu, tetapi tidak hari ini. Tidak masalah apa yang saya ketik setelahnya devid=, data tunggal yang dihasilkan ditempatkan pada perangkat 1.
YtvwlD
Periksa juga -sconvertuntuk mengonversi bongkahan sistem.
Tom Hale
Pertimbangkan untuk menggunakan, |bukan ,sebagai halaman manual untuk keseimbangan mengatakan:profiles=<profiles> Balances only block groups with the given profiles. Parameters are a list of profile names separated by "|" (pipe)
Tom Hale