Linux dd命令详解:数据备份,并在备份过程中进行格式转换

dd 命令主要用来进行数据备份,并且可以在备份的过程中进行格式转换。其实 dd 命令可以把源数据复制成目标数据,而且不管源数据是文件、分区、磁盘还是光盘,都可以进行数据备份。

dd 命令的基本格式如下:

[root@localhost ~]# dd if="输入文件" of="输出文件" bs="数据块" count="数量"

参数:
  1. if:定义输入数据的文件,也可以是输入设备;
  2. of:定义输出数据的文件,也可以是输出设备;
  3. bs:指定数据块的大小,也就是定义一次性读取或写入多少字节。模式数据块大小是 512 字节;
  4. count:指定 bs 的数量;
  5. conv=标志:依据标志转换文件。标志有以下这些:
    • ascii:由 EBCDIC 码转换至 ASCII 码;
    • ebcdic:由 ASCII 码转换至 EBCDIC 码;
    • ibm:由 ASCII 码转换至替换的 EBCDIC 码;
    • block:将结束字符块里的换行替换成等长的空格;
    • unblock:将 cbs 大小的块中尾部的空格替换为一个换行符;
    • lcase:将大写字符转换为小写;
    • notrunc:不截断输出文件;
    • ucase:将小写字符转换为大写;
    • swab:交换每一对输入数据字节;
    • noerror:读取数据发生错误后仍然继续;
    • sync:将每个输入数据块以 NUL 字符填满至 ibs 的大小;当配合 block 或 unblock 时,会以空格代替 NUL 字符填充;

【例 1】备份文件

[root@localhost ~]# dd if=/etc/httpd/conf/httpd.conf of=/tmp/httpd.bak
记录了67+1 的读入
#数据占了写满的67个数据块,以及1个没有写满的数据块
记录了67+1 的写出
#默认数据块大小是512字节
34439字节(34 kB)已复制,0.0524897 秒,656 kB/秒
#如果要备份文件,那么dd命令和cp命令非常类似
[root@localhost ~]# ll -h /tmp/httpd.bak
-rw-r--r--.1 root root 34K 6月 5 18:04 /tmp/httpd.bak
#查看一下生成的备份文件的大小


【例 2】备份分区为一个备份文件

[root@localhost ~]# df -h
文件系统 容量 已用 可用 已用%% 挂载点
/dev/sda3 20G 2.0G 17G 11% /
tmpfs 306M 0 306M 0% /dev/shm
/dev/sda1 194M 27M 157M 15% /boot
/dev/sr0 3.5G 3.5G 0 100% /mnt/cdrom
#查看一下分区容量,我们备份/boot分区
[root@localhost ~]# dd if=/dev/sda1 of=/tmp/boot.bak
#备份完成
[root@localhost ~]# ll -h /tmp/boot.bak
-rw-r--r--.1 root root 200M 6月 5 18:14 /tmp/boot.bak
#查看生成的备份文件
#如果需要恢复,则执行以下命令
[root@localhost ~]# dd if=/tmp/boot.bak of=/dev/sda1


如果想要把分区直接备份成另一个分区,就需要生成一个新的分区,这个分区的大小不能比源分区小,只能和源分区大小一致或比它大。命令如下:

[root@localhost ~]# dd if=/dev/sda1 of=/dev/sdb1
#如果需要恢复,则只需把输入项和输出项反过来即可,命令如下
[root@localhost ~]# dd if=/dev/sdb1 of=/dev/sda1


【例 3】整盘备份

[root@localhost ~]# dd if=/dev/sda of=/dev/sdb
#把磁盘a备份到磁盘b
[root@localhost ~]# dd if=/dev/sda of=/tmp/disk.bak
#把磁盘a备份成文件disk.bak
#备份恢复
#如果要备份到另一块硬盘上,那么,当源硬盘数据损坏时,只需用备份硬盘替换源硬盘即可
#如果要备份成文件,那么在恢复时需要把备份数据复制到其他Linux中,然后把新硬盘安装到这台Linux
#服务器上,再把磁盘备份数据复制到新硬盘中。命令如下
[root@localhost ~]# dd if=/tmp/disk.bak of=/dev/sdb


