g19*_*tic 83 command-line backup compression mount dd
我喜欢在第一次备份系统时创建映像备份。在第一次之后,我使用 rsync 进行增量备份。
我平时的镜像备份如下:
安装并清零空白空间:
dd if=/dev/zero of=temp.dd bs=1M
rm temp.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 到驱动器,但想挂载图像以从中获取单个文件......这可能吗?
通常情况下,人们不会压缩 dd 图像,这将允许您仅使用-o loop
...挂载图像,但这不是我的情况...
有什么建议可以即时安装压缩的 img 吗?
是否会使用AVFS来“挂载”gz 文件然后挂载内部 dd.img 工作(我不这么认为......但需要验证......)?
dou*_*536 82
这取决于磁盘映像是完整磁盘映像还是只是一个分区。
如果磁盘处于良好的工作状态,用零清洗磁盘上的空白空间,您将获得更好的压缩。如果磁盘出现故障,请跳过此步骤。
如果您正在对整个磁盘进行映像,那么您将需要清洗磁盘上的每个分区。
注意:小心,您想将 设置为挂载分区中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
Run Code Online (Sandbox Code Playgroud)
mkdir image
sudo dd if=/dev/sda1 of=image/sda1_backup.img bs=4M
Run Code Online (Sandbox Code Playgroud)
其中sda
是设备名称,1
是分区号。如果要映像不同的设备或分区,请根据您的系统进行相应调整。
mkdir image
sudo dd if=/dev/sda of=image/sda_backup.img bs=4M
Run Code Online (Sandbox Code Playgroud)
sda
设备名称在哪里。如果您想对不同的设备进行映像,请根据您的系统进行相应调整。
制作一个包含完整未压缩图像的“squashfs”图像。
sudo apt-get install squashfs-tools
mksquashfs image squash.img
Run Code Online (Sandbox Code Playgroud)
为了避免将单独的临时文件制作成磁盘的完整大小,您可以流式传输到一个 squashfs 映像。
mkdir empty-dir
mksquashfs empty-dir squash.img -p 'sda_backup.img f 444 root root dd if=/dev/sda bs=4M'
Run Code Online (Sandbox Code Playgroud)
先挂载squashfs镜像,然后挂载挂载的squashfs镜像中存储的分区镜像。
mkdir squash_mount
sudo mount squash.img squash_mount
Run Code Online (Sandbox Code Playgroud)
现在您已经安装了压缩图像,安装图像本身(即在 squashfs 图像内)
mkdir compressed_image
sudo mount squash_mount/sda1_backup.img compressed_image
Run Code Online (Sandbox Code Playgroud)
现在您的图像安装在compressed_image
.
编辑:如果此时您只想将磁盘映像还原到分区上(而不是安装它以浏览/读取内容),只需dd
将映像squash_mount/sda1_backup.img
放在目标上,而不是执行mount
.
这需要您使用名为 kpartx 的包。kpartx 允许您在完整的磁盘映像中安装单个分区。
sudo apt-get install kpartx
Run Code Online (Sandbox Code Playgroud)
首先,挂载包含完整磁盘映像的压缩分区
mkdir compressed_image
sudo mount squash.img compressed_image
Run Code Online (Sandbox Code Playgroud)
现在您需要为完整磁盘映像中的每个分区创建设备:
sudo kpartx -a compressed_image/sda_backup.img
Run Code Online (Sandbox Code Playgroud)
这将为完整磁盘映像中的分区创建设备,/dev/mapper/loopNpP
其中N是分配给环回设备的编号,P是分区编号。例如:/dev/mapper/loop0p1
。
现在您可以在完整磁盘映像中安装各个分区:
mkdir fulldisk_part1
sudo mount /dev/mapper/loop0p1 fulldisk_part1
Run Code Online (Sandbox Code Playgroud)
eri*_*eri 28
尝试 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)
Run Code Online (Sandbox Code Playgroud)
archivemount 是一个基于 FUSE 的文件系统,适用于 Unix 变体,包括 Linux。它的目的是将档案(即 tar、tar.gz 等)挂载到一个挂载点,在那里它可以像任何其他文件系统一样读取或写入。这使得访问可能被压缩的存档内容对其他程序透明,而无需解压缩它们。
http://linuxaria.com/howto/how-to-mounts-an-archive-for-access-as-a-file-system
挂载存档后,您可以像常规文件一样使用它的内容。也许获取分区表,或使用 qemu 工具转换、挂载映像。
squashfs 可用于从映像启动,但备份非常复杂。
Cri*_*itu 16
如果图像是只读的,您还可以使用nbdkit(手册页)及其xz 插件(xz 应提供比 gzip 更好的压缩和随机访问时间)。
dd if=/dev/sda1 bs=16M | xz -9 --block-size=16MiB - > sda1.img.xz
Run Code Online (Sandbox Code Playgroud)
--block-size
16 MiB的选项应该提供良好的随机访问性能。
注意:您可以使用替代的 xz 压缩程序,例如提供并行压缩的pixz,只需确保它将输出分成多个小块,否则nbdkit必须解压缩大量数据。例如,截至 2015 年 9 月,pxz不支持此功能。
nbdkit --no-fork --user nobody --group nobody -i 127.0.0.1 \
xz file=sda1.img.xz
Run Code Online (Sandbox Code Playgroud)
nbd-client 127.0.0.1 10809 /dev/nbd0 -nofork
Run Code Online (Sandbox Code Playgroud)
mount -o ro /dev/nbd0 sda1
Run Code Online (Sandbox Code Playgroud)
umount /dev/nbd0
nbd-client -d /dev/nbd0
Run Code Online (Sandbox Code Playgroud)
按+ (或使用kill)停止nbdkit。CtrlC
小智 11
这个答案补充了Cristian Ciupitu 的答案。 如果使用具有合理块大小的 xz 压缩,则可以使用guestfish或其他libguestfs工具访问磁盘映像,如下所示:
nbdkit xz file=disk.img.xz --run 'guestfish --format=raw -a $nbd -i'
Run Code Online (Sandbox Code Playgroud)
更新:由于 xz 不再是插件,而是变成了过滤器,命令现在是:
nbdkit file disk.img.xz --filter xz --run 'guestfish --format=raw -a $nbd -i'
Run Code Online (Sandbox Code Playgroud)
并不真地。如果不先解压缩整个文件,就无法真正找到压缩文件中的特定块,这使得将压缩图像用作块设备变得困难。
您可以使用dump
和restore
(或tar
,真的)之类的东西,所有这些都使用流格式……因此您可以通过有效地扫描未压缩的流来访问单个文件。这意味着如果您想要的文件位于压缩存档的末尾,您可能需要等待很长时间,但它不需要您将所有内容实际解压缩到磁盘上。
使用tar
备份可能看起来有点老土,但你得到了很多的flexability的。