![如何对整个硬盘和分区表进行完全增量、可搜索的备份?](https://linux22.com/image/127723/%E5%A6%82%E4%BD%95%E5%AF%B9%E6%95%B4%E4%B8%AA%E7%A1%AC%E7%9B%98%E5%92%8C%E5%88%86%E5%8C%BA%E8%A1%A8%E8%BF%9B%E8%A1%8C%E5%AE%8C%E5%85%A8%E5%A2%9E%E9%87%8F%E3%80%81%E5%8F%AF%E6%90%9C%E7%B4%A2%E7%9A%84%E5%A4%87%E4%BB%BD%EF%BC%9F.png)
在 UEFI 出现之前,这曾经很容易。您只需使用 dd 备份前 63 个扇区,然后使用 rsync 来维护 / 分区中所有内容的副本。
现在有没有简单的方法可以做到同样的事情,其中将 efi 分区安装为 /boot/efi,然后使用 / 挂载点和交换来安装主 ext4 分区?
答案1
使用rsync备份根分区和ESP(EFI系统分区)上的文件。如果您还想要分区表的副本,可以使用 的sgdisk
( -b
backup) 选项将分区表的备份保存到文件中。使用-l
(加载)来恢复。 sgdisk 手册页建议您仅将备份恢复到同一磁盘,因为即使在名义上大小相同的磁盘上,大小也可能略有不同。无论如何,如果您只是手动重新创建分区,情况可能会更好。
我认为使用 UEFI 备份磁盘更加容易,因为除了分区表之外的所有内容都在文件中,而不是像第一个 GRUB 阶段那样在 msgic、非分区扇区中。
答案2
dd if=/dev/sda of=/my/backup/image.img bs=8M
当我需要 EFI 在备份的驱动器上保持完整时,我倾向于将整个设备映像到映像文件。
这可能有点矫枉过正(而且耗时),但这是我所知道的最简单的方法。
如果需要,您可以将映像安装为循环设备并浏览/管理其中的文件。gnome-disk-utility
提供了一个易于使用的 GUI 来处理这个问题。
答案3
此备份将复制分区表,然后对分区内容进行增量备份rsync
。相对于盲目完整备份的优点dd
是,您可以经常快速更新备份,并且只有已更改的信息才会更新,而且您可以在副本中轻松访问所有文件,并且可以在之前修改它们恢复备份,或仅拯救其中的一些。
我正在使用 Debian Stretch(命令可能有不同的名称,例如 RedHat)
这里的一切都是以 root 身份完成的,所以要小心!:
su
查看哪个硬盘被识别为sda、sdb等
fdisk -l
我看到我要备份的笔记本电脑硬盘驱动器名为
/dev/sda
(sda1、sda2...是分区)。警告:不要盲目复制行。我假设我要备份的硬盘驱动器是,
/dev/sda
但可能不是您的情况。将外部硬盘安装到我们要存储备份副本的位置:
通过再次执行,
fdisk -l
我可以看到它的名字是 now/dev/sdb
。 Debian Stretch 将其挂载,/media/[username]/[whatever]
但我更喜欢将其作为 root 挂载在 下/mnt/USB/
,因此:umount /media/[username]... mkdir /mnt/USB/ # this is done only this first time mount -t auto /dev/sdb1 /mnt/USB -rw mkdir /mnt/USB/backup #this is done only this first time mkdir /mnt/USB/backup/partition_table #this is done only this first time mkdir /mnt/USB/backup/files #this is done only this first time
判断分区表类型是MBR还是GPT
parted /dev/sda print
您会看到“分区表:gpt”或“分区表:msdos”
将分区表备份到外部硬盘中的文件
如果您有 MBR 表(分区表:msdos):
我们可以对存储分区表的所有扇区进行完整的二进制备份:
dd if=/dev/sda of=/mnt/USB/backup/partition_table/backup-sda.mbr bs=512 count=1
(稍后我们将看到如何恢复它)
备注:我更喜欢
dd
后者,sfdisk
因为后者会要求你确认是否要向分区表写入一些更改,而在我尝试的过程中,我不小心按了“Y”,所以很容易搞砸。如果您有 GPT 表
sgdisk --backup=/mnt/USB/backup/partition_table/gpt_partition_table.bin /dev/sda
(稍后我们将看到如何恢复它)
将所有文件增量备份到外部驱动器:
这假设您像我一样,在硬盘驱动器中安装了一个 Linux 发行版,并且所有信息树都挂在
/
(请各位知识渊博的 Linux 人员以更技术性的方式重写此内容)。就我而言,备份所有内容可以/
解决问题,因为 efi 分区已挂载,因此/boot/efi
其内容也将包含在备份中:rsync -aAXv /* /mnt/USB/backup_of_laptop_hd/files --exclude={/dev/,/过程/,/系统/,/tmp/,/跑步/,/mnt/,/媒体/,/丢失+找到,/家//.gvfs,/var/tmp/,/家//。缓存/,/家//.缩略图//,/root/.缩略图//,/root/.cache/,/家//.config/VirtualBox/*} --删除
备注1:这是一增加的备份,这意味着下次执行此操作时,无需再次复制所有内容,而只会自动更新已更改的文件(删除的文件也会从副本中删除)。
备注2:{} 之间的所有选项对于备份(例如临时内容)和虚拟机(我更喜欢在每台计算机上保留一个封装的 .ova 文件)都是没有意义的。
如何恢复这一切:
首先,最坏的情况是你永远弄乱了硬盘。您首先要恢复分区表(如果您的分区表仍然存在,请跳过此步骤),然后从实时 USB 启动:
在实时发行版中打开终端并检查硬盘驱动器的名称
fdisk -l
我假设笔记本电脑的硬盘仍然
/dev/sda
在示例中(警告,这次很可能是/dev/sdb
)。如果您的表是 MBR 表,请按照我们上面的操作安装带有备份的外部硬盘驱动器,然后:
dd if=/mnt/USB/backup/partition_table/backup-sda.mbr of=/dev/sda
但是,如果您的表是 GPT 表,则它将是:
sgdisk --load-backup=/mnt/USB/backup/partition_table/gpt_partition_table.bin /dev/sda
如果您已经执行了此操作,或者由于分区完好无损而无需执行此操作,那么是时候恢复所有文件了。这也可以在正常工作的系统中非常安全地使用,将其恢复到最后的备份:
rsync -aAXv /mnt/USB/backup/files/* / --exclude={/dev/*,/proc/*,/sys/*,/tmp/*,/run/*,/mnt/*,/media/*,/lost+found,/home/*/.gvfs,/var/tmp/*,/home/*/.cache/*,/root/.cache/*} --delete cp /mnt/USB/backup/files/vmlinuz / --preserve=all --remove-destination cp /mnt/USB/backup/files/vmlinuz.old / --preserve=all --remove-destination cp /mnt/USB/backup/files/initrd.img / --preserve=all --remove-destination cp /mnt/USB/backup/files/initrd.img.old / --preserve=all --remove-destination
评论:最后四行我必须将它们添加到
rsync
命令中,因为由于某种原因,直接位于树根的文件不会被恢复。另外,当文件夹直接位于 / 上并在计算机中删除时,它不会在备份中删除。这不会带来任何麻烦(相应的文件和库不再存在,因此没有人链接或需要它们),但它很丑陋。谁能帮我纠正这里的 rsync 语法?最后,
grub-install /dev/sda
备注1:虽然我经常使用上述 rsync 语法将系统恢复到以前的状态,但我从未需要恢复分区表,因此:
- 您需要自行承担风险,并且,
- 请随时提出修改建议以改进此答案。
备注2:为了简单起见,对于 MBR 分区,我仅介绍如何使用dd
.如果您有扩展分区,请按以下方式进行备份:
dd if=/dev/sda of=/mnt/USB/backup/partition_table/backup-sda.mbr bs=512 count=1
sfdisk -d /dev/sda > /mnt/USB/backup/partition_table/backup-sda.sfdisk
并通过以下方式恢复 MBR 和分区表:
dd if=/mnt/USB/backup/partition_table/backup-sda.mbr of=/dev/sda
sfdisk /dev/sda < /mnt/USB/backup/partition_table/backup-sda.sfdisk