Linux dd命令 数据备份、转换与磁盘操作的终极工具

1. 概述

Data Duplicator是Linux中一个​​底层数据操作工具​​,用于读取、转换并输出数据。

dd 可从文件、设备或标准输入中读取数据,根据指定的格式来转换数据,再输出到文件、设备或标准输出,适用于备份、磁盘克隆、启动盘制作等高危操作。其强大性伴随着风险,使用时需格外谨慎。

2. 命令说明

基本语法:

|---|-----------------------------------|
| 1 | dd if``=<输入文件> of=<输出文件> [选项] |

  • if=文件名:输入文件名,默认为标准输入。即指定源文件。
  • of=文件名:输出文件名,默认为标准输出。即指定目的文件。

选项说明:

  • count=blocks:仅拷贝blocks个块,块大小等于ibs指定的字节数。
  • ibs=bytes:一次读入bytes个字节,即指定一个块大小为bytes个字节。
    obs=bytes:一次输出bytes个字节,即指定一个块大小为bytes个字节。
    bs=bytes:同时设置读入/输出的块大小为bytes个字节。
  • cbs=bytes:一次转换bytes个字节,即指定转换缓冲区大小。
  • skip=blocks:从输入文件开头跳过blocks个块后再开始复制。
  • seek=blocks:从输出文件开头跳过blocks个块后再开始复制。
  • conv=<关键字>,关键字可以有以下11种:
    • conversion:用指定的参数转换文件。
    • ascii:转换ebcdic为ascii
    • ebcdic:转换ascii为ebcdic
    • ibm:转换ascii为alternate ebcdic
    • block:把每一行转换为长度为cbs,不足部分用空格填充
    • unblock:使每一行的长度都为cbs,不足部分用空格填充
    • lcase:把大写字符转换为小写字符
    • ucase:把小写字符转换为大写字符
    • swap:交换输入的每对字节
    • noerror:出错时不停止
    • notrunc:不截短输出文件
    • sync:将每个输入块填充到ibs个字节,不足部分用空(NUL)字符补齐。
  • --help:显示帮助信息
  • --version:显示版本信息

3. 示例

3.1 ​​制作U盘启动盘

|---|--------------------------------------------------------------|
| 1 | dd if``=ubuntu.iso of=``/dev/sdb bs=4M status=progress |

3.2 ​​磁盘克隆与备份

​​全盘备份​​:

|---|-----------------------------------------------------------------------|
| 1 | dd if``=``/dev/sda of=``/backup``.img bs=4M conv=noerror,``sync |

恢复备份​​:

|---|---------------------------------------------------|
| 1 | dd if``=``/backup``.img of=``/dev/sda bs=4M |

​​3.3 文件格式转换​​

大小写转换​​:

|---|------------------------------------------------------------|
| 1 | dd if``=``source``.txt of=upper.txt conv=ucase ``# 转大写 |

由标准输入设备读入字符串,并将字符串转换成大写后,再输出到标准输出设备:

|---|------------------------------------------|
| 1 | dd conv=ucase ``#if默认为标准输入、of默认为标准输出 |

输入以上命令后按回车键,输入字符串,再按回车键,按组合键Ctrl+D 退出,出现以下结果:

|-------------|----------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 | dd conv=ucase Hello Linux! ``#输入字符串后按回车键 HELLO LINUX! ``#按组合键Ctrl+D退出,转换成大写结果 记录了0+1 的读入 记录了0+1 的写出 13字节(13 B)已复制,12.1558 秒,0.0 KB``/s |

​​3.4 生成测试文件

生成大文件:

|---|---------------------------------------------------------------------|
| 1 | dd if``=``/dev/zero of=``test bs=1G count=10 ``#快速生成10G的大文件 |

生成一个 1GB 的随机数据文件:

|---|---------------------------------------------------------------------------|
| 1 | dd if``=``/dev/urandom of=randfile bs=1M count=1024 status=progress |

随机生成1000个1K的小文件:

|---|---------------------------------------------------------------------------------------------|
| 1 | seq 1000 | ``xargs -i ``dd if``=``/dev/zero of={}.dat bs=1024 count=1 ``#随机生成指定大小 |

3.5 磁盘性能测试​​

测试磁盘写能力:

|---|------------------------------------------------------------------|
| 1 | time dd if``=``/dev/zero of=testw.dbf bs=4k count=100000 |

of文件只用于写,所以这个命令相当于测试磁盘的写能力。

测试磁盘读能力:

|---|--------------------------------------------------------|
| 1 | time dd if``=``/dev/sdb of=``/dev/null bs=4k |

因为/dev/sdb是一个物理分区,对它的读取会产生IO,/dev/null是伪设备,相当于黑洞,of到该设备不会产生IO,所以这个命令的IO只发生在/dev/sdb上,也相当于测试磁盘的读能力。

同时测试读写能力:

