btrfs, 디스크 공간이 없습니다.


2

btrfs 볼륨의 디스크 공간에 문제가 있습니다. df 디스크 공간이 충분하다는 것을 보여줍니다. 하지만 10GB 테스트 파일 시스템을 복사하려고 할 때이 장치에 디스크 공간이 없다고 말합니다.

df -h | grep /mnt/ssd:

/dev/sda 448G 135G 313G 31% /mnt/ssd

같음 :

btrfs filesystem df /mnt/ssd:

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

나는 이것의 산출물을 읽는 법을 모른다 :

sudo btrfs filesystem show:

Label: none  uuid: aba64e21-69d1-46c1-b3f2-dfda832b67fd
    Total devices 2 FS bytes used 133.88GiB
    devid    1 size 447.13GiB used 447.13GiB path /dev/sda
    devid    2 size 447.13GiB used 447.13GiB path /dev/sdb

그래서 133.88GiB 또는 447.13GiB가 사용됩니까? 매우 혼란 스럽다.

답변:


3

여기서 일어나는 일을 이해하려면 먼저 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의 공간이 데이터 청크에 할당됩니다 (거의 모든 디스크는 일반 dfbtrfs 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이 채워지지 않아 대부분의 경우 몇 초 만에 완료됩니다.


이 포괄적 인 대답에 대해 당신보다. 상황은 -dusage = 25와 균형을 이룬 후에 더 좋아졌습니다. 이제는 약 50 %의 공간을 무료로 사용할 수 있습니다. :) 50 달러 이상의 돈을 버는 것이 시간을 낭비하는 이유를 말씀해 주시겠습니까?
Kristopher

@Kristopher 그것은 기본적으로 효율성 문제입니다. 청크에 데이터가 많을수록 데이터를 새 청크로 이동하는 데 시간이 오래 걸리며 이러한 유형의 문제를 해결할 때 얻을 수있는 이점이 줄어 듭니다. 반만 채워진 청크에만 집중하면 많은 공간을 확보 할 수 있다는 합리적인 보장이있는 반면 절반 이상인 청크의 균형은 단일 청크를 해제 할 수 있습니다 (모든 청크가 해제되면 ).
Austin Hemmelgarn

1

나는 HDD에 Btrfs 파일 시스템을 가진이 유형의 문제를 본 적이 없지만 내 SSD에서 동일하게 사용했습니다. SSD는 어떤 블록이 실제로 비어 있는지 알지 못하므로이를자를 필요가 있습니다.

그러나 문제가 발생하면 fstrim -v /mnt/ssd 공간이 거의 다 보여지지 않습니다! 내 솔루션 :

btrfs balance start /mnt/ssd
  #  you can monitor its progress by 'btrfs balance status /mnt/ssd'
fstrim -v /mnt/ssd

두 번째 명령은 이번에 많은 공간을 줄여야합니다. 이 후 내 자유 공간은 실제로 사용할 수 있습니다.

그러나 : 단일 SSD에서 Btrfs를 사용하고 있습니다. 아니 내 경우에는 RAID를 사용하고 어떤 차이가 있는지 알지 못합니다 (귀하의 의견에 의존하고 있습니다).


혼란스러운 부분 : Btrfs는 파일 시스템으로 할당 된 장치 (또는 장치) 내에서 자체를 확대하거나 축소 할 수 있습니다. 현재로서는 파일 시스템이 비 대한 것입니다. 그것은 전체를 사용한다. 447.13GiB 모든 기기에서 이 공간 전체가 "사용 중"이라고 생각합니다. fstrim 걱정된다. 파일 시스템 내부 133.29GiB 그래도 실제 데이터에 의해 사용됩니다. 파일 시스템의 균형을 잡으면 파일 크기를 줄여야합니다. fstrim 그 일을 할 수 있습니다.

파일 시스템은 시간이지나면서 다시 부 풀릴 것입니다. 그래서 위의 유지 관리를 정기적으로 수행하는 것을 배웠습니다. 특히 apt-get upgrade.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.