Linux BTRFS-드라이브가 고장난 싱글로 변환


12

소량의 배경 이야기 :

HTPC 설정에 사용되는 다양한 영화 및 TV 쇼를 저장하는 소형 미디어 파일 시스템이 있습니다. 이것은 원래 btrfs1TB WD 외장 드라이브 에서를 사용하여 설정되었습니다 .

나중에이 파일 시스템에 RAID1 미러링 기능을 제공하기 위해 다른 드라이브를 구입하기로 결정했습니다. 이 드라이브는 Seagate Barracuda (2TB, BARRACUDA 7200.14 FAMILY)입니다. 불행히도, 이것은 드라이브의 좋은 선택이 아니 었습니다. BTRFS가이를 수정할 수 있었지만 드라이브가 대량의 읽기 오류를 곧 개발하기 시작했습니다.

최근이 드라이브의 읽기 오류 양이 급증하면서 상태가 꾸준히 악화되고 있습니다. BTRFS가 이제 중단되기 시작했습니다.

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

RAID1 어레이에서 결함이있는 드라이브를 제거하고 단일 드라이브에서 중복성이없는 상태로 돌아가고 싶습니다. 불행히도이를 수행하는 방법에 대한 문서가 부족한 것 같습니다.

나는 다음을 실행할 수 있다는 것을 알고 있습니다.

sudo btrfs balance start -dconvert=single /media

데이터 프로파일을 single모드 로 변환 하지만 데이터가 어디에 배치 될지 확신 할 수 없습니다. 드라이브 중 하나가 고장 나서 BTRFS가 올바른 드라이브의 모든 데이터를 제대로 지우지 않고 불량 드라이브에 단일 사본을 배치하지 않도록하고 싶습니다. 대신 간단히 다른 드라이브가 존재하지 않는 것처럼 작동합니다 (과 같이 이전 설정으로 다시 변환)

작동하지 않습니다.

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

어떻게해야합니까? 도움을 주시면 감사하겠습니다.

TL : DR : BTRFS에서 1 개의 드라이브로 시작하여 single다른 드라이브를 추가하여 다른 드라이브가 오류를 일으켰 습니다 RAID1. 다른 드라이브가 오류가 발생했습니다 single.


업데이트 : dconvert=single한 덩어리에 대해 시도하면 내가 두려워하는 것으로 알려진 알려진 사본을 삭제합니다. :(
eeeeeta 2016 년

답변:


11

좋아, 나는 이 Trello 링크 의 도움으로 알아 냈습니다 . 다른 사람이이 작업을 수행하려는 경우 절차는 다음과 같습니다.

순서

두 개의 디스크로 구성된 RAID1 어레이에서 하나 /dev/sda는 결함이 있고 다른 하나 는 정상입니다 /dev/sdc.

  1. 사용 안 함이 배열의 자동 설치 /etc/fstab, 재부팅 . 기본적으로, btrfs가 드라이브가 연결되어 있지 않은 경우 여전히 드라이브 중 하나를 사용하려고 시도하는 버그가 있기 때문에 btrfs가이 배열의 존재를 잊어 버리기를 원합니다.
  2. 배열이 마운트 해제되었으므로 다음을 실행하십시오.

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

    sda결함이있는 장치 이름으로 교체 하십시오. 이로 인해 디스크가 다운되고 (dmesg에서이를 확인해야 함) 커널에 액세스 할 수 없게됩니다.

    또는 부팅하기 전에 컴퓨터에서 드라이브를 꺼내십시오! 위의 방법이 적합하기 때문에이 방법을 선택하지 않았습니다.

  3. -o degraded모드를 사용 하여 어레이를 마운트하십시오 .
  4. 로 밸런싱 작업을 시작하십시오 sudo btrfs balance start -f -mconvert=single -dconvert=single /mountpoint. 이렇게하면 알려진 정상 드라이브의 익스텐트가 재구성되어 single비 RAID 로 변환됩니다 . 드라이브 속도 및 어레이 크기에 따라 완료하는 데 거의 하루가 걸립니다. (광산은 ~ 700GiB를 가지며 분당 1GiB 청크 비율로 재조정했습니다.) 운 좋게도이 작업은 일시 중지 될 수 있으며 어레이가 온라인 상태 일 때 온라인 상태를 유지합니다.
  5. 이 작업이 완료되면 sudo btrfs device remove missing /mountpoint'누락 된'결함이있는 장치를 제거하기 위해 발행 할 수 있습니다 .
  6. sudo btrfs balance start -mconvert=dup /mountpoint메타 데이터 중복성을 복원하기 위해 두 번째 재조정을 시작하십시오 . 시스템에서 몇 분이 걸립니다.
  7. 끝났습니다! 어레이는 이제 single모든 이중화가 제거 된 모드입니다.
  8. 고장난 드라이브를 밖으로 가져가 망치로 치십시오.

문제 해결

  • btrfs가 결함이있는 디스크에 쓰려고했으나 오류가 발생하여 읽기 전용으로 설정했습니다.
    • 1 단계를 따르고 계속하기 전에 재부팅 했습니까? btrfs는 여전히 회전 한 드라이브가 있다고 생각합니다. 재부팅하면 btrfs가 오류를 잊어 버려 계속 진행할 수 있습니다.

2
작동하지 않습니다. 우분투 16.04 (Kernel 4.4)에 있습니다. dmesg에 따르면 "missing devices (1)이 limit (0)을 (를) 초과하면 쓰기 가능한 마운트가 허용되지 않습니다."라고 말합니다. 따라서 나는 "mount -o 저하"단계에
멈춰있다

@HelloSam : 아마도 이것이 버그 일 것입니다. 참조 : bbs.archlinux.org/viewtopic.php?id=210541
jaltek

대상 프로파일이 이미있는 청크를 모두 건너 뛰려면 ,soft각각 convert=을 추가하십시오 (모두 있어야 함).
Tom Hale

9

게시물 주셔서 감사합니다. 나는 레이드를 테스트하고, 핫스왑 베이에서 드라이브를 꺼내고, 다른 드라이브를 사용한 다음 레이드 드라이브를 다시 꽂을 수 있다는 아이디어를 가지고있었습니다.

여기 내가 찾은 것이 있습니다. 루트로 :

# 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

각 드라이브에 대해 나열된 장치를 기록하십시오. brtrfs 균형에 대한 남자는 나를 devid 옵션으로 이끌고 필터가 어떻게 작동했는지 알아 내려고 시도했습니다 (처음에는 devid = / dev / sdb1 시도). 첫 번째 시도는 다음과 같습니다.

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

나에게 오류가 발생했습니다.

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

dmesg의 오류는 다음과 같습니다.

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

따라서 이것이 효과가 있었던 최종 결과입니다.

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

잘하면 이것은 다른 누군가를 도와줍니다.


하나의 드라이브를 다른 드라이브로 교체하려는 경우을 사용하여 수행 할 수 btrfs replace있습니다.
dma_k

이것은 1 년 전에 저에게 효과가 있었지만 오늘날에는 그렇지 않습니다. 내가 무엇을 입력했는지는 중요하지 않습니다 devid=. 결과 단일 데이터가 장치 1에 배치됩니다.
YtvwlD

또한 -sconvert시스템 청크를 변환하기 위해 체크 아웃하십시오 .
Tom Hale

밸런스 매뉴얼 페이지 |대신 다음을 사용하는 것이 좋습니다 ,.profiles=<profiles> Balances only block groups with the given profiles. Parameters are a list of profile names separated by "|" (pipe)
Tom Hale
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.