我喜欢在第一次备份系统时创建映像备份。第一次之后我习惯rsync
做增量备份。
我平时的镜像备份如下:
安装并将空白空间清零:
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
为了让系统恢复正常,我通常会这样做
gzip -dc /mnt/sda1/hda.img.gz | dd of=/dev/hda conv=sync,noerror bs=64K
这非常简单,允许我保存“整个驱动器”,但实际上只是节省已用空间。
问题就在这里。假设我执行了上述操作,但不是在干净的系统上进行的,并且rsync
备份速度不够快,并且图像上有我想要访问的文件。假设我没有存储空间来实际解压缩并将dd
映像保存到驱动器,但想要安装映像以从中获取单个文件......这可能吗?
通常情况下,人们不会压缩图像dd
,这将允许您只使用...安装图像,-o loop
但这不是我的情况...
对于即时安装压缩的 img 有什么建议吗?
会使用AVFS“安装”gz 文件然后安装内部 dd.img 工作(我不这么认为......但需要验证......)?
答案1
这取决于磁盘映像是完整磁盘映像还是只是一个分区。
清洗隔板
如果磁盘工作状况良好,则用零清洗磁盘上的空白空间将获得更好的压缩效果。如果磁盘出现故障,请跳过此步骤。
如果您要对整个磁盘进行映像,那么您将需要清洗磁盘上的每个分区。
警告:小心,你想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
。你可以找到这个号码N
在 的输出中losetup --list
。最近创建的环回设备应该具有最大的N
数字。现在您可以在完整磁盘映像中挂载各个分区:
mkdir fulldisk_part1 sudo mount /dev/mapper/loop0p1 fulldisk_part1
答案2
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 是一个基于 FUSE 的文件系统,适用于 Unix 变体,包括 Linux。其目的是将存档(即 tar、tar.gz 等)挂载到一个挂载点,在该挂载点上可以像任何其他文件系统一样对其进行读取或写入。这使得访问可能被压缩的存档内容对于其他程序来说是透明的,而无需解压缩它们。
http://linuxaria.com/howto/how-to-mounts-an-archive-for-access-as-a-file-system
安装存档后,您可以像常规文件一样使用它的内容。也许获取分区表,或者使用 qemu 工具转换、挂载映像。
squashfs 对于从映像启动很有用,但对于备份来说非常复杂。
答案3
如果图像是只读你也可以使用NBD套件(手册页)及其xz过滤器(xz 应该提供比 gzip 更好的压缩和随机访问时间)。如果你需要暂时地写访问,奶牛(写入时复制)过滤器可能有用。
创建压缩分区映像
dd if=/dev/sda1 bs=16M | xz -9 --block-size=16MiB > sda1.img.xz
16 MiB选项--block-size
应提供良好的随机访问性能。
注意:您可以使用替代的 xz 压缩程序,例如像素它提供并行压缩,只需确保它将输出分成多个小块,否则NBD套件必须解压大量数据。例如截至 2015 年 9 月,像素不支持这个。
与 nbdkit 一起使用
nbdkit --no-fork --user nobody --group nobody -i 127.0.0.1 \
--filter 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
停止NBD套件通过按Ctrl+ C(或使用杀)。
答案4
并不真地。如果不先解压缩整个文件,您就无法真正找到压缩文件中的特定块,这使得很难将压缩图像用作块设备。
您可以使用类似dump
and restore
(或者tar
,实际上)的东西,所有这些都使用流格式......因此您可以通过有效扫描未压缩的流来访问单个文件。这意味着如果您想要的文件位于压缩存档的末尾,您可能需要等待很长时间,但它并不要求您将所有内容实际解压缩到磁盘上。
用于tar
备份可能看起来有点过时,但您可以获得很大的灵活性。