여기서 일어나는 일을 이해하려면 먼저 BTRFS가 2 단계 할당자를 사용한다는 것을 이해해야합니다. 첫 번째 단계에서는 정확히 한 가지 유형의 할당, 즉 데이터 (파일의 데이터에만 사용됨), 메타 데이터 (파일 이름, 디렉토리 등과 같은 것)에 사용되는 큰 덩어리의 공간 (실제로는 대부분의 문서에서 '덩어리'라고 함)을 할당합니다. 구조, 액세스 시간, 소유권, 사용 권한 등) 또는 시스템 (청크 할당에 대한 데이터 만 저장하는 데 사용됨). 일단 청크가 할당되면 그 청크의 공간은 모든 데이터를 밖으로 이동 시켜야만 해제 될 수 있습니다.
그렇다면 파일 시스템의 관점에서 정확히 무엇을 의미합니까?
글쎄, btrfs filesystem df
다음을 보여줍니다 :
Data, RAID1: total=446.12GiB, used=133.29GiB
System, RAID1: total=8.00MiB, used=80.00KiB
Metadata, RAID1: total=1.00GiB, used=609.05MiB
GlobalReserve, single: total=405.53MiB, used=0.00B
그만큼 total
값은 해당 유형의 청크에 할당 된 공간의 양을 나타내며 used
값은 해당 청크 내에서 사용중인 공간의 양을 나타냅니다. 귀하의 경우, 446.32GB의 공간이 데이터 청크에 할당됩니다 (거의 모든 디스크는 일반 df
과 btrfs filesystem show
출력). 그러나 실제로 사용되는 공간은 133.29GB뿐입니다. BTRFS가 설명 된 현상과 증상을 감안할 때 BTRFS는 메타 데이터 청크를 할당하려고 시도하지만 공간을 확보하지 못하기 때문에 (빈 공간이 이미 할당 된 청크 안에 있기 때문에) 대신 오류가 발생합니다.
이를 복구하려면 균형을 잡아야합니다. 균형은 문자 그대로 부분적으로 전체 덩어리로 물건을 포장하기 때문에 빈 또는 대부분 빈 덩어리를 풀어주는 효과가있는 할당자를 통해 선택한 덩어리 (또는 옵션을 건네주지 않으면 모두)의 모든 데이터를 다시 문자 그대로 전송합니다.
나는 다음과 같이 시작할 것입니다.
btrfs balance start -dusage=0 /mnt/ssd
그러면 실제 데이터가없는 모든 데이터 청크가 제거되어 나중에 다시 작동하도록 할 수는 있지만 나중에 동일한 문제에 취약하게됩니다.
컴팩트 한 작업을 완벽하게 수행하려면 위의 명령을 -dusage
선택권. 나는 대개 50 번까지 매번 5 번씩 뛰어냅니다 (과거 50 번, 보통 시간 낭비). 사용량 필터 (데이터 청크 처리에만 지정됨)는 최대 비율로만 청크를 선택하도록 균형을 알려주기 때문에 점진적으로 조금씩 단계적으로 늘리면 다른 문제를 실행하지 않고도보다 쉽게 작업을 압축 할 수 있습니다.
당신은 다음과 같은 것을 정기적으로 (나는 보통 시스템에서 매일 실행) 다음과 같이 실행함으로써이 문제를 해결할 수 있습니다.
btrfs balance start -dusage=25 -dlimit=10 -musage=25 -mlimit=10 /mnt/ssd
그러면 첫 번째 10 개의 데이터와 메타 데이터 청크의 1/4이 채워지지 않아 대부분의 경우 몇 초 만에 완료됩니다.