btrfs 메타데이터를 확장하는 방법은 무엇입니까?

btrfs 메타데이터를 확장하는 방법은 무엇입니까?

btrfs메타데이터가 가득 찼습니다. (저는 다음을 사용하여 시간별 스냅샷을 생성하고 있습니다.btrbk.)

btrfs파일 시스템 메타데이터에 할당된 공간을 늘리거나 확장하는 방법은 무엇입니까 ?

아니면 자동 확장?

답변1

TL;DR 메타데이터(btrfs가 일반적인 공간 부족 조건을 겪지 않는 경우)는자동으로증가하다. 할당되지 않은 여유 공간이 없으면 자동 증가가 차단됩니다. 그러나 btrfs필요한 것보다 더 많은 공간이 데이터 섹션에 할당되면 다시 할당할 수 있습니다. 이것을 balancebtrfs에서는 -ing이라고 합니다.

지원되는 블록 장치에 할당되지 않은 메모리가 충분하다고 가정하면 btrfs파일 시스템의 메타데이터 부분은 OP가 가정하는 대로 자동 메모리를 할당하여 메타데이터를 늘리거나 확장합니다.

따라서 대답은 다음과 같습니다. 예(메모리/사용 가능한 공간이 부족하지 않은 경우 btrfs), 메타데이터는 다음과 같이 자동으로 증가됩니다.

40GB(1) btrfs의 초기 할당 설정(기기에서 ) 을 살펴보겠습니다 .

$> btrfs filesystem df /
Data, single: total=25.00GiB, used=24.49GiB
System, single: total=32.00MiB, used=16.00KiB
Metadata, single: total=1.55GiB, used=1.33GiB
GlobalReserve, single: total=85.41MiB, used=0.00B

(2) 보시다시피 메타데이터를 저장하기 위해 파일 시스템에 할당된 공간은 1.55GiB이며 그 중 1.33GiB이므로 거의 모두 사용됩니다(OP의 경우 아마도 이런 일이 발생했을 것입니다)

(3) 이제 추가할 메타데이터를 추가합니다. 이를 위해 --reflink=always명령 옵션을 사용하여 /home 폴더를 복사합니다 cp.

$> cp -r --reflink=always /home /home.copy

(4) (/home에 많은 파일이 있다고 가정) 파일 시스템에 많은 새로운 데이터가 추가되고 우리가 사용하는 실제 데이터는 --reflink추가 공간을 거의 사용하지 않기 때문에 쓰기 중 복사 메커니즘을 사용합니다. . 즉, 대부분의 메타데이터가 파일 시스템에 추가됩니다. 우리는 또 다른 모습을 볼 수 있습니다

$> btrfs filesystem df /
Data, single: total=25.00GiB, used=24.65GiB
System, single: total=32.00MiB, used=16.00KiB
Metadata, single: total=2.78GiB, used=2.45GiB
GlobalReserve, single: total=85.41MiB, used=0.00B

여기서 메타데이터에 할당된 공간은 다음 btrfs과 같은 것을 알 수 있다.자동으로확장성을 높입니다.

이 작업은 자동으로 수행되므로 일반적으로 사용자가 감지하지 못합니다. 그러나 어떤 경우에는 대부분의 경우 전체 파일 시스템이 채워집니다. 이러한 경우 btrfs"더듬거리기" 시작하고 메타데이터에 할당된 공간이 자동으로 늘어날 수 있습니다. 예를 들어, 모든 공간이 다양한 부분(Data, System, Metadata, GlobalReserve)에 할당되었기 때문일 수 있습니다. 혼란스럽게도 여전히 분명한 여지가 있을 수 있습니다. 예를 들면 다음과 같습니다.

$> btrfs filesystem df /
Data, single: total=38.12GiB, used=25.01GiB
System, single: total=32.00MiB, used=16.00KiB
Metadata, single: total=1.55GiB, used=1.45GiB
GlobalReserve, single: total=85.41MiB, used=0.00B

볼 수 있듯이 시스템에서는 모든 것이 정상이지만 새 파일의 데이터를 위한 공간이 여전히 있지만 메타데이터(OP의 경우와 같이)가 더 낮기 때문에 40GiB할당이 다소 벗어났습니다 . 파일 시스템을 지원하는 장치에 대해 더 이상 자동으로 메모리를 할당할 수 없습니다(총 할당량을 추가하면 38.12G+1.55G+..~= 40GiB).balancebtrfs

그러나 이제 파일 시스템 부분에 할당된 과도한 여유 공간으로 인해 databtrfs의 균형을 맞추는 것이 유용하거나 심지어 필요합니다 . 밸런싱이란 이미 할당된 공간을 재할당하는 것을 의미합니다.

