gzip 압축 dd 이미지를 즉석에서 마운트 할 수 있습니까?


66

시스템을 처음 백업 할 때 이미지 백업을 만드는 것이 좋습니다. 처음으로 rsync를 사용하여 증분 백업을 수행합니다.

일반적인 이미지 백업은 다음과 같습니다.

빈 공간을 마운트하고 0으로 만듭니다.

dd if=/dev/zero of=temp.dd bs=1M

rm temp.dd

압축하는 동안 드라이브를 마운트 해제하고 dd

dd if=/dev/hda conv=sync,noerror bs=64K | gzip -c > /mnt/sda1/hda.ddimg.gz

시스템을 정상으로 되돌리려면 보통

gunzip -c /mnt/sda1/hda.img.gz | dd of=/dev/hda conv=sync,noerror bs=64K

이것은 정말 간단하며 '전체 드라이브'를 저장할 수는 있지만 실제로 사용한 공간을 절약 할 수 있습니다.

여기에 문제가 있습니다. 위의 작업을 수행하지만 깨끗한 시스템에서는 실행하지 않고 rsync 백업이 곧 실행되지 않으며 이미지에 액세스하려는 파일이 있다고 가정 해 보겠습니다. 실제로 압축을 풀고 드라이브에 이미지를 저장할 저장 공간이 없지만 개별 파일을 가져 오기 위해 이미지를 마운트하고 싶다고 가정 해 보겠습니다. 이것이 가능합니까?

일반적으로 dd 이미지를 압축하지 않으므로 다음을 사용하여 이미지를 마운트 할 수 -o loop있지만 ... 내 경우는 아닙니다 ...

압축 된 img를 즉시 장착하기위한 제안 사항이 있습니까?

AVFS 를 사용하여 gz 파일을 '마운트'한 다음 내부 dd.img 작업을 마운팅 할 것입니까?


SquashFS이런 종류의 것들에 사용해야 합니다. 또한 중복 된 파일의 중복을 제거합니다.
Avio

이 동료가 당신이 요구하는 것을하고있는 것 같습니다 : blogs.gnome.org/muelli/2012/10/…
Joshua

나는 두 번째로 Avio의 제안입니다. squashfs가 보관하지 않는 유일한 것은 acls입니다. 그것은 xattrs, 그래서 selinux 속성 등을 보관합니다. acls를 사용하지 않는다면, squashfs는 IMHO로가는 길입니다. 최근에 이미 새 스토리지로 마이그레이션 된 일부 오래된 드라이브를 "경우에 따라"아카이브해야했으며 squashfs가 그 작업에 완벽했습니다.
Kuba Ober

답변:


66

디스크 이미지가 전체 디스크 이미지인지 아니면 파티션인지에 따라 다릅니다.

파티션 세척

디스크의 상태가 양호하면 디스크의 빈 공간을 0으로 씻으면 더 나은 압축을 얻을 수 있습니다. 디스크에 문제가 있으면이 단계를 건너 뛰십시오.

전체 디스크를 이미징하는 경우 디스크의 각 파티션을 씻어야합니다.

주의 : 파티션 항목이 아니라 마운트 된 파티션 of파일로 파일 을 설정하려고합니다 .

mkdir image_source
sudo mount /dev/sda1 image_source
dd if=/dev/zero of=image_source/wash.tmp bs=4M
rm image_source/wash.tmp
sudo umount image_source

파티션 이미지 만들기

mkdir image
sudo dd if=/dev/sda1 of=image/sda1_backup.img bs=4M

여기서 sda장치 이름은 1파티션 번호입니다. 다른 장치 나 파티션을 이미지로 만들려면 시스템에 맞게 조정하십시오.

전체 디스크 이미지 만들기

mkdir image
sudo dd if=/dev/sda of=image/sda_backup.img bs=4M

sda장치 이름은 어디에 있습니까 ? 다른 장치를 이미징하려면 시스템에 맞게 조정하십시오.

압축

압축되지 않은 전체 이미지가 포함 된 "squashfs"이미지를 만드십시오.

sudo apt-get install squashfs-tools
mksquashfs image squash.img

스트리밍 압축

