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의 공간이 데이터 청크에 할당됩니다 (거의 모든 디스크는 일반 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이 채워지지 않아 대부분의 경우 몇 초 만에 완료됩니다.


이 포괄적 인 대답에 대해 당신보다. 상황은 -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.