질문
RAID1 배열에 새 드라이브를 추가했는데 해당 드라이브가 배열의 일부로 나열되었지만 새 데이터가 기록되지 않았습니다(가장 큰 드라이브이고 비어 있음에도 불구하고). 또한 sudo btrfs fi usage
배열의 일부로 표시되지만 Data,RAID1
"nor" Metadata,RAID1
섹션에는 나열되지 않습니다(아래 출력 참조).
내가 찾을 수 있는 모든 가이드에는 기존 RAID1 어레이에 새 장치를 올바르게 추가했음이 나와 있었지만 이는 사실이 아니었습니다.
전주곡
RAID에 익숙하지만 반드시 Btrfs 구현이 아닌 사람은 RAID1이 홀수 개의 디스크로 수행될 수 없다고 생각할 수도 있습니다. 그러나 Btrfs는 실제로 전통적인 "RAID1"이 아니라 다른 것입니다. 이는 틀림없이 더 유연하며 크기가 1보다 큰 디스크를 원하는 만큼 사용할 수 있으며 각 블록이 두 개의 서로 다른 디스크(일반적으로 여유 공간이 가장 많은 디스크부터 시작)에 기록되도록 보장하며 (아마도) 좋습니다. 홀수 개의 디스크 사용을 명시적으로 지원합니다.여기이에 대한 예시 질문입니다.
속도
먼저, 최근 균형 잡힌 4디스크 Btrfs RAID1 어레이로 작동하기 시작했습니다. (1x4tb, 2x8tb 및 1x10tb 드라이브 사용) 4개의 디스크는 모두 데이터 및 메타데이터 RAID1 어레이의 일부입니다(아래 출력 참조).
그런 다음 다음을 통해 새 10TB 디스크를 추가했습니다.
sudo btrfs device add -f /dev/sdj /mnt/btrfs/ba07
sudo btrfs balance start /mnt/btrfs/ba07 ### As later noted, I also ran this with RAID1 conversion filters.
이후의 출력은 sudo btrfs fi usage /mnt/btrfs/ba07
실제로 배열의 일부가 아닌 것으로 나타납니다.
Overall:
Device size: 36.38TiB
Device allocated: 17.19TiB
Device unallocated: 19.19TiB
Device missing: 0.00B
Used: 16.73TiB
Free (estimated): 9.82TiB (min: 9.82TiB)
Data ratio: 2.00
Metadata ratio: 2.00
Global reserve: 512.00MiB (used: 96.53MiB)
Data,RAID1: Size:8.58TiB, Used:8.35TiB
/dev/sdf 5.68TiB
/dev/sdg 5.53TiB
/dev/sdh 3.57TiB
/dev/sdi 2.38TiB
Metadata,RAID1: Size:18.00GiB, Used:14.21GiB
/dev/sdf 8.00GiB
/dev/sdg 17.00GiB
/dev/sdh 4.00GiB
/dev/sdi 7.00GiB
System,RAID1: Size:32.00MiB, Used:1.47MiB
/dev/sdh 32.00MiB
/dev/sdj 32.00MiB
Unallocated:
/dev/sdf 1.59TiB
/dev/sdg 1.73TiB
/dev/sdh 5.52TiB
/dev/sdi 1.26TiB
/dev/sdj 9.09TiB
항목에는 새 디스크가 포함 Data,RAID1
되지 않습니다 .Metadata,RAID1
/dev/sdj
문제 해결 단계
어둠 속에서 촬영하면서 다음을 시도했습니다.
sudo btrfs filesystem resize max /mnt/btrfs/ba07
그리고
sudo btrfs balance start -dconvert=raid1 -mconvert=raid1 /mnt/btrfs/ba07
결과는 동일하며 디스크가 Data,RAID1
또는 아래에 나열되지 않습니다 Metadata,RAID1
.
최근에 나는 EarthMind의 아래 댓글에 있는 팁을 다음과 결합하여 시도했습니다.이것추천하다:
btrfs device delete /dev/sdj /mnt/btrfs/ba07 #Succeeded
btrfs device add /dev/sdj /mnt/btrfs/ba07 #Succeeded
btrfs balance start -mconvert=raid1,soft /mnt/btrfs/ba07 #Tip said to do these balances separately, metadata first
btrfs balance start -dconvert=raid1,soft /mnt/btrfs/ba07
모든 단계가 즉시 완료되고 백그라운드에서 작업이 수행되지 않습니다. 이는 아마도 밸런스 변경을 여러 번 실행했고 삭제하기 전에 이동할 데이터가 sdj에 없기 때문일 것입니다.
sudo btrfs fi usage
동일한 내용이 표시됩니다. /dev/sdj는 데이터 또는 메타데이터 RAID1의 일부가 아닙니다.
광기는 일반적으로 같은 일을 반복하면서 다른 결과를 기대하는 것으로 정의되므로 현재 다음과 같이 하고 있습니다.
sudo btrfs balance start -dconvert=raid1 -mconvert=raid1 /mnt/btrfs/ba07
이유가 무엇이든지,저것정말 뭔가 하고 있는 것 같습니다. (그러나 이전에 동일한 명령을 여러 번 시도했지만 단독으로 수행할 때는 그렇지 않습니다.) 특히 /dev/sdj는 여기서 전체 목표인 쓰기 작업을 수행하는 것으로 보입니다. 완료하는 데 몇 시간, 심지어 며칠이 걸릴 수 있으므로 승리를 선언하기에는 너무 이릅니다. 특히 출력의 이 부분은 btrfs fi usage /mnt/btrfs/ba07
유망해 보입니다.
Data,RAID1: Size:8.40TiB, Used:8.36TiB
/dev/sdf 5.56TiB
/dev/sdg 5.45TiB
/dev/sdh 3.47TiB
/dev/sdi 2.31TiB
/dev/sdj 19.00GiB
마지막 줄 /dev/sdj가 늘어나고 있습니다.
추가 정보
시스템 메시지:
$ btrfs --version
btrfs-progs v4.15.1
$ uname -r
4.15.0-54-generic
$ lsb_release -d
Description: Ubuntu 18.04.2 LTS
온라인에도 비슷한 질문이 있습니다
- btrfs raid1이 모든 디스크를 사용하지 않습니까?
- 예상대로 수행됩니다. 기존 드라이브에는 여유 공간이 더 많기 때문에 새 디스크보다 먼저 기록됩니다. 내 상황은 정반대였습니다. 새 드라이브에는 여유 공간이 더 많았습니다.
- Btrfs는 RAID1에 더 작은 드라이브를 추가합니다.
- 디스크에 장애가 발생하면 사용자는 완전히 다른 접근 방식을 취해야 합니다.
- btrfs가 메타데이터를 RAID1로 변환하는 것을 거부하는 이유
- 이는 특정 Btrfs 버전(4.0)의 회귀로 인해 발생합니다. 하지만 4.4와 4.15 모두에서 이러한 단계를 시도했습니다.
- BTRFS 잔액이 완료되었지만 여전히 "단일" 모드에 저장된 데이터가 표시됩니다.
-mconvert=raid1,soft
필터를 변환하기 전에 "soft" 매개변수를 추가하고 별도로 실행하는 것이 좋습니다-dconvert=raid1,soft
. 이 솔루션은 내 문제를 해결하지 못했습니다.
일반화하다
분명히 내가 뭔가 잘못하고 있음이 틀림없지만, 지금까지 몇 시간 동안 인터넷 검색과 실험을 해본 결과 "올바르게 수행되었으며 '작동해야 한다'"는 것 외에는 아무것도 나오지 않았습니다.
sudo btrfs balance start -dconvert=raid1 -mconvert=raid1 /mnt/btrfs/ba07
어레이에서 디스크를 제거했다가 다시 추가한 후 동일한 명령을 사용한 세 번째 또는 네 번째 시도에도 불구하고 일시적으로 작동하는 것처럼 보였습니다. 완료되면 몇 시간 또는 며칠 후에 답변으로 추가하겠습니다.
#Repeat the third command below a few times if the whole thing doesn't work the first time.
#Note, don't specify "soft" parameter.
#If it's still not working, try the whole 3-line series of commands below multiple times.
#Because, software.
btrfs device delete /dev/sdj /mnt/btrfs/ba07
btrfs device add /dev/sdj /mnt/btrfs/ba07
sudo btrfs balance start -dconvert=raid1 -mconvert=raid1 /mnt/btrfs/ba07
답변1
나는 또한 같은 문제를 발견했습니다. 내 초기 RAID 1 쌍은 (2)12TB 드라이브였습니다. 더 많은 드라이브(2)8TB를 추가하면 새 드라이브가 8TB 기반이 아닌 이유를 알 수 없습니다./path를 사용하는 btrfs 파일 시스템. 더 많은 조사를 해보니 btrfs가 여유 공간이 가장 많은 드라이브에 추가하는 알고리즘을 사용한다는 사실을 알게 되었습니다. 따라서 12TB 쌍이 4TB를 모두 사용할 때까지 8TB 쌍은 사용되지 않습니다.
내 테스트에 따르면btrfs 장치 추가 /dev /path명령이며 실행할 필요가 없습니다.BTRFS 잔액btrfs RAID 1을 작동시키는 명령입니다.
RAID 1 btrfs 파일 시스템의 향후 반복에서는 절대 여유 공간이 아닌 백분율 여유 공간 알고리즘을 사용하기를 바랍니다. SSD 디스크를 웨어 레벨링에 사용할 때 이는 중요해집니다.
이제 반창고를 생각해 냈습니다. 각 디스크의 파일 시스템 크기를 풀에서 가장 작은 디스크 크기로 설정하여 디스크 풀을 시작했습니다. 이렇게 하면 RAID 1이 풀의 모든 디스크를 동일하게 사용하게 됩니다. 풀이 가득 차면 나머지 디스크가 동일하게 사용되도록 나머지 디스크의 크기를 다음으로 가장 작은 디스크 용량으로 조정합니다. 이는 또한 데이터가 더 많이 분산되므로 디스크 오류가 발생할 경우 재구축 시간을 줄이는 데 도움이 됩니다.
디스크의 전체 파티션을 mkfs.btrfs한 다음 다음을 사용하여 풀의 각 드라이브에 대한 여유 공간을 설정할 수 있습니다.btrfs 파일 시스템 크기 조정 {devid}:{size} /path 따라서 가장 작은 디스크가 4TB라면btrfs 파일 시스템 크기 조정{1..4}:4T /path. 디스크 장치 찾기btrfs 파일 시스템 표시.
답변2
나는 그것을 알아어떻게이 특별한 경우에는 문제를 해결합니다(그러나 그렇지 않습니다.왜일어나고 있습니다). 또한 위 질문 끝에 언급된 유사한 문제가 "수정"될지 확신할 수 없습니다.
그럼에도 불구하고 이는 분명히 의도하지 않았거나 의도하지 않았거나 기껏해야 문서화되지 않은 Btrfs 동작입니다. (예를 들어, 새로 추가된 장치를 사용하여 Btrfs를 시작하기 위해 수행해야 하는 단계는 "문서화되지 않은" 것일 수 있습니다. 왜 항상 작동하지 않는지는... 또 다른 질문입니다.)
이 (실제) 예에서는:
/dev/sdj
추가할 장치이며 btrfs에서 데이터를 배포하는 데 사용되지 않습니다./mnt/btrfs/ba07
어레이의 설치 위치입니다.
btrfs device delete /dev/sdj /mnt/btrfs/ba07
btrfs device add /dev/sdj /mnt/btrfs/ba07
sudo btrfs balance start -dconvert=raid1 -mconvert=raid1 /mnt/btrfs/ba07
일반적인 면책 조항은 데이터가 백업되었는지 확인하십시오. 이 device delete
명령은 데이터 손실 없이 이 작업을 수행해야 하며 삭제된 장치의 데이터를 수신할 수 있는 다른 디스크에 충분한 공간이 있는 한 작동해야 합니다(사용되지 않는 경우, 이는 분명히 그러한 상황입니다). 하지만 후회하는 것보다 안전한 것이 낫습니다.
작동하지 않고 배열의 나머지 부분에 데이터가 있고 새로 추가된 디스크가 비어 있다고 가정하면 btrfs balance start
다음을 알 수 있습니다.
- 명령(
btrfs balance start
...)은 즉시 반환될 수 있습니다. btrfs balance status /mountpoint
아무런 활동도 보이지 않으며,Data,RAID1
btrfs fi usage
새 장치는 출력 섹션에 나열되지 않습니다 .
그래도 작동하지 않으면 btrfs balance start
마지막 명령(...)을 다시 시도하십시오.
그래도 작동하지 않으면 세 가지 명령을 모두 다시 시도해 보세요.
여러 번의 실행이 항상 필요한지, 이 경우 왜 필요한지 모르겠습니다. (저의 경우 마지막 명령어 자체는 몇번을 실행해도 동작하지 않았습니다. 그런데 장치를 제거했다가 다시 추가하고 나니,그 다음에균형 명령을 두 번 실행했고(약간 경과된 시간과 그 사이에 관련되지 않은 임의의 명령 포함) 두 번째 실행이 시작되었습니다.
또한 이 특별한 경우에는 다음 사항이 적용됩니다.아니요여러 번 시도한 후에도 작동합니다.
- 데이터 밸런싱 전에 별도로 메타데이터 밸런싱을 수행합니다(비슷한 질문에서 제안되고 위 질문에 설명되어 있음).
- 및 매개변수에 매개변수를 추가합니다
,soft
.-mconvert=raid1
-dconvert=raid1