Linux BTRFS - chuyển đổi thành đơn với ổ đĩa bị lỗi


12

Một lượng nhỏ tiền đề:

Tôi có một hệ thống tập tin đa phương tiện nhỏ, trên đó tôi lưu trữ nhiều bộ phim và chương trình TV khác nhau được sử dụng cho thiết lập HTPC của tôi. Điều này ban đầu được thiết lập, sử dụng btrfs, trên ổ đĩa ngoài WD 1TB.

Sau đó, tôi quyết định mua một ổ đĩa khác, để cung cấp khả năng phản chiếu RAID1 cho hệ thống tập tin này. Ổ đĩa này là Seagate Barracuda (2TB, BARRACUDA 7200,14 GIA ĐÌNH). Thật không may, đây không phải là một lựa chọn tốt cho ổ đĩa. Ổ đĩa đã bắt đầu phát triển một lượng lớn lỗi đọc trong thời gian ngắn, mặc dù BTRFS đã có thể sửa chúng.

Gần đây, số lượng lỗi đọc từ ổ đĩa này đã tăng đột biến, với tình trạng của nó ngày càng tồi tệ. BTRFS hiện đang bắt đầu sụp đổ:

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

Tôi muốn xóa ổ đĩa bị lỗi khỏi mảng RAID1, trở lại không có dự phòng trên một ổ đĩa. Thật không may, dường như thiếu tài liệu về cách làm điều này.

Tôi biết rằng người ta có thể chạy như sau:

sudo btrfs balance start -dconvert=single /media

để chuyển đổi cấu hình dữ liệu sang singlechế độ, nhưng tôi không chắc chắn chỉ là nơi dữ liệu sẽ được đặt. Vì một trong các ổ đĩa bị lỗi, tôi muốn có thể đảm bảo rằng BTRFS không xóa hết dữ liệu trên ổ đĩa tốt và đặt một bản sao vào ổ đĩa xấu - thay vào đó, tôi chỉ muốn hành động như thể ổ đĩa khác không bao giờ tồn tại (như trong, chuyển đổi trở lại thiết lập cũ của tôi)

Điều này không hoạt động:

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

Tôi phải làm gì đây? Trợ giúp sẽ được đánh giá cao.

TL; DR: bắt đầu với 1 ổ đĩa trong BTRFS single, đã thêm một ổ đĩa khác, khiến nó RAID1, ổ đĩa khác hiện đang bị lỗi, làm cách nào để tôi quay lại chỉ một ổ đĩa (ĐẶC BIỆT là ổ đĩa tốt đã biết) với single?


