TranslateProject/translated/tech/20170112 Partition Backup.md

147 lines
8.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

分区备份
============
通常你可能会把数据放在一个分区上尤其是通用串行总线USB设备。有时候可能需要对该设备或者上面的一个分区进行备份。树莓派用户为了可引导 SD 卡当然有这个需求。其它小型机的用户也会发现这非常有用。有时候设备看起来要出现故障时最好快速做个备份。
进行本文中的实验你需要一个叫 dcfldd 的工具。
**dcfldd 工具**
该工具是 'coreutils' 软件包中 dd 工具的增强版。dcfldd 是 Nicholas Harbour 在国防部计算机取证实验室DCFL)工作期间研发的。该工具的名字也基于他工作的地方 - dcfldd
对于仍然在使用 CoreUtils 8.23 或更低版本的系统,无法轻松查看正在创建副本的进度。有时候看起来就像什么都没有发生然后你就想取消掉备份。
**注意:**如果你使用 8.24 或更新版本的 dd 工具,你就不需要使用 dcfldd只需要用 dd 替换 dcfldd 即可。所有其它参数仍然适用。
在 Debian 系统上你只需要在 Package Manager 中搜索 dcfldd。你也可以打开一个终端然后输入下面的命令
_sudo apt-get install dcfldd_
对于 Red Hat 系统,可以用下面的命令:
_cd /tmp
wget dl.fedoraproject.org/pub/epel/6/i386/dcfldd-1.3.4.1-4.el6.i686.rpm
sudo yum install dcfldd-1.3.4.1-4.el6.i686.rpm
dcfldd --version_
**注意:** 上面的命令安装的是 32 位版本。对于 64 位版本,使用下面的命令:
_cd /tmp
wget dl.fedoraproject.org/pub/epel/6/x86_64/dcfldd-1.3.4.1-4.el6.x86_64.rpm
sudo yum install dcfldd-1.3.4.1-4.el6.x86_64.rpm
dcfldd --version_
每组命令中的最后一个语句会列出 dcfldd 的版本并显示该命令文件已经被加载。
**注意:**确保你以 root 用户执行 dd 或者 dcfldd 命令。
安装完该工具后你就可以继续使用它备份和恢复分区。
**备份分区**
备份设备的时候可以备份整个设备也可以只是其中的一个分区。如果设备有多个分区,我们可以分别备份每个分区。
在进行备份之前,先让我们来看一下设备和分区的区别。假设我们有一个已经被格式化为一大块设备 SD 卡。SD 卡只有一个分区。如果空间被切分使得 SD 卡看起来是两个设备,那么它就有两个分区。如果用类似 GParted 的程序打开 SD 卡,如图 1 所示,你可以看到它有两个分区。
**图 1**
设备 /dev/sdc 有 /dev/sdc1 和 /dev/sdc2 两个分区。
假设我们有一个树莓派中的 SD 卡。SD 卡容量为 8 GB有两个分区如图 1 所示)。第一个分区存放 BerryBoot 启动引导器。第二个分区存放 Kali译者注Kali Linux 是一个 Debian 派生的 Linux 发行版)。现在已经没有可用的空间用来安装第二个操作系统。我们使用大小为 16 GB 的第二个 SD 卡,但拷贝到第二个 SD 卡之前第一个 SD 卡必须先备份。
要备份第一个 SD 卡我们需要备份设备 /dev/sdc。进行备份的命令如下所示
_dcfldd if=/dev/sdc of=/tmp/SD-Card-Backup.img_
备份包括输入文件if以及被设置为 '/tmp' 目录下名为 'SD-Card-Backup.img' 的输出文件of
dddcfldd 都是每次读写文件中的一个字节。通过上述命令,它一次读写的默认值为 512 个字节。记住,该复制是一个精准的拷贝 - 逐位逐字节。
默认的 512 个字节可以通过块大小参数 - bs= 更改。例如,要每次读写 1 兆字节,参数为 bs=1M。以下所用的缩写有一些差异
* b 512 字节
* KB 1000 字节
* K 1024 字节
* MB 1000x1000 字节
* M 1024x1024 字节
* GB 1000x1000x1000 字节
* G 1024x1024x1024 字节
你也可以单独指定读和写的块大小。要指定读块的大小使用 ibs=’。要指定写块的大小使用 obs=’。
我使用三个不同的块大小做了一个 120 MB 分区的备份测试。第一个时候默认的 512 字节,它用了 7 秒钟。第二个块大小为 1024 K它用时 2 秒。第三个块大小是 2048 K它用时 3 秒。用时会随系统以及其它硬件实现的不同而变化,但通常来说更大的块大小会比默认的稍微快一点。
一旦你完成了一次备份,你还需要知道如何把数据恢复到设备中。
**恢复分区**
现在我们已经有了一个备份点,假设数据可能被损毁了或者由于某些原因需要进行恢复。
命令和备份时相同,只是源和目标相反。对于上面的例子,命令会变为:
_dcfldd of=/dev/sdc if=/tmp/SD-Card-Backup.img_
这里镜像文件被用作输入文件if而设备sdc被用作输出文件of
**注意:** 要记住输出设备会被重写,它上面的所有数据都会丢失。通常来说在恢复数据之前最好用 GParted 删除 SD 卡上的所有分区。
假如你在使用多个 SD 卡,例如多个树莓派主板,你可以一次性写多块 SD 卡。为了做到这点你需要知道系统中卡的 ID。例如假设我们想把镜像 BerryBoot.img 拷贝到两个 SD 卡。SD 卡分别是 /dev/sdc 和 /dev/sdd。下面的命令在显示进度时每次读写 1 MB 的块。命令如下:
_dcfldd if=BerryBoot.img bs=1M status=progress | tee >(dcfldd of=/dev/sdc) | dcfldd of=/dev/sdd_
在这个命令中,第一个 dcfldd 指定输入文件并把块大小设置为 1 MB。status 被设置为显示进度。然后输入通过管道(|)传输给命令 teetee 用于将输入分发到多个地方。第一个输出是到命令 (dcfldd of=/dev/sdc)’。命令被放到小括号内被作为一个命令执行。我们还需要最后一个管道(|),否则命令 tee 会把信息发送到 stdout (屏幕)。因此,最后的输出是被发送到命令 _dcfldd of=/dev/sdd_。如果你有第三个 SD 卡,甚至更多,只需要添加另外的重定向和命令,类似 _>(dcfldd of=/dev/sde_
**注意:**记住最后一个命令必须在管道(|)后面。
必须验证写的数据确保数据是正确的。
**验证数据**
一旦创建了一个镜像或者恢复了一个备份,你可以验证这些写的数据。要验证数据你会使用名为 _diff_ 的领一个不同程序。
使用 diff 你需要指定镜像文件的位置以及系统中拷贝自或写入的物理媒介。你可以在创建备份或者恢复了一个镜像之后使用 _diff_ 命令。
该命令有两个参数。第一个是物理媒介,第二个是镜像文件名称。
对于例子 _dcfldd of=/dev/sdc if=/tmp/SD-Card-Backup.img_对应的 _diff_ 命令是:
_diff /dev/sdc /tmp/SD-Card-Backup.img_
如果镜像和物理设备有任何的不同,你会被告知。如果没有显示任何信息,那么数据就验证为完全相同。
确保数据完全一致是验证备份和恢复完整性的关键。进行备份时需要注意的一个主要问题是镜像大小。
**分割镜像**
假设你想要备份一个 16GB 的 SD 卡。镜像文件大小会大概相同。如果你只能把它备份到 FAT32 分区会怎样呢FAT32 最大文件大小限制是 4 GB。
必须做的是文件必须被切分为 4 GB 的分片。通过管道(|)将数据传输给 _split_ 命令可以切分正在被写的镜像文件。
创建备份的方法相同,但命令会包括管道和切分命令。对于命令为 _dcfldd if=/dev/sdc of=/tmp/SD-Card-Backup.img_ 的事例备份,切分文件的新命令如下:
_dcfldd if=/dev/sdc | split -b 4000MB - /tmp/SD-Card-Backup.img_
**注意:** 大小后缀和 _dd__dcfldd_ 命令的意义相同。 _split_ 命令中的破折号用于将通过管道从 _dcfldd_ 命令传输过来的数据填充到输入文件。
文件会被保存为 _SD-Card-Backup.imgaa__SD-Card-Backup.imgab_如此类推。如果你担心文件大小太接近 4 GB 的限制,可以试着用 3500MB。
将文件恢复到设备也很简单。你使用 _cat_ 命令将它们连接起来然后像下面这样用 _dcfldd_ 写输出:
_cat /tmp/SD-Card-Backup.img* | dcfldd of=/dev/sdc_
你可以在 “_dcfldd_” 命令中包含任何需要的参数。
我希望你了解并能执行任何需要的数据备份和恢复,正如 SD 卡和类似设备所需的那样。
--------------------------------------------------------------------------------
via: https://www.linuxforum.com/threads/partition-backup.3638/
作者:[Jarret][a]
译者:[ictlyh](https://github.com/ictlyh)
校对:[校对者ID](https://github.com/校对者ID)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://www.linuxforum.com/members/jarret.268/