【例 4】复制软盘

[root@localhost ~]# dd if=/dev/fd0 of=/tmp/fd.bak
#在Linux中软盘的设备文件名是/dev/fd0
#这条命令先把软盘中的数据保存为临时数据文件
[root@localhost ~]# dd if=/tmp/fd.bak of=/dev/fd0
#然后更换新的软盘,把数据备份复制到新软盘中,就实现了软盘的复制


如果需要备份的是光盘,那么在 Linux 中就是使用 dd 命令制作光盘的 ISO 镜像的。命令如下:

#制作光盘ISO镜像
[root@localhost ~]# dd if=/dev/cdrom of-/tmp/cd.iso #把光盘中所有的数据制作成ISO镜像
[root@localhost ~J # mkdir /mnt/cd
#建立一个新的挂载点
[root@localhost ~]# mount -o loop /tmp/cd.iso /mnt/cd #挂栽ISO文件到挂载点
[root@localhost ~]# cd /mnt/cd
#进入挂栽点
[root@localhost cd]# ls
CentOS_BuildTag images RELEASE-NOTES-en-tJS.html RPM-GPG-KEY-CentOS-Debug-6 TRANS.TBL
EULA    isolinux repodata   RPM-GPG-KEY-CentOS-Security-6
GPL Packages RPM-GPG-KEY-CentOS-6 RPM-GPG-KEY-CentOS-Testing-6
#数据是光盘当中的数据,这个ISO镜像是可以被当作真正的光盘使用的


我们有时需要制作指定大小的文件,比如,在增加 swap 分区时,就需要建立指定大小的文件,这时也使用 dd 命令。命令如下:

[root@localhost ~]# dd if=/dev/zero of=/tmp/testfile bs=1M count=10
#数据输入项是/dev/zero会向目标文件中不停地写入二进制的0
#指定数据块大小是1MB
#指定生成10个数据块。也就是定义输出的文件大小为10MB
记录了10+0 的读入
#显示数据占满了10个数据块
记录了10+0 的写出
#不过这里数据块的大小已经是1MB了
10485760字节(10 MB)已复制,0.00709902 秒,1.5 GB/秒
[root@localhost ~]# ll -h /tmp/testfile
-rw-r--r--.1 root root 10M 6月 5 18:46 /tmp/testfile
#生成的testfile文件的大小刚好是10MB


dd 命令在进行整盘复制时,类似于 GHOST 工具的功能,不过通过 dd 命令复制出来的硬盘数据要比 GHOST 复制出来的硬盘数据稳定得多。虽然 dd 命令功能强大,不过也有一个明显的缺点,就是复制的时间较长,复制 100GB 的数据需要 15~25 分钟(根据服务器的性能不同而不同)。

实现数据备份还有非常多的方法和工具,比如 tar 和 cpio 命令。至于网络复制工具,如 rsync 和 scp 等,需要较完善的网络知识才能够学习,这里不再介绍。

推荐文章
Java Collections类:sort()升序排序、reverse()降序排序、copy()复制、fill()填充

Collections类提供了许多操作集合的静态方法,借助这些静态方法可以实现集合元素的排序、填充和复制等操作。下面介绍Collections类中操作集合的常用方法。 正向排序 使用Collecti

GCC创建和使用静态链接库(.a文件)

Linux下的静态链接库是以.a结尾的二进制文件,它作为程序的一个模块,在链接期间被组合到程序中。和静态链接库相对的是动态链接库(.so文件),它在程序运行阶段被加载进内存。 制作链接库的目的是希望

C++指针比较大小(详解版)

C++指针 图1内存地址的大小关系 &array[1]>&array[0] array

go run命令——编译并运行

Python或者Lua语言可以在不输出二进制的情况下,将代码使用虚拟机直接执行。Go语言虽然不使用虚拟机,但可使用gorun指令达到同样的效果。 gorun命令会编译源码,并且直接执行源码的main

Linux write命令:向其他用户发送信息

在服务器上,有时会有多个用户同时登录,一些必要的沟通就显得尤为重要。比如,我必须关闭某个服务,或者需要重启服务器,当然需要通知同时登录服务器的用户,这时就可以使用write命令。 write命令的信

服务降级是什么?Spring Cloud如何实现?

Docker @Data @Configuration publicclassBasicConf{ //降级的服务ID,多个用逗号分隔 @Value("${downGradeServiceS

安卓接口和type-c接口有什么区别?

安卓接口和type-c接口的区别typec和安卓接口在接口的外形上有很大的区别,typec接口要宽一些,安卓接口的接头就要窄一些了。另外typec接口上下都是一样的大小,但是安卓接口看起来更像一个圆角

MySQL视图是什么?

MySQL视图(View)是一种虚拟存在的表,同真实表一样,视图也由列和行构成,但视图并不实际存在于数据库中。行和列的数据来自于定义视图的查询中所使用的表,并且还是在使用视图时动态生成的。 数据库中

JS数字取整

在JavaScript中,使用parseInt()方法可以对小数进行取整,另外使用Math对象的静态函数也可以进行取整,简单说明如下: Math.floor():返回小于参数值的最大整数。 Ma

Linux权限管理的重要性

作为本章的第一节,首先要搞清楚一个问题,Linux系统中为什么需要设定不同的权限,所有用户都直接使用管理员(root)身份不好吗? 由于绝大多数用户使用的是个人计算机,使用者一般都是被信任的人(如家

JS unload和beforeunload事件:页面卸载

在JavaScript中,unload表示卸载的意思,这个事件在从当前浏览器窗口内移动文档的位置时触发,也就是说,通过超链接、前进或后退按钮等方式词能够一个页面跳转到其他页面,或者关闭浏览器窗口时触发

LNMP安装的前期准备(LNMP一键安装包下载)

如果我们手工安装LNMP环境,那么同样需要安装大概14个源码包(根据版本和功能不同而不同)。不过,现在网上非常流行的LNMP环境的搭建过程是采用LNMP一键安装包直接安装。这个一键安装包实际上就是一个

C++11移动构造函数详解

《C++11右值引用》一节中,给读者详细介绍了C++右值引用的含义和用法,同时还提到“右值引用主要用于实现移动(move)语义和完美转发”。有关完美转发,后续章节会做详细介绍,本节主要讲解移动语义的含

数据库的关系运算不包括什么?

数据库的关系运算不包括:比较运算。关系数据库的3种基本关系运算不包括____A.比较B.选择C.连接D.投影答案是:A对关系数据库进行查询时,需要找到用户感兴趣的数据,这就需要对关系进行一定运算。关系

tcp/ip参考模型分为哪几层?

TCP/IP协议栈是美国国防部高级研究计划局计算机网(AdvancedResearchProjectsAgencyNetwork,ARPANET)和其后继因特网使用的参考模型。ARPANET是由美国国

Go语言是如何使得Web工作的

前面已经介绍了如何通过Go语言搭建一个Web服务,我们可以看到简单应用一个net/http包就方便的搭建起来了。那么Go语言在底层到底是怎么做的呢? web工作方式的几个概念 以下均是服务器端的几个

学习大数据要什么基础?

在大数据的发展中,具有大数据思维的人和具有大数据创新的人是非常有价值的,这样的人才在大数据中不断的发展。在大数据方面感兴趣的人才能得到更好的发展。学习大数据需要掌握的基础有哪些呢?1、计算机基础知识。

数据库中模型的概念和分类是什么?

数据库中模型的概念模型是对现实世界的抽象。在数据库技术中,表示实体类型及实习类型间联系的模型成为“数据模型”。数据模型是数据库管理的教学形式框架,是用来描述一组数据的概念和定义的,数据模型的分类包括三

Linux fdisk命令创建逻辑分区过程详解

扩展分区是不能被格式化和直接使用的,所以还要在扩展分区内部再建立逻辑分区。 我们来看看逻辑分区的建立过程,命令如下: [root@localhost~]#fdisk/dev/sdb …省略部分输出

Shell while循环详解

while循环是Shell脚本中最简单的一种循环,当条件满足时,while重复地执行一组语句,当条件不满足时,就退出while循环。 Shellwhile循环的用法如下: while condit