---
author: Jarret
category: 系统运维
comments_data:
- date: '2017-05-04 18:36:44'
  message: 对于备份磁盘或者一个卷， 一般主要目的还是备份上面的文件系统，所以 Windows 有基于 WIM 的备份机制，从 Windows Vista
    开始，系统都是由其打包，而且 Windows XP 系统也可以用其打包，虽然 XP 问世的更早。很好用，不用考虑磁盘的具体差异，只要容量足够就行。
  postip: 218.88.45.118
  username: 来自四川成都的 Chromium 58.0|Ubuntu 用户
- date: '2017-05-05 14:14:00'
  message: 麻烦不？我不知道作者写这些东西有没有感觉麻烦，反正我看都看的麻烦了，更别说去用这来备份了。麻烦不？大家觉得麻烦不？
  postip: 219.156.27.11
  username: 来自河南郑州的 Firefox 53.0|Ubuntu 用户
- date: '2017-05-05 14:42:38'
  message: 话也不能这么说，这还是有应用范围的。比如文中说的数字取证。
  postip: 118.122.120.11
  username: 来自四川成都的 Chrome 57.0|GNU/Linux 用户
count:
  commentnum: 3
  favtimes: 0
  likes: 0
  sharetimes: 0
  viewnum: 12464
date: '2017-05-04 17:42:16'
editorchoice: false
excerpt: 通常你可能会把数据放在一个分区上，有时候可能需要对该设备或者上面的一个分区进行备份。
fromurl: https://www.linuxforum.com/threads/partition-backup.3638/
id: 8477
islctt: true
largepic: /images/p/201705/04/174154u0mwugxaikqh0b6j.jpg
permalink: /article-8477-1.html
pic: /images/p/201705/04/174154u0mwugxaikqh0b6j.jpg.thumb.jpg
related: []
reviewer: ''
selector: ''
summary: 通常你可能会把数据放在一个分区上，有时候可能需要对该设备或者上面的一个分区进行备份。
tags:
- 分区
- dd
- dcfldd
thumb: false
title: 如何备份一个磁盘分区
titlepic: true
translator: ictlyh
updated: '2017-05-04 17:42:16'
---

通常你可能会把数据放在一个分区上，有时候可能需要对该设备或者上面的一个分区进行备份。树莓派用户为了可引导 SD 卡当然有这个需求。其它小体积计算机的用户也会发现这非常有用。有时候设备看起来要出现故障时最好快速做个备份。


进行本文中的实验你需要一个叫 `dcfldd` 的工具。


![](/images/p/201705/04/174154u0mwugxaikqh0b6j.jpg)


### 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 卡看起来是两个设备，那么它就有两个分区。


假设我们有一个树莓派中的 SD 卡。SD 卡容量为 8 GB，有两个分区。第一个分区存放 BerryBoot 启动引导器。第二个分区存放 Kali（LCTT 译注：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`）。


`dd` 和 `dcfldd` 默认都是每次读写文件中的一个块。通过上述命令，它可以一次默认读写 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` 参数被设置为显示进度。然后输入通过管道 `|`传输给命令 `tee`。`tee` 用于将输入分发到多个地方。第一个输出是到命令 `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 卡和类似设备所需的那样。


（题图：Pixabay， CC0）




---


via: <https://www.linuxforum.com/threads/partition-backup.3638/>


作者：[Jarret](https://www.linuxforum.com/members/jarret.268/) 译者：[ictlyh](https://github.com/ictlyh) 校对：[jasminepeng](https://github.com/jasminepeng)


本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出