20180705 How to use dd in Linux without destroying your disk.md

This commit is contained in:
SunWave 2018-07-20 08:42:46 +08:00 committed by GitHub
parent 834838caa8
commit 272c003ae9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -0,0 +1,80 @@
## 如何在linux系统中使用dd命令而不会损毁你的磁盘
![](https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/computer_happy_sad_developer_programming.png?itok=72nkfSQ_)
这篇文章节选自 Manning 出版社出版的图书[Linux in Action](https://www.manning.com/books/linux-in-action?a_aid=bootstrap-it&a_bid=4ca15fc9&chan=opensource)的第4章.
你是否正在从一个即将损坏的存储驱动器挽救数据,把本地文件进行远程备份,或者把一个活动分区的数据完整的复制到别处,那么你需要懂得如何安全而可靠的复制驱动器和文件系统数据.幸运的是dd 是一个可以使用的简单而又功能强大的镜像复制命令,从现在到未来很长的时间内,也许直到永远都不会出现比 dd 更好的工具了。
### 完整的复制驱动器和分区中的数据
仔细研究后,你会发现你可以使用 dd 做各种任务,但是它最重要的功能是处理磁盘分区。当然,你可以使用 tar 命令或者 scp 命令从一台计算机复制整个文件系统的文件, 然后把这些文件原样粘贴在另一台刚刚安装好 linux 操作系统的计算机中。但是,因为文件系统的文件不是映像文件,所以在复制文件的过程中需要计算机操作系统的运行作为基础。
另一方面,使用 dd 可以对任何数字信息完美的进行逐个字节的镜像。但是不论何时何地当你要对分区进行操作时我要告诉你早期的Unix管理员曾开过这样的玩笑 " dd 象征着磁盘毁灭者"。 在使用 dd 命令的时候,如果你输入了哪怕是一个字母,也可能立即永久性的擦除掉整个磁盘驱动器里的所有重要的数据。因此,一定要注意命令的拼写格式规范。
**记住:** 在按下 Enter 键执行 dd 命令之前,暂时停下来仔细的认真思考一下。
### dd 命令的基本操作
现在你已经得到了适当的提醒,我们将从简单的事情开始。假设你要对代号为 /dev/sda 的整个磁盘数据创建精确的映像,你已经插入了一张空的磁盘驱动器 (理想情况下具有与代号为 /dev/sda 的磁盘驱动器相同的容量)。语法很简单: if = 定义源驱动器 `of =` 定义你要将数据保存到的文件或位置:
```
# dd if=/dev/sda of=/dev/sdb
```
接下来的例子将要对 /dev/sda 驱动器创建一个 .img 的映像文件,然后把该文件保存的你的用户帐号家目录:
```
# dd if=/dev/sda of=/home/username/sdadisk.img
```
上面的命令针对整个驱动器创建映像文件,你也可以针对驱动器上的单个分区进行操作。 下面的例子针对驱动器的单个分区进行操作,同时使用了一个 bs 参数用于设置单次拷贝的字节数量 (此例中是 4096。设定 bs 参数值可能会影响 dd 命令的整体操作速度,但理想的设置取决于你的硬件配置和其它考虑。
```
# dd if=/dev/sda2 of=/home/username/partition2.img bs=4096
```
数据的恢复非常简单:通过颠倒 if 和 of 参数可以有效的完成任务。在此例中if = 使用你要恢复的映像of = 使用你想要写入映像的目标驱动器:
```
# dd if=sdadisk.img of=/dev/sdb
```
你也可以在一条命令中同时完成创建和拷贝任务。下面的例子中将从支持 SSH 的远程驱动器创建一个压缩的映像文件并把该文件保存到你的本地计算机中:
```
# ssh username@54.98.132.10 "dd if=/dev/sda | gzip -1 -" | dd of=backup.gz
```
你应该经常测试你的档案,确保它们可正常使用。如果它是你创建的启动驱动器,将它粘贴到计算机中,看看它是否能够按预期启动。如果它是普通分区的数据,挂载该分区,确保文件都存在而且可以正常的访问。
### 使用 dd 擦除磁盘数据
多年以前,我的一个负责政府海外大使馆安全的朋友曾经告诉我,在他当时在任的时候, 政府会给每一个大使馆提供一个官方版的锤子。为什么呢? 一旦大使馆设施可能被不友善的人员侵占,就会使用这个锤子毁坏所有的硬盘.
为什么要那样做?为什么不仅仅删除数据?你在开玩笑,对吧?所有人都知道从存储设备中删除包含敏感信息的文件实际上并没有真正移除这些数据。除非使用锤子彻底的毁坏这些存储介质,否则,只要有足够的时间和动机, 几乎所有的内容都可以从几乎任何数字存储介质重新获取。
但是,你可以使用 dd 命令让坏人非常难以获得你的旧数据。这个命令需要花费一些时间在 `/dev/sda1` 分区的每个扇区写入数百万个 zero
```
# dd if=/dev/zero of=/dev/sda1
```
还有更好的方法。通过使用 /dev/urandom 作为源文件,你可以在磁盘上写入随机字符:
```
# dd if=/dev/urandom of=/dev/sda1
```
### 监控 dd 的操作
由于磁盘或磁盘分区的存档可能需要很长的时间,因此你可能需要在命令中添加进度查看器。安装 Pipe Viewer在Ubuntu系统上安装命令为 sudo apt install pv然后把 pv 命令和 dd 命令结合在一起。使用 pv最终的命令是这样的
```
# dd if=/dev/urandom | pv | dd of=/dev/sda1
4,14MB 0:00:05 [ 98kB/s] [ <=> ]
```
想要推迟备份和磁盘管理工作?有了 dd 工具,你不会有太多的借口。它真的非常简单,但是要小心。祝你好运!
----------------
编译自https://opensource.com/article/18/7/how-use-dd-linux
作者:[David Clinton](https://opensource.com/users/remyd)
选题:[lujun9972](https://github.com/lujun9972)
译者:[SunWave](https://github.com/SunWave)
校对:[校对者ID](https://github.com/校对者ID)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出