Ext4 파티션의 사용되지 않은 공간만 복제하는 방법

Ext4 파티션의 사용되지 않은 공간만 복제하는 방법

Ext4 파티션의 여유 공간 이미지를 만드는 방법은 무엇입니까?

예: 10GB 파티션에는 5GB 할당 파일이 있고 나머지 5GB 여유/할당되지 않은 공간/데이터의 원시 이미지를 만들어야 합니다.

답변1

이를 사용하여 쉽게 구문 분석할 수 있는 형식으로 목록을 얻을 수 있습니다 dumpe2fs -x /dev/your_partition.Free blocks

# preparation
truncate -s 100M ext4.img
mkfs.ext4 ext4.img
partition=ext4.img

# test
dumpe2fs -x "${partition}"

생산하다


  Free blocks: 0x00014001-0x00016000
  Free inodes: 0x00004d31-0x000054e8
Group 11: (Blocks 0x00016001-0x00018000) csum 0xd1b4 [INODE_UNINIT, BLOCK_UNINIT, ITABLE_ZEROED]
  Block bitmap at 0x0000010e (bg #0 + 269), csum 0x00000000
  Inode bitmap at 0x0000011b (bg #0 + 282), csum 0x00000000
  Inode table at 0x00000bba-0x00000cb0 (bg #0 + 3001)
  8192 free blocks, 1976 free inodes, 0 directories, 1976 unused inodes
  Free blocks: 0x00016001-0x00018000
  Free inodes: 0x000054e9-0x00005ca0
Group 12: (Blocks 0x00018001-0x00018fff) csum 0xa94e [INODE_UNINIT, ITABLE_ZEROED]

이런 식으로 우리는 할 수 있습니다

# preparation
truncate -s 100M ext4.img
mkfs.ext4 ext4.img
partition=ext4.img
targetdir=unused_blocks

# dump, filter
dump=$(dumpe2fs -x "${partition}")

blocksize=$(( $(echo "${dump}" | sed -n 's/Block size: *\(.*\)$/\1/p') ))
echo "Block Size ${blocksize}"

freeblocks=$(echo "${dump}" | sed -n 's/ \+Free blocks: \(.\+\)$/\1/p')

mkdir "${targetdir}"

totalsize=0
for blockrange in ${freeblocks}; do
  beginning=$(( "${blockrange%-*}"   ))
  ending=$(( "${blockrange##*-}"  ))
  length=$(( ${ending} - ${beginning} + 1 ))
  echo "Block found: ${blockrange} start ${beginning} (${blockrange%-*}) end ${ending} (${blockrange##*-}) length ${length}"
  dd "if=${partition}" "of=${targetdir}/${blockrange}.img" "bs=${blocksize}" "skip=${beginning}" "count=${length}"
  totalsize=$(( ${totalsize} + ${length} ))
done
echo "total size: ${totalsize}"

이러한 무료 블록의 원본 이미지가 포함된 블록 표시 범위로 가득 찬 디렉터리를 가져옵니다.


많은 저장 장치(주로 SSD이지만 파티션이 실제로 LVM 씬 볼륨인지 Ceph 블록 저장 장치인지는 알 수 없음)에는 데이터가 전혀 없습니다. discardext4가 수행하는 작업(및 대부분의 이러한 장치) 요즘 다른 파일 시스템) 지원을 통해 기본 저장 장치에 이러한 블록의 데이터를 마음대로 실제로 삭제하도록 지시할 수 있습니다. 즉, 블록에 액세스하려고 할 때 블록이 0이 되도록 효과적으로 만들 수 있습니다.


드물게 단일 항목과 쉼표, 범위가 포함된 "Free Block:" 항목이 있을 수 있다는 사실을 발견했습니다. 이를 위해서는 구문 분석을 추가해야 합니다...

관련 정보