별도의 임시 파일을 디스크의 전체 크기로 만들지 않으려면 squashfs 이미지로 스트리밍 할 수 있습니다.

mkdir empty-dir
mksquashfs empty-dir squash.img -p 'sda_backup.img f 444 root root dd if=/dev/sda bs=4M'

압축 파티션 이미지 마운트

먼저 squashfs 이미지를 마운트 한 다음 마운트 된 squashfs 이미지에 저장된 파티션 이미지를 마운트하십시오.

mkdir squash_mount
sudo mount squash.img squash_mount

이제 압축 된 이미지를 마운트했습니다. 이미지 자체를 마운트하십시오 (즉, squashfs 이미지 안에 있음).

mkdir compressed_image
sudo mount squash_mount/sda1_backup.img compressed_image

이제 이미지가 아래에 마운트되었습니다 compressed_image.

편집 :이 시점에서 디스크 이미지를 파티션에 복원하여 내용을 찾아보고 읽지 않고 단순히 이미지를 복원 하려면 대상 대신 dd이미지를 squash_mount/sda1_backup.img수행하십시오 mount.

압축 된 전체 디스크 이미지 마운트

kpartx라는 패키지를 사용해야합니다. kpartx를 사용하면 개별 파티션을 전체 디스크 이미지로 마운트 할 수 있습니다.

sudo apt-get install kpartx

먼저 전체 디스크 이미지가 포함 된 스쿼시 파티션을 마운트하십시오.

mkdir compressed_image
sudo mount squash.img compressed_image

이제 전체 디스크 이미지에서 각 파티션에 대한 장치를 작성해야합니다.

sudo kpartx -a compressed_image/sda_backup.img

그러면 전체 디스크 이미지에서 파티션에 대한 장치가 생성됩니다. /dev/mapper/loopNpP여기서 N 은 루프백 장치에 할당 된 번호이고 P 는 파티션 번호입니다. 예를 들면 다음과 같습니다 /dev/mapper/loop0p1..

이제 전체 파티션 이미지에 개별 파티션을 마운트 할 수 있습니다.

mkdir fulldisk_part1
sudo mount /dev/mapper/loop0p1 fulldisk_part1

이 문제에 대한 흥미로운 이해 (gzip 대신 squashs). 나는 squashfs 도구에 익숙하지 않다. dd의 출력을 파이프하여 gzip 파티션으로 가능한 한 즉시 스쿼시 파티션을 만들 수 있습니까? 압축 비율은 무엇입니까 (gzip은 괜찮습니다 / 예를 들어, '0이있는 빈 공간'을 지우고 있다는 사실을 감안할 때)?
g19fanatic

이미지를 하드 디스크에 어떻게 다시 넣겠습니까?
g19fanatic

2
@ g19fanatic 압축되지 않은 디스크 이미지는 squashfs 이미지의 "내부"입니다. squashfs 이미지를 마운트 한 다음 이미지를 대상 디스크에 dd하십시오.
doug65536

@ g19fanatic 압축이 우수했습니다 (제 경우에는 gzip과 거의 동일). mksquashfs도 빠르며 병렬화되었습니다. 내 990x (6 코어)에서는 실제로 대상 디스크 쓰기 속도가 약 100MB / 초로 제한되었습니다.
doug65536

3
@ g19fanatic -p또는 -pf플래그를 사용하여 의사 파일 로 스쿼시 파일 로 스트리밍 할 수 있습니다 . 의사 파일은 루트 없이는 할 수없는 장치 노드 만들기 (빌드 프로세스의 일부로 이미지를 빌드하는 데 유용) 나 일부 명령의 출력을 이미지로 스트리밍하는 데 사용할 수 있습니다. 문서 ( /usr/share/doc/squashfs-tools/examples/pseudo-file.exampleDebian / Ubuntu)에 제공된 예제 중 하나는 input f 444 root root dd if=/dev/sda1 bs=1024 count=10디스크 이미지의 첫 10K를 squashfs 이미지의 "input"파일로 복사하는 것입니다.
브라이언 캠벨

15

이미지가 읽기 전용 인 경우 nbdkit ( man page ) 및 해당 xz 플러그인 을 사용할 수도 있습니다 (xz는 gzip보다 더 나은 압축 및 임의 액세스 시간을 제공해야 함).