Cập nhật: cố gắng dconvert=singlecho một đoạn chỉ làm những gì tôi sợ và xóa bản sao tốt đã biết. :(
eeeeeta

Câu trả lời:


11

Được rồi, tôi đã tìm ra nó với sự giúp đỡ của liên kết Trello này . Trong trường hợp bất cứ ai khác muốn làm điều này, đây là thủ tục.

Thủ tục

Từ một mảng RAID1 gồm hai đĩa, một đĩa /dev/sdabị lỗi và một đĩa khác /dev/sdcđược biết đến:

  1. Vô hiệu hóa tự động gắn mảng này vào /etc/fstab, khởi động lại . Về cơ bản, chúng tôi muốn btrfs quên mảng này tồn tại, vì có một lỗi mà nó vẫn sẽ cố gắng sử dụng một trong các ổ đĩa nếu nó không được cắm.
  2. Bây giờ mảng của bạn chưa được đếm, thực hiện:

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

    thay thế sdabằng tên thiết bị bị lỗi. Điều này làm cho đĩa quay xuống (bạn nên xác minh điều này trong dmesg) và không thể truy cập được vào kernel.

    Ngoài ra : chỉ cần lấy ổ đĩa ra khỏi máy tính trước khi khởi động! Tôi đã chọn không chọn phương pháp này, vì ở trên hoạt động tốt với tôi.

  3. Gắn mảng của bạn, với -o degradedchế độ.
  4. Bắt đầu một hoạt động tái cân bằng với sudo btrfs balance start -f -mconvert=single -dconvert=single /mountpoint. Điều này sẽ tổ chức lại các phạm vi trên ổ đĩa đã biết, chuyển đổi chúng thành single(không phải RAID). Điều này sẽ mất gần một ngày để hoàn thành, tùy thuộc vào tốc độ ổ đĩa và kích thước của mảng của bạn. (của tôi có ~ 700 GiB và được cân bằng lại với tốc độ 1 1 GiB mỗi phút) May mắn thay, thao tác này có thể được tạm dừng và sẽ giữ mảng trực tuyến trong khi nó xảy ra.
  5. Khi điều này được thực hiện, bạn có thể phát hành sudo btrfs device remove missing /mountpointđể xóa thiết bị bị lỗi 'mất tích'.
  6. Bắt đầu cân bằng thứ hai với sudo btrfs balance start -mconvert=dup /mountpointđể khôi phục dự phòng siêu dữ liệu. Điều này mất một vài phút trên hệ thống của tôi.
  7. Bạn đã hoàn tất! Mảng của bạn bây giờ là singlechế độ, với tất cả các dự phòng được loại bỏ.
  8. Mang ổ đĩa bị lỗi của bạn ra bên ngoài, và đập nó bằng búa.

Xử lý sự cố

  • Giúp đỡ, btrfs đã cố gắng ghi vào đĩa bị lỗi của tôi, bị lỗi và buộc nó chỉ đọc!
    • Bạn đã làm theo bước 1 và khởi động lại trước khi tiếp tục? Có khả năng btrfs vẫn nghĩ rằng ổ đĩa bạn quay xuống hiện diện. Khởi động lại sẽ khiến btrfs quên bất kỳ lỗi nào và sẽ cho phép bạn tiếp tục.

2
Điều này không hoạt động. Tôi đang dùng Ubuntu 16.04 (Hạt nhân 4.4). dmesg nói "các thiết bị bị thiếu (1) vượt quá giới hạn (0), không được phép gắn kết có thể ghi". Do đó, tôi bị kẹt ở bước "gắn kết xuống cấp"
HelloSam

@HelloSam: Có lẽ đây là lỗi. Xem bbs.archlinux.org/viewtopic.php?id=210541
jaltek

Cân nhắc thêm ,softsau mỗi lần convert=bỏ qua các đoạn đã có hồ sơ đích (cần phải là tất cả chúng).
Tom Hale

9

Cảm ơn bài viết của bạn. Tôi có ý tưởng rằng tôi có thể kiểm tra cuộc đột kích, đưa ổ đĩa ra khỏi vịnh hotswap của tôi, sử dụng một ổ đĩa khác và sau đó đưa ổ đĩa đột kích trở lại. Nhìn lại, đây là một ý tưởng tồi và bây giờ tôi cần vịnh hotswap của mình.

Đây là những gì tôi tìm thấy. Là gốc:

# 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

Lưu ý các devid được liệt kê cho mỗi ổ đĩa. Người đàn ông cho cân bằng brtrfs dẫn tôi đến tùy chọn devid, một vài lần thử tìm hiểu cách các bộ lọc hoạt động (ban đầu thử devid = / dev / sdb1). Vì vậy, nỗ lực đầu tiên của bạn sẽ trông giống như thế này.

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

Mà đã cho tôi một lỗi.

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

Đây là lỗi từ dmesg:

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

Vì vậy, đây là trận chung kết hoạt động:

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

Hy vọng điều này sẽ giúp người khác ra ngoài.


Nếu bạn chỉ muốn thay thế một ổ đĩa khác, bạn có thể sử dụng nó btrfs replace.
dma_k

Điều này đã làm việc cho tôi một năm trước hoặc lâu hơn, nhưng không phải hôm nay. Không quan trọng tôi nhập gì sau đó devid=, dữ liệu đơn lẻ được đặt trên thiết bị 1.
YtvwlD

Ngoài ra kiểm tra -sconvertđể chuyển đổi khối hệ thống.
Tom Hale

Cân nhắc sử dụng |thay vì ,trang nam để cân bằng cho biết:profiles=<profiles> Balances only block groups with the given profiles. Parameters are a list of profile names separated by "|" (pipe)
Tom Hale
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.