img의 빈 영역을 백업하지 않고 사용한 데이터만 백업하는 방법은 무엇인가요?

img의 빈 영역을 백업하지 않고 사용한 데이터만 백업하는 방법은 무엇인가요?

Raspbian 시스템 파일이 손상되어 영원히 사라질 경우를 대비해 백업하고 싶습니다. 하지만 SD 카드의 메모리는 32G이므로 전통적인 방법을 사용하면 dd는 일반적으로 저장 공간이 32G인 이미지를 생성하게 됩니다. 하지만 실제로는 4G의 저장공간만 사용되었고 나머지 28G는 비어있습니다. win32imager 도구를 사용해도 결과는 동일합니다.

내 질문은: img를 저장하는 데 더 적은 공간만 필요하도록 img를 더 작게 만들 수 있도록 사용한 데이터만 사용하여 img를 백업할 수 있습니까?

온라인에서 이것이 가능하다고 주장하는 사람을 봤습니다. 스크립트는 다음과 같습니다.

#!/bin/sh
sudo dd if=/dev/zero of=raspberrypi.img bs=1MB count=2500
sudo parted raspberrypi.img --script -- mklabel msdos
sudo parted raspberrypi.img --script -- mkpart primary fat32 8192s 122879s
sudo parted raspberrypi.img --script -- mkpart primary ext4 122880s -1

loopdevice=`sudo losetup -f --show raspberrypi.img`
device=`sudo kpartx -va $loopdevice | sed -E 's/.*(loop[0-9])p.*/\1/g' | head -1`
device="/dev/mapper/${device}"
partBoot="${device}p1"
partRoot="${device}p2"
sudo mkfs.vfat $partBoot
sudo mkfs.ext4 $partRoot
sudo mount -t vfat $partBoot /media
sudo cp -rfp /boot/* /media/
sudo umount /media
sudo mount -t ext4 $partRoot /media/
cd /media
sudo dump -0uaf - / | sudo restore -rf -
cd
sudo umount /media
sudo kpartx -d $loopdevice
sudo losetup -d $loopdevice

불행히도 이 스크립트는 img를 완전히 생성할 수 없고 스크립트가 오류와 함께 완료되기 때문에 작동하지 않습니다.

누구든지 어떤 아이디어가 있습니까? 매우 감사합니다!

감사합니다,

헬렌

답변1

시스템을 일정 기간 사용한 후에는 해당 4GB가 SD 카드의 어디에 저장되어 있는지 정확하게 분석해야 하기 때문에 dd장치를 처음부터 시작하는 것은 위험합니다.

압축 유틸리티를 통해 이미지를 전송하는 것이 좋습니다. 내용이 없는 큰 공간이라도 압축된 이미지에서는 공간을 거의 차지하지 않습니다.

dd if=/dev/sdxxx conv=sync,noerror bs=64K | gzip -c > sdxxx.image.gz

답변2

각 실행 루프를 수용할 수 없다면 shrink filesystem -> backup -> grow filesystem(파일 시스템이 축소 및 증가를 지원하고 이러한 반복 루프를 중단 없이 견딜 수 있을 만큼 견고하다고 가정) 블록 수준 백업을 고려해서는 안 됩니다(예:분할dd로 생성된 이미지), 파일 시스템 수준 백업(예:파일 시스템사용되지 않은 블록을 건너뛰는 partclone 등으로 생성된 이미지파일 시스템 인식) 또는 파일 기반 백업(예: tar, rsync...).

답변3

Ghost(유료) 또는 Clonezilla(무료 및 무료)와 같은 시스템 이미징 도구를 사용하세요.

Pi 이미지를 복제하려면 SD 카드를 컴퓨터에 넣고 clonezilla를 시작한 다음 전체 SD 카드 이미지를 하드 드라이브의 파일에 덤프합니다. 복구는 반대 과정입니다.

답변4

대답은 '예'입니다.

백업하려는 데이터를 정확히 알고 있어야 합니다. 32G 스토리지 디스크에 4G 데이터가 있다고 가정합니다.

사용법: seek and countdd와 함께 사용됩니다.

드라이브에서 4G 복사

dd=if/dev/sdb1 of=mybackup.iso bs=1M count=4096 conv=noerror,sync

위의 내용은 /dev/sdb1 파티션에서 4G를 복사합니다. 하지만 xMB에서 xGB로 데이터를 복사하도록 결정할 수 있습니다.

dd=if/dev/sdb1 of=mybackup.iso bs=1M seek=xMB count=x noerror,sync

우리는 앞으로 이동하기 위해 탐색을 사용하므로 seek=2G는 처음부터 시작하는 대신 2G에서 복사를 시작합니다. Count=x는 복사해야 하는 데이터의 양이므로 count=4096은 4096 x 1MB = 4G를 복사합니다.

다음을 사용하여 lsblk블록을 표시 하는 것을 잊지 마십시오.

NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda      8:0    0  37.3G  0 disk
|-sda1   8:1    0  19.5G  0 part /
|-sda2   8:2    0  17.2G  0 part /home
`-sda3   8:3    0   511M  0 part [SWAP]

fdisk /dev/sdb
Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        4096    40962047    20478976   83  Linux
/dev/sda2        40962048    77111295    18074624   83  Linux
/dev/sda3        77111296    78157823      523264   82  Linux swap / Solaris

관련 정보