압축 파티션 이미지 생성

dd if=/dev/sda1 bs=16M | xz -9 --block-size=16MiB - > sda1.img.xz

--block-size16 MIB 정보 옵션은 좋은 랜덤 액세스 성능을 제공한다.

참고 : 병렬 압축을 제공하는 pixz 와 같은 대체 xz 압축 프로그램을 사용할 수 있습니다 . 출력을 여러 개의 작은 블록으로 분할해야합니다. 그렇지 않으면 nbdkit 이 많은 데이터를 압축 해제해야합니다. 예를 들어 2015 년 9 월 현재 pxz 는이를 지원하지 않습니다.

nbdkit으로 제공

nbdkit --no-fork --user nobody --group nobody -i 127.0.0.1 \
       xz file=sda1.img.xz

NBD 서버에 연결

nbd-client 127.0.0.1 10809 /dev/nbd0 -nofork

읽기 전용으로 마운트

mount -o ro /dev/nbd0 sda1

완료되면

umount /dev/nbd0
nbd-client -d /dev/nbd0

+ (또는 kill ) 를 눌러 nbdkit 을 중지하십시오 .CtrlC


15

시험 archivemount

root@srv1:/backup# archivemount windows-2003-S.gz /target/
Unrecognized archive format
root@srv1:/backup# archivemount -o formatraw windows-2003-S.gz /target/
Calculating uncompressed file size. Please wait.
root@srv1:/backup# ls /target/
data
root@srv1:/backup# file /target/data
/target/data: DOS/MBR boot sector; partition 1 : ID=0x7, start-CHS (0x0,1,1), end-CHS (0x3ff,254,63), startsector 63, 58717512 sectors, extended partition table (last)

archivemount는 Linux를 포함한 Unix 변형 용 FUSE 기반 파일 시스템입니다. 그 목적은 아카이브 (예 : tar, tar.gz 등)를 다른 파일 시스템에서 읽거나 쓸 수있는 마운트 지점에 마운트하는 것입니다. 이렇게하면 압축을 풀지 않고 다른 프로그램에 압축되어 투명하게 보관 될 수있는 아카이브의 내용에 액세스 할 수 있습니다.

http://linuxaria.com/howto/how-to-mounts-an-archive-for-access-as-a-file-system

아카이브를 마운트 한 후에는 일반 파일처럼 컨텐츠를 사용할 수 있습니다. qemu 도구로 파티션 테이블을 가져 오거나 이미지를 마운트하여 마운트하십시오.

squashfs는 이미지에서 부팅하는 데 유용하지만 백업에는 훨씬 복잡합니다.


완전한! 이것은 지금까지 가장 쉽고 우아한 솔루션입니다. 여기에 투표가없는 이유가 궁금합니다.
TranslucentCloud

/ mnt /와 같이 archivemount가있는 폴더에 disk.img.gz와 같은 아카이브를 마운트하면 /mnt/disk.img라는 단일 파일이 생성되므로 다른 위치에 마운트해야하기 때문입니다. 이 질문은 대신 단일 단계에서 둘 다 풀 수있는 것을 원합니다 (아카이브 마운트는 .tar.gz에서는 가능하지만 gzipped raw 이미지에서는 불가능합니다).
p91paul

2
이 답변도 매우 흥미 롭습니다. 나는 스쿼시가 더 많은 인식을 가지고 있기 때문에 더 많은 사랑을 얻는다고 믿는다. 나는 이름을 즉시 인식했지만 archivemount에 대해 들어 본 적이 없습니다. 나도 기회를 주어야 할 것이다!
g19fanatic

2
archivemount 명령에 의해 생성 된 이미지를 마운트 할 수 없습니다dd if=/dev/hda conv=sync,noerror bs=64K | gzip -c > /mnt/sda1/hda.ddimg.gz
Sergei

3
동의-작성시 archivemount는 gzip으로 압축되었지만 일반 gzip으로 압축되지 않은 tar 아카이브를 지원합니다.
mwfearnley

10

