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
이 크기보다 큰 블록은 사용하면 안 됩니다.