OP의 경우 어떤 이유로 btrfs할당의 여러 부분 간에 불균형이 발생했다고 가정할 수 있습니다.

불행하게도 원칙적으로 빈 블록(데이터에 할당됨)을 검색하여 이를 더 나은 사용자(거의 소진된 메타데이터 공간)에게 넘겨야 하는 간단한 명령은 sudo btrfs balance -dusage=0완전히 비어 있는 블록을 찾을 수 없기 때문에 실패할 수 있습니다.

따라서 개발자는 btrfs공간을 확보하기 위해 데이터 블록을 재배치해야 하는 시점에 대한 사용 제한을 점진적으로 늘릴 것을 권장합니다.

따라서 결과가 다음과 같다면

$> sudo btrfs balance -dusage=0
Done, had to relocate 0 out of 170 chunks 

재배치 없음, 뭔가 조치를 취해야 함

$> sudo btrfs balance -dusage=5
Done, had to relocate 0 out of 170 chunks  <--(again fail)
$> sudo btrfs balance -dusage=10
Done, had to relocate 0 out of 170 chunks  <--(again fail)
$> sudo btrfs balance -dusage=15
Done, had to relocate 2 out of 170 chunks  <--(success)

btrfs또 다른 대답은 노드 크기의 영향을 암시했는데 , 이는 메타데이터가 얼마나 빨리 증가하는지에 어느 정도 영향을 미칩니다. 다른 답변에서 언급한 바와 같이 노드 크기는 mkfs.btrfs파일 시스템이 생성될 때 한 번만 설정됩니다. 이론적으로 노드 크기를 더 낮은 값으로 변경할 수 있으면(가능한 경우) 메타데이터 크기도 줄일 수 있습니다(그러나 그렇지 않습니다!).

그러나 노드 크기는 어떤 방식으로든 할당된 메타데이터 공간을 확장하거나 늘리는 데 도움이 되지 않습니다. 대신 처음에는 공간을 절약하는 데 도움이 될 수 있습니다. 그러나 노드 크기가 작다고 해서 메타데이터 크기가 줄어드는 것은 아닙니다. 실제로 일부 상황에서는 노드에 더 많은 "링크"가 포함될 수 있기 때문에 노드 크기가 클수록 btrfs의 트리 순회 길이가 줄어든다는 것을 나타낼 수 있습니다.

답변2

~에 따르면btrfs 위키에 대한 FAQ, 이는 불가능하고 달성될 가능성이 낮습니다.

파일 시스템을 다시 생성하지 않고 메타데이터 블록 크기를 변경할 수 있습니까?

아니요, 파일 시스템이 생성되면 mkfs.btrfs -n SIZE에 전달된 값을 변경할 수 없습니다. 백업/복원이 필요합니다. 핵심 기능에 대한 주요 업데이트가 필요하므로 구현되지 않을 수도 있습니다.

기존 btrfs 파일 시스템을 더 큰 btrfs 파일 시스템으로 마이그레이션할 수도 있습니다 -n SIZE. btrfs RAID 및 밸런싱을 사용하여 기존 파일 시스템에 추가한 다음 이전 파일 시스템을 제거할 수도 있습니다.

당신은 또한 볼 수 있습니다거의 전체 드라이브에 대한 부분.

답변3

어제 df -h디스크가 가득 찬 것으로 나타났지만 여전히 4G의 여유 공간이 있습니다.

Filesystem                Size      Used Available Use% Mounted on
/dev/sdb3                29.3G     25.9G      0  100% /mnt/sdb3

그래서 btrfs fi df /mnt/sdb3메타데이터가 꽉 차 있는지 확인하려고 메타데이터 확장을 시도했는데 다시 작동했습니다.

다른 디스크에 5G 파일을 만들어 losetup드라이브로 사용

dd if=/dev/zero of=/mnt/sda1/tmpBtrfs.img bs=1G count=5
losetup -v -f /mnt/sda1/tmpBtrfs.img

디스크에 추가하고 df -h사용 가능한 9G 확인

btrfs device add /dev/loop1 /mnt/sdb3

여유 공간을 확보하기 위한 균형

btrfs bal start /mnt/sdb3

그리고 방금 추가한 5g 디스크를 삭제합니다.

btrfs device delete /dev/loop1 /mnt/sdb3
losetup -d /mnt/sda1/tmpBtrfs.img
rm /mnt/sda1/tmpBtrfs.img

그러면 메타데이터가 자동으로 확장됩니다(사용된 양의 약 2배).

관련 정보