이 답변은 Cristian Ciupitu의 답변을 보완 합니다. 적당한 블록 크기로 xz 압축을 사용하는 경우 guestfish 또는 다음과 같은 다른 libguestfs 도구를 사용하여 디스크 이미지에 액세스 할 수 있습니다 .

nbdkit xz file=disk.img.xz --run 'guestfish --format=raw -a $nbd -i'

8

실제로는 아닙니다. 압축을 풀지 않고 압축 파일에서 특정 블록을 찾을 수 없으므로 압축 된 이미지를 블록 장치로 사용하기가 어렵습니다.

스트리밍 형식을 사용하는 dumprestore(또는 tar실제로) 같은 것을 사용할 수 있으므로 압축되지 않은 스트림을 효과적으로 스캔하여 개별 파일에 액세스 할 수 있습니다. 원하는 파일이 압축 된 아카이브의 끝에있는 경우 시간이 오래 걸릴 수 있지만 실제로 모든 파일을 디스크에 압축 해제 할 필요는 없습니다.

tar백업에 사용하면 약간 구식이 될 수 있지만 많은 유연성을 얻을 수 있습니다.


1
문제는 관심있는 파일이 실제로이 압축 백업에 있는지 알 수 없다는 사실에 있습니다 ... 전체 .gz의 이미지를 통과하는 파일 탐색기를 알고 파일 / 디렉토리를 유지하십시오 메모리의 구조, 구조의 간단한보기를 제공하고 추출 할 파일 (현재 위치를 알고 있음)을 '선택'할 수 있습니까? 그것은 매우 틈새 사양입니다 ...하지만이 같은 경우에 대한 많은 용도를 볼 수 있습니다 ... 존재하는 경우.
g19fanatic

1
그렇지 않은 경우 gz'd 이미지에서 구조를 가져 오는 방법에 대한 지침을 알려주시겠습니까? 나는 그러한 프로그램 (생활을위한 프로그램 ...)을 만들 수는 있지만 이미지 데이터의 압축 해제 주제와 다른 파일 시스템의 세부 사항에 대해서는 눈을 멀게합니다.
g19fanatic 2012

자신의 도구를 만드는 것이 실제로 수행하려는 것보다 더 큰 프로젝트가 될 것으로 생각됩니다. 그러나 ... ext [234] 파일 시스템이 있다고 가정하면 e2fsprogs 패키지 또는 fuse-ext2 와 같은 패키지를 제안합니다 . 둘 다 ext [234] 파일 시스템과 상호 작용하기위한 사용자 공간 도구를 제공합니다.
larsks

또한 파일 시스템 이미지가 아닌 것은 전체 디스크 이미지이므로 먼저 파티션 테이블을 구문 분석하고 적절한 파티션을 찾아야합니다.
larsks

위의 질문에 잘못 입력하여 해결할 것입니다. 나는 일반적으로 파티션 기반 dd 이미지를 수행하고 파티션 테이블의 사본을 저장합니다. 나는 전체 디스크 사본을 사용했지만 적절한 위치에 도달하기 위해 옵션으로 마운트 해야하는 것을 싫어했습니다.
g19fanatic

3

Cristian Ciupitu의 답변에 대한 또 다른 부록 :

당신이 사용하는 경우 nbdkit마운트하기 위해 전체 디스크 이미지를 (파티션 이미지 대), 당신은 NBD 서버에 연결할 때, 블록 크기 (디스크의 섹터 크기)를 지정해야하는 것이 아니라 기본적으로 수 1024바이트. 512바이트를 대신 사용하려면

nbd-client 127.0.0.1 /dev/nbd0 -b 512 -n

그런 다음 디스크가로 나타나고를 /dev/nbd0사용하여 파티션 테이블을 볼 수 있어야합니다 fdisk -l. 그러나, 파티션은 아직 장착되지 않습니다 - 사용 kpartx(에서 doug65536의 대답은 ) 파티션, 예를 들면위한 장치를 만들 :

kpartx -arv /dev/nbd0

마지막으로 파티션이에 나타나고 /dev/mapper/평소대로 마운트 할 수 있습니다. -o roxz 플러그인은 읽기만 지원하므로 읽기 전용 모드 ( ) 를 사용해야 합니다.

mount -o ro /dev/mapper/nbd0p3 /mnt
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.