Linux dd备份命令用法详解(附带实例)
dd 命令主要用来进行数据备份,并且可以在备份的过程中进行格式转换。其实,dd 命令可以把源数据复制成目标数据,而且不管源数据是文件、分区、磁盘还是光盘,都可以进行数据备份,dd 命令的格式如下:
标志有以下这些:
下面举几个例子。如果只想备份文件,那么使用 dd 命令就非常简单了,具体如下:
dd 命令还可以用来直接备份某个分区。当然,可以把分区备份成一个备份文件,也可以直接备份成另一个新的分区。先来看看如何把分区备份成文件,具体如下:
如果想要把分区直接备份成另一个分区,就需要生成一个新的分区,这个分区不能比源分区小,只能和源分区大小一致或比它大,具体如下:
需要注意的是,dd 命令是逐字节备份的,就算是空白分区也会备份,因此使用 dd 命令非常浪费时间。而当前我们的硬盘已经是按照 TB 为单位来计算的了,如果真要整盘备份,那么耗费的时间会非常长,长到无法接受。笔者曾经做过实验,使用目前主流 1U 服务器(价格在 1.5 万元左右),使用 dd 命令备份整个硬盘,速度大约是 50GB/ 小时。这样的速度对大硬盘备份来说是不可接受的,因此现在很少会使用dd命令备份整块硬盘。
虽然目前软盘使用得非常少,不过如果需要进行软盘复制,就要利用 dd 命令,具体如下:
我们有时需要制作指定大小的文件,例如,在增加swap分区时,就需要建立指定大小的文件,这时也使用 dd 命令,具体如下:
[root@localhost ~]# dd if="输入文件" of="输出文件" bs="数据块" count="数量"参数:
- if:定义输入数据的文件,也可以是输入设备
- of:定义输出数据的文件,也可以是输出设备
- bs:指定数据块的大小,也就是定义一次性读取或写入多少字节。模式数据块大小是 512 字节
- count:指定 bs 的数量
- conv=标志:依据标志转换文件
标志有以下这些:
标志 | 描述 |
---|---|
ascii | 由 EBCDIC 码转换至 ASCII 码 |
ebcdic | 由 ASCII 码转换至 EBCDIC 码 |
ibm | 由 ASCII 码转换至替换的 EBCDIC 码 |
block | 将结束字符块里的换行替换成等长的空格 |
unblock | 将 cbs 大小的块中尾部的空格替换为一个换行符 |
lcase | 将大写字符转换为小写字符 |
notrunc | 不截断输出文件 |
ucase | 将小写字符转换为大写字符 |
swab | 交换每一对输入数据字节 |
noerror | 读取数据发生错误后仍然继续 |
sync | 将每个输入数据块以 NUL 字符填满至 ibs 的大小;当配合 block 或 unblock 时,会以空格代替 NUL 字符填充 |
下面举几个例子。如果只想备份文件,那么使用 dd 命令就非常简单了,具体如下:
[root@localhost ~]# dd if=/etc/httpd/conf/httpd.conf of=/tmp/httpd.bak 记录了 22+1 的读入 记录了 222+1 的写出 11753 字节(12 KB)已复制,0.000091036 秒,12.9 MB/秒 #如果要备份文件,那么 dd 命令和 cp 命令非常类似 [root@localhost ~]# ll -h /tmp/httpd.bak -rw-r--r--. 1 root root root 12K 3 月 19 16:43 /tmp/httpd.bak #查看一下生成的备份文件的大小
dd 命令还可以用来直接备份某个分区。当然,可以把分区备份成一个备份文件,也可以直接备份成另一个新的分区。先来看看如何把分区备份成文件,具体如下:
[root@localhost ~]# df -h /boot/ 文件系统 容量 已用 可用 已用% 挂载点 /dev/sda1 295M 186M 110M 63% /boot #查看一下/boot/分区容量,我们准备备份/boot/分区 [root@localhost ~]# dd if=/dev/sda1 of=/tmp/boot.bak #备份/boot分区 [root@localhost ~]# ll -h /tmp/boot.bak -rw-r--r--. 1 root root root 300M 3 月 19 16:45 /tmp/boot.bak #查看生成的备份文件,dd 命令是逐字节备份,不区分已写数据,还是空白空间 #因此备份之后的文件是 300MB,就是/boot分区的大小 #如果需要恢复,就执行以下命令 [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 既然可以备份分区,当然也可以整盘备份,具体如下: [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 #把磁盘 a 备份到磁盘 b 上
需要注意的是,dd 命令是逐字节备份的,就算是空白分区也会备份,因此使用 dd 命令非常浪费时间。而当前我们的硬盘已经是按照 TB 为单位来计算的了,如果真要整盘备份,那么耗费的时间会非常长,长到无法接受。笔者曾经做过实验,使用目前主流 1U 服务器(价格在 1.5 万元左右),使用 dd 命令备份整个硬盘,速度大约是 50GB/ 小时。这样的速度对大硬盘备份来说是不可接受的,因此现在很少会使用dd命令备份整块硬盘。
虽然目前软盘使用得非常少,不过如果需要进行软盘复制,就要利用 dd 命令,具体如下:
[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 镜像,具体如下: [root@localhost ~]# dd if=/dev/cdrom of=/tmp/cd.iso #把光盘中所有的数据制作成 ISO 镜像 [root@localhost ~]# mkdir /mnt/cd #建立一个新的挂载点 [root@localhost ~# mount -o loop /tmp/cd.iso /mnt/cd #挂载入 ISO 文件到挂载点
我们有时需要制作指定大小的文件,例如,在增加swap分区时,就需要建立指定大小的文件,这时也使用 dd 命令,具体如下:
[root@localhost ~]# dd if=/dev/zero of=/tmp/testfile bs=1M count=10 #数据输入项是/dev/zero,会向目标文件中不停地写入二进制的 0 #指定数据块大小是 1MB #指定生成 10 个数据块,也就是定义输出的文件大小为 10MB [root@localhost ~]# ll -h /tmp/testfile -rw-r--r--. 1 root root 10M 3 月 19 16:47 /tmp/testfile #生成的 testfile 文件的大小刚好是 10MBdd 命令在进行整盘复制时,可实现类似于 GHOST 工具的功能,不过通过 dd 命令复制出来的硬盘数据要比 GHOST 复制出来的硬盘数据稳定得多。虽然 dd 命令功能强大,但也具有一个明显的缺点,那就是在复制时需要把空白空间也进行复制,需要的时间较长。