btrfs 파일 시스템 끝 오프셋(이미지 크기)

btrfs 파일 시스템 끝 오프셋(이미지 크기)

10G 이미지 파일에 약 7G의 btrfs 파일 시스템이 있습니다 img.btrfs(minify를 사용했습니다 btrfs fi resize -3G /mnt). 이미지 크기를 줄이기 위해 파일 시스템의 전체 크기(끝 바이트 오프셋)를 어떻게 알 수 있나요? $SIZE즉 알아내다

truncate -s $SIZE img.btrfs

이미지 파일 내의 다른 파일 시스템에 적용할 수 있는 메커니즘은 장점이 될 것입니다.

노트: 한 가지하다직업은 다음과 같습니다.

INITIAL=$(stat -c %s img.btrfs)
mount img.btrfs /mnt
btrfs fi resize -$NBYTES /mnt
umount /mnt
truncate -s $((INITIAL - NBYTES + 1024*1024)) img.btrfs
mount /img.btrfs /mnt
btrfs fi resize max /mnt

즉, btrfs를 축소하고 이미지를 약간 축소한 다음(1M 오버헤드를 남겨두고) btrfs를 축소된 이미지가 제공할 수 있는 최대값으로 늘립니다.

답변1

귀찮게도 btrfs filesystem show크기가 1MB의 배수가 아니면 대략적인 값이 반환됩니다. 또한 루프 장치가 필요하지만 btrfs filesystem show img.btrfs작동하지 않습니다(Debian jessie 기준). 도움이 되는 다른 하위 명령을 찾을 수 없습니다 btrfs.

그러나 file img.btrfs원하는 크기를 반환하는 데 도움이 됩니다.

$ 자르기 -s16684k/tmp/img.btrfs
$ /sbin/mkfs.btrfs /tmp/img.btrfs
SMALL VOLUME: 혼합 메타데이터/데이터 그룹 강제
BTRFS v3.17
자세한 내용은 http://btrfs.wiki.kernel.org를 참조하세요.

호환되지 않는 기능 "mixed-bg" 켜기: 혼합 데이터 및 메타데이터 블록 그룹
호환되지 않는 기능 'extref' 켜기: 파일당 하드 링크 제한을 65536으로 늘립니다.
1703936 크기의 데이터/메타데이터 블록이 생성되었습니다.
/dev/btrfs-control을 열 수 없습니다. 장치 등록을 건너뛰는 중: 권한이 거부되었습니다.
fs가 /tmp/img.btrfs에 태그(비어 있음)를 생성했습니다.
        노드 크기 4096 리프 크기 4096 섹터 크기 4096 크기16.29MiB
$ 자르기 -s 32m /tmp/img.btrfs
$ 파일/tmp/img.btrfs
/tmp/img.btrfs: BTRFS 파일 시스템 섹터 크기 4096, 노드 크기 4096, 리프 크기 4096, UUID=61297945-d399-4fdc-ba9f-750ef9f9dfdb, 28672/17084416사용된 바이트 수, 1개 장치

오프셋 0x10070에서 8바이트 little-endian 값을 직접 읽습니다. 구문 분석된 출력을 원하지 않으면 file추출할 수 있습니다. 다음 POSIX 코드 조각이 작업을 수행합니다.

size_hex=$(cat /tmp/img.btrfs | dd ibs=8 skip=8206 count=1 2>/dev/null | od -tx8 -An | tr abcdef ABCDEF | tr -dc 0-9ABCDEF)
[ ${#size_hex} -eq 16 ] &&
{ echo "ibase=16; $size_hex"; } | bc

또는 Perl에서는:

</tmp/btrfs.img perl -e 'seek(STDIN, 0x10070, 0) or sysread(STDIN, $_, 0x10070) == 0x10070 or die "seek"; sysread(STDIN, $_, 8) == 8 or die "read"; print unpack("Q<", $_), "\n"'

file일부 다른 파일 시스템 유형에서는 작동하지만 출력이 정규화되지 않았기 때문에 스크립트에는 별로 도움이 되지 않습니다. 모든 공통 파일 시스템에서 작동하는 표준 인터페이스를 갖춘 범용 유틸리티(가상화 또는 포렌식 도구 등)는 생각할 수 없습니다.

1 연습: 이것이 왜 유용한가요 cat?

답변2

둘 다 장치의 크기를 단위로 btrfs filesystem show제공합니다 .btrfs filesystem usage메가바이트, 기비바이트 또는 기타 2의 거듭제곱입니다. 접미사 M 또는 G truncate등도 2의 거듭제곱이므로 접미사 M 또는 G 등으로 전달할 수 있습니다 (접미사 MB GB를 사용하지 마세요!). 예를 들어 10M만큼 축소된 1G 이미지의 경우:

sudo btrfs fi show /mnt
 devid    1 size 1014.00MiB used 12.00MiB path /dev/loop0
sudo btrfs fi usage /mnt
 Device size:                1014.00MiB

SIZE=1014M # not MB!
truncate -s $SIZE img.btrfs

이 크기보다 큰 블록은 사용하면 안 됩니다.

관련 정보