|---|---------------------------------------------------------------|
| 1 | time dd if``=``/dev/sdb of=``/root/testrw``.dbf bs=4k |

在这个命令下,一个是物理分区,一个是实际的文件,对它们的读写都会产生IO(对/dev/sdb是读,对testrw.dbf是写),假设它们都在一个磁盘中,这个命令就相当于测试磁盘的同时读写能力。

测试纯写入性能:

|---|----------------------------------------------------------------------|
| 1 | dd if``=``/dev/zero of=``test bs=8k count=10000 oflag=direct |

测试纯读取性能:

|---|----------------------------------------------------------------------------|
| 1 | dd if``=``/data/test of=``/dev/null bs=8k count=10000 iflag=direct |

执行读写测试时,加上oflag=direct参数,因为没有这个参数,dd 命令有时会显示从内存中传输数据的结果速度,而不是从硬盘,无法测试出真实速度。

关键参数​​:

/dev/null和/dev/zero的区别:

**/dev/null:**它是空设备,也称为位桶(bit bucket)、回收站、无底洞,可以向它输出任何数据。任何写入它的输出都会被抛弃。如果不想让消息以标准输出显示或写入文件,那么可以将消息重定向到位桶。

**/dev/zero:**是一个输入设备,可用它来初始化文件。该设备无穷尽地提供0,可以使用任何需要的数目------设备提供的要多的多。它可以用于向设备或文件写入字符串0。

4. 性能优化

4.1 调整块大小(bs选项)

选择合适的块大小可以显著提高dd的性能。块大小太小会导致系统调用频繁,增加开销;块大小太大会浪费内存。一般来说,较大的块大小(如 4MB 或 8MB)通常能提高传输速度。

|---|---------------------------------------------------------------------------|
| 1 | dd if``=``/dev/sda of=``/path/to/backup``.img bs=4M status=progress |

4.2 使用直接 I/O(oflag=direct选项)

使用直接 I/O 选项可以绕过操作系统的缓存,提高大文件复制的性能。这对于磁盘备份和恢复尤其有效。

|---|----------------------------------------------------------------------------------------|
| 1 | dd if``=``/dev/sda of=``/path/to/backup``.img bs=4M oflag=direct status=progress |

4.3 异步 I/O(oflag=dsync 或 iflag=dsync 选项)

异步 I/O 可以在写入数据时不等待 I/O 操作完成,这样可以提高数据传输效率。dsync选项可以保证数据完整性。

|---|---------------------------------------------------------------------------------------|
| 1 | dd if``=``/dev/sda of=``/path/to/backup``.img bs=4M oflag=dsync status=progress |

4.4 禁用错误检测(conv=noerror,sync 选项)

在复制过程中,如果遇到错误,默认情况下dd会停止。使用noerror选项可以忽略错误,继续复制。sync选项可以填充错误的块,使输出文件和输入文件大小一致。

|---|-------------------------------------------------------------------------------------------------|
| 1 | dd if``=``/dev/sda of=``/path/to/backup``.img bs=4M conv=noerror,``sync status=progress |

4.5 调整输入输出缓冲区大小(ibs 和 obs选项)

可以分别设置输入和输出的块大小,以优化特定设备的读写性能。例如,输入块大小为 1MB,输出块大小为 4MB:

|---|-----------------------------------------------------------------------------------|
| 1 | dd if``=``/dev/sda of=``/path/to/backup``.img ibs=1M obs=4M status=progress |

4.6 设置进度显示(status=progress 选项)

虽然这不会直接提高性能,但 status=progress 选项可以实时显示进度,使你能够监控dd的执行情况,有助于识别和优化性能瓶颈。

|---|---------------------------------------------------------------------------|
| 1 | dd if``=``/dev/sda of=``/path/to/backup``.img bs=4M status=progress |

相关推荐
火凤凰--凤凰码路1 小时前
MySQL 中的“双路排序”与“单路排序”:原理、判别与实战调优
android·数据库·mysql
努力一点9481 小时前
linux系统底层逻辑 开机顺序 ubuntu22.04系统
linux·运维·服务器·ubuntu·ai·gpu算力
m0_564264182 小时前
开源数据库E-R图绘制工具分享
数据库·经验分享·mysql·e-r图·开源工具
Kendra9193 小时前
Linux文件系统权限
linux·运维
····懂···3 小时前
关于PGCE专家技术认证解决方案
数据库·postgresql
秋千码途3 小时前
小架构step系列22:加载系统配置
数据库·架构
zone_z3 小时前
告别静态文档!Oracle交互式技术架构图让数据库学习“活“起来
数据库·学习·oracle
旧时光巷3 小时前
SQL基础⑭ | 变量、流程控制与游标篇
数据库·sql·学习·mysql·变量·游标·流程控制
PythonicCC3 小时前
Django模板系统
数据库·django
小云数据库服务专线3 小时前
GaussDB view视图的用法
数据库