为了避免每次我的联想笔记本电脑 (80Q0001NUS) 出现故障时都要重置操作系统,我需要能够完全备份 Ubuntu 和 Windows。我希望制作 tar.xz 文件以保存到我的外部硬盘驱动器,但即使在网上搜索后,我也完全不知道该怎么做。我备份的目的是能够将 Ubuntu 或 Windows 恢复到压缩和存档时的状态。我有这些分区:
存储驱动器
128 GB 固态硬盘
- /dev/sda1:FAT32 /boot/efi 分区
- /dev/sda2:NTFS Windows 10 主分区
- /dev/sda3:BTRFS Ubuntu 根分区
- /dev/sda4:交换分区
1 TB 硬盘
- /dev/sdb1:NTFS (Windows) 存储分区
- /dev/sdb2:EXT4(共享)存储分区
- /dev/sdb3:BTRFS(Ubuntu)存储分区
4 TB HDD(外部备份驱动器)
- /dev/sdc1:NTFS 分区
- /dev/sdc2:EXT4 分区
- /dev/sdc3:BTRFS 分区
我希望将 /dev/sda1 和 /dev/sdb1(如果这是最佳方式,则分开备份)备份到 /dev/sdc1,将 /dev/sdb2 备份到 /dev/sdc2,将 /dev/sda3 和 /dev/sdb3 备份到 /dev/sdc3。我需要每个备份都易于组织(例如,我可以使用单个文件将每个分区恢复到备份创建时的状态)。如果适用,我还需要对它们进行高度压缩。如果可以避免,我不想备份整个分区。我只想恢复可以恢复到类似分区和存储驱动器设置的写入数据。最后,我需要能够使用它们恢复我的系统,例如 LiveCD 或类似的东西,这将防止软件、文件等丢失。我不想每次出现故障时都必须一次又一次地下载文件并设置我的操作系统。我希望在恢复完成后保留我的所有配置、设置、文件和其他任何内容。请告诉我执行此操作的最佳方法。谢谢。
答案1
在我的解释过程中,我假设你使用 LiveUSB 或 LiveCD 启动,并且你需要 root 权限才能任何事物我在这里解释一下。
首先,让我解释一下“dd”是什么。这个缩写的意思是“磁盘转储”,它可以为文件的所有块设备(对您来说就是磁盘)制作映像。让我们回顾一下基础知识:
dd if=source-device of=target-device bs=blocksize count=numberofblocks
if
输入文件,也就是数据的来源of
输出文件,也就是数据去往的地方bs
块大小,也就是您想要在内存中“缓冲”多少数据。如果不使用这个,它基本上会直接从一个设备复制到另一个设备,而且会很慢。对于大多数操作,请指定一些内容。我通常使用类似 的内容bs=1G
。当然,您必须有 1GB 的可用 RAM 才能真正做到这一点count
您想要移动多少“块”(数量由 定义bs
)。一般情况下不需要,因为您想要所有块。
现在,假设您有一个名为 /dev/sda 的 128GB SSD,并且您想对它进行完全“映像”(这就是该操作的名称),包括其上的所有内容。分区表。您有一个备份磁盘,在 /mnt/bigdisk 上有足够的空间。要对整个磁盘进行映像,请发出以下命令:
dd if=/dev/sda of=/mnt/bigdisk/backup-20160812.img bs=1G
这将需要相当长的时间(但如果你还没有在 4TB 磁盘上执行此操作,那你就太没用了),最后你会在 /mnt/bigdisk 中找到一个名为 backup-20160812.img 的 128GB 文件。在此期间,dd 不会给出任何输出,你会注意到系统性能大幅下降。哦,为了一切美好的事物:确保没有什么,而不是单个分区,已挂载或使用 /dev/sda。
一旦你有了这个大文件,你就可以对真实磁盘做任何你想做的事情(当然,除了物理上破坏它)。如果你想恢复,你可以这样做:
dd if=/mnt/bigdisk/backup-20160812.img of=/dev/sda bs=1G
这些是精确位副本,含义如下:
- 大文件的大小正好是磁盘的大小
- 显然你不能恢复到小于该大小的磁盘
- 即使您恢复到更大的磁盘,也可能不起作用。通常,它最终会成为您想要的分区,后面跟着一个巨大的可用空间块。您将需要进行大量调整大小,如果是 SSD,请检查对齐。
- 如果源磁盘有缺陷,dd 会在出现错误时停止。如果您不希望这样,则需要指定额外的参数。手册页显然是您的好朋友。
- 再次强调,一切都是想象的甚至未使用的空间。如果您有 100GB 的磁盘,并且只使用了 10%,那么您的文件将有 100GB 大,并且会浪费 90% 的时间来复制未使用的块。
有了这些知识,逻辑上来说,您可以使用 dd 来备份单个分区。看看以下命令,您可能会明白为什么:
dd if=/dev/sda1 of=/mnt/bigdisk/backup-sda1-20160812.img bs=1G
唯一的区别是使用 /dev/sda1 而不是/dev/sda
(我使用了另一个目标文件名)。为什么?因为/dev/sda
代表整个磁盘,并且/dev/sda1
代表该磁盘上的第一个分区。就是这样...所有关于按位复制的注释仍然存在。
生成的文件dd
可以进行 gzip 压缩,这样文件就会更小。您可以使用管道执行此操作。image 命令如下所示:
dd if=/dev/sda bs=1G | gzip > /mnt/bigdisk/backup-20160812.img.gz
恢复命令如下:
dd if=/mnt/bigdisk/backup-20160812.img.gz bs=1G | gunzip > /dev/sda
一些一般性注释,便于理解:省略of
会将所有输出发送到。此数据使用管道stdout
发送到gzip
(或) 。由于没有指定文件,它们使用此数据并对其进行 gzip 压缩。输出发送到,然后我们使用 符号将其发送到文件。gunzip
|
gzip/gunzip
stdout
>
现在开始讨论 ntfs 分区。 ntfsclone
您可能还想了解其他相关工具(ntfsresize
、ntfsfix
。在命令行中输入 ntfs 并执行制表符补全)ntfsclone 不会只复制所有位,而是会复制文件系统结构和数据(除非您告诉它不要这样做),从而忽略未使用的空间。这意味着文件比 ntfs 分区的实际“已用”文件大小小得多,而且不会大很多。命令如下:
ntfsclone -s -o /mnt/bigdisk/backup-20160812-sda2.ntfsclone /dev/sda2
它在工作时会给出各种信息,这比 更让人放心dd
。无论如何,这一切意味着什么?
-s
意味着您想要保存图像(而不是进行设备到设备的克隆) --o
您将数据发送到哪里。在本例中是文件。如果文件存在,它将拒绝覆盖它。- 命令中的最后一个选项是源,在本例中是 sda 的第二个分区。
此处进行恢复:
ntfsclone -r -O /dev/sda2 /mnt/bigdisk/backup-20160812-sda2.ntfsclone
再次,令人安心的信息,以下是选项的含义:
-r
表示从图像恢复。它基本上是-s
用于恢复的挂件。-O
是写入数据的位置,在本例中是大写的 -O,因为这会导致文件覆盖。这是必需的,因为文件/dev/sda2
已经存在,而您想要覆盖它。- 最后一个选项同样是数据源。显然,这是我们刚刚用第一个命令创建的文件。
这些映像的大小是不可更改的。您无法将其还原到较小的磁盘/分区,即使根据文件大小可以容纳。已备份的文件系统的结构与磁盘大小绑定。因此,即使您用 100GB 分区和 10GB 数据制作的映像可以放在较小的 50GB 分区中,它也不会起作用。您可以将其还原到更大的分区,但同样,结构保持不变,因此,您必须使用ntfsresize
才能真正使用额外的空间。
让我们开始吧dump
。正如我在评论中提到的,我已经很久没有用过它了。我只是备份了我的数据文件,因为我知道 Linux 重新安装基本上是无痛的,特别是如果你把 /home 放在不同的分区上。这里写的内容基本上是我在写它时发现的。我的 OpenBSD 备份脚本使用 dump 太旧了,我不敢说我仍然知道它们是如何工作的。转储。
dump -0 -f /mnt/bigdisk/backup-20160812-sda3.dump /dev/sda3
再说一遍,这意味着什么?
-0
是转储的级别。这用于执行增量备份,非常有用,但现在,您会记得 0 级转储意味着完整文件系统。-f
转储的数据被发送到指定的文件,在本例中:/mnt/bigdisk/backup-20160812-sda3-level0.dump
恢复?好吧,您需要知道,您只能恢复到干净的文件系统和已挂载的文件系统,因此您首先必须确保目标格式化为干净的并挂载它:
mkfs.ext4 /dev/sda3
mount /dev/sda3 /mnt
cd /mnt
restore -r -f /mnt/bigdisk/backup-20160812-sda3-level0.dump
-r
表示恢复-f
从文件- 目标是当前目录,因此是 /mnt
它可能会给你一个类似的警告restore: ./lost+found: File exists
,因为lost+found
存在于任何新创建的文件系统上。
有趣的是,考虑到它的工作方式,您应该能够恢复到较小的磁盘,但我还没有尝试过。
现在我讨论了“安装”。除了转储的恢复部分外,不应在已安装的磁盘上执行任何这些操作。
最后,备份 MBR 和 GPT:MBR 很简单,说实话,只要我的磁盘不超过 2TB,我更喜欢使用它。无论如何,MBR 基本上是磁盘上的块 0,其中第一部分是引导代码,第二部分是分区表。第一个扇区的前 446 个字节,接下来的 66 个字节是分区。因此,仅提取引导代码,如下所示:
dd if=/dev/sda of=/mnt/bigdisk/backup-20160812-bootcode.dd bs=446 count=1
使用分区表提取引导代码如下所示:
dd if=/dev/sda of=/mnt/bigdisk/backup-20160812-mbr.dd bs=512 count=1
就是这样。显然,您只能将它们还原到完全相同的磁盘(或具有完全相同特征的磁盘)。
如您所见,MBR 很简单。GPT 则不然,而且很麻烦。GPT 是可变长度的,您最好 Google 一下以便更好地理解。我测试的机器上没有 GPT 磁盘,因此请仔细检查所有内容。从我 Google 的结果来看,要使用的工具是gdisk
。唉,它似乎是一个交互式工具。这很好,但我们想要一个简单的单行代码:
printf "b\\n/mnt/bigdisk/backup-20160812-gpt.gdisk\n" | gdisk /dev/sda
基本上,发送文本:
b
/mnt/bigdisk/backup-20160812-gpt.gdisk
gdisk
到设备上运行的应用程序/dev/sda
。文件/mnt/bigdisk/backup-20160812-gpt.gdisk
现在应该包含 GPT 的备份。恢复应该是这样的,但我没有尝试,所以使用时请自担风险。
printf "b\\nr\\nl\\n/mnt/bigdisk/backup-20160812-gpt.gdisk" | gdisk /dev/sda
这应该将以下文本转到交互式 gdisk 菜单,进入恢复模式并从文件恢复。
如果你开始在 Google 上搜索 GPT 和 dd,你会看到很多人警告你不要这样做,因为 GPT 使用了 uuid。这绝对是真的:你将要如果同一系统中有两个具有相同 uuid 的活动磁盘,则会出现问题。当然,这不是您在这里所做的。如果您坚持复制到文件(我的所有示例都是这样做的),则系统中永远不会有两个相同的 uuid
如你所见,这是一大堆需要消化的信息,我甚至不想再读一遍来查找拼写错误、错别字等。如果信息太多,可以看看克隆兹拉。它可能更接近你实际需要的。如果我一开始就告诉你这一点,我甚至可能省去了很多写作的时间。