dd
命令详解
dd
命令是 Unix 和 Linux 系统中一个非常强大的工具,用于转换和复制文件。它可以用来备份和恢复磁盘或分区、创建和修改文件系统、以及进行各种数据操作。dd
命令的灵活性和强大功能使其在系统管理、数据恢复和安全领域中广泛使用。
基本语法
dd [选项] if=输入文件 of=输出文件
其中:
if=输入文件
:指定输入文件。默认为标准输入(stdin)。of=输出文件
:指定输出文件。默认为标准输出(stdout)。bs=块大小
:指定读取和写入的块大小。默认为 512 字节。count=块数
:指定要复制的块数。skip=块数
:在读取输入文件之前跳过的块数。seek=块数
:在写入输出文件之前跳过的块数。conv=转换列表
:指定数据转换方式。
常用选项
-
if=输入文件
- 指定输入文件。例如:
dd if=input.img
- 指定输入文件。例如:
-
of=输出文件
- 指定输出文件。例如:
dd of=output.img
- 指定输出文件。例如:
-
bs=块大小
- 指定读取和写入的块大小。例如:
dd bs=1M
- 指定读取和写入的块大小。例如:
-
count=块数
- 指定要复制的块数。例如:
dd count=10
- 指定要复制的块数。例如:
-
skip=块数
- 在读取输入文件之前跳过的块数。例如:
dd skip=1
- 在读取输入文件之前跳过的块数。例如:
-
seek=块数
- 在写入输出文件之前跳过的块数。例如:
dd seek=1
- 在写入输出文件之前跳过的块数。例如:
-
conv=转换列表
- 指定数据转换方式。常见的转换选项包括:
notrunc
:不截断输出文件。noerror
:遇到读取错误时继续。sync
:使用零填充不足的块。swab
:交换每对字节。ascii
:转换为 ASCII。ebcdic
:转换为 EBCDIC。ibm
:转换为 IBM EBCDIC。lcase
:转换为小写。ucase
:转换为大写。block
:转换为块格式。unblock
:转换为非块格式。
- 例如:
dd conv=notrunc,noerror
- 指定数据转换方式。常见的转换选项包括:
常见用法
-
备份和恢复磁盘或分区
- 备份磁盘
sudo dd if=/dev/sda of=backup.img bs=4M
- 恢复磁盘
sudo dd if=backup.img of=/dev/sda bs=4M
- 备份磁盘
-
创建启动盘
- 将 ISO 文件写入 USB 驱动器
sudo dd if=path/to/iso of=/dev/sdb bs=4M
- 将 ISO 文件写入 USB 驱动器
-
创建空文件
- 创建一个 1GB 的空文件
dd if=/dev/zero of=emptyfile bs=1G count=1
- 创建一个 1GB 的空文件
-
克隆磁盘
- 克隆一个磁盘到另一个磁盘
sudo dd if=/dev/sda of=/dev/sdb bs=4M
- 克隆一个磁盘到另一个磁盘
-
擦除磁盘
- 使用随机数据擦除磁盘
sudo dd if=/dev/urandom of=/dev/sda bs=4M
- 使用随机数据擦除磁盘
-
转换文件格式
- 将 EBCDIC 文件转换为 ASCII 文件
dd if=input.ebcdic of=output.ascii conv=ascii
- 将 EBCDIC 文件转换为 ASCII 文件
-
复制并压缩文件
- 复制文件并使用 gzip 压缩
dd if=inputfile | gzip > outputfile.gz
- 复制文件并使用 gzip 压缩
-
检查磁盘读取速度
- 测试磁盘读取速度
dd if=/dev/sda of=/dev/null bs=4M
- 测试磁盘读取速度
-
检查磁盘写入速度
- 测试磁盘写入速度
dd if=/dev/zero of=testfile bs=4M count=1024
- 测试磁盘写入速度
注意事项
-
谨慎使用
dd
命令非常强大,但也非常危险。特别是当涉及到磁盘和分区操作时,错误的命令可能会导致数据丢失。在执行任何操作之前,请确保备份重要数据。
-
确认设备名称
- 在使用
dd
命令时,务必确认设备名称(如/dev/sda
、/dev/sdb
等)正确无误,以免误操作导致数据丢失。
- 在使用
-
合理设置块大小
- 合理设置
bs
参数可以提高dd
命令的性能。通常情况下,较大的块大小(如4M
或1G
)可以提高读写速度。
- 合理设置
-
使用
sudo
- 对于涉及磁盘和分区的操作,通常需要超级用户权限。使用
sudo
可以确保命令具有足够的权限。
- 对于涉及磁盘和分区的操作,通常需要超级用户权限。使用
示例
-
备份整个磁盘
- 将
/dev/sda
磁盘备份到backup.img
文件中,块大小为 4M。sudo dd if=/dev/sda of=backup.img bs=4M
- 将
-
恢复磁盘备份
- 将
backup.img
文件恢复到/dev/sda
磁盘中,块大小为 4M。sudo dd if=backup.img of=/dev/sda bs=4M
- 将
-
创建启动 USB 驱动器
- 将 ISO 文件
ubuntu-20.04.iso
写入 USB 驱动器/dev/sdb
,块大小为 4M。sudo dd if=ubuntu-20.04.iso of=/dev/sdb bs=4M
- 将 ISO 文件
-
创建 1GB 的空文件
- 创建一个 1GB 的空文件
emptyfile
。dd if=/dev/zero of=emptyfile bs=1G count=1
- 创建一个 1GB 的空文件
-
克隆磁盘
- 将磁盘
/dev/sda
克隆到磁盘/dev/sdb
,块大小为 4M。sudo dd if=/dev/sda of=/dev/sdb bs=4M
- 将磁盘
-
使用随机数据擦除磁盘
- 使用随机数据擦除磁盘
/dev/sda
,块大小为 4M。sudo dd if=/dev/urandom of=/dev/sda bs=4M
- 使用随机数据擦除磁盘
-
转换文件格式
- 将 EBCDIC 文件
input.ebcdic
转换为 ASCII 文件output.ascii
。dd if=input.ebcdic of=output.ascii conv=ascii
- 将 EBCDIC 文件
-
复制并压缩文件
- 复制文件
inputfile
并使用 gzip 压缩,输出为outputfile.gz
。dd if=inputfile | gzip > outputfile.gz
- 复制文件
-
检查磁盘读取速度
- 测试磁盘
/dev/sda
的读取速度,块大小为 4M。dd if=/dev/sda of=/dev/null bs=4M
- 测试磁盘
-
检查磁盘写入速度
- 测试磁盘的写入速度,创建一个 4GB 的文件
testfile
,块大小为 4M。dd if=/dev/zero of=testfile bs=4M count=1024
- 测试磁盘的写入速度,创建一个 4GB 的文件
-
测试硬盘性能
- 向硬盘写入 4G 大小的内容,测试硬盘读写性能,
oflag=direct
不经过内存,直接写入硬盘。dd if=/dev/zero of=/data/testfile bs=1M count=4096 oflag=direct
- 观察 IO 变化
- 开两个终端,一个终端执行此命令,另一个终端执行
iostat -x 1
观察 IO 变化。time -p bash -c "(dd if=/dev/zero of=/root/cc/a.txt bs=1M count=4096)"
- 备份 MBR
- 备份 MBR,默认单位字节,K 为千字节。
dd if=/dev/sda of=/mnt/mbr.backup bs=512 count=1
- 还原 MBR
dd if=/mnt/mbr.backup of=/dev/sda bs=512 count=1
- 备份主引导程序
- 备份主引导程序,注意存储单位,默认为字节,K 为千字节,备份不要放在
/dev/sda
分区。dd if=/dev/sda of=/root/init bs=1 count=446
- 使用备份的主引导程序进行恢复
dd if=/root/init of=/dev/sda
- 备份超级块
- 备份超级块
dd if=/dev/sdb of=/root/block bs=1K count=4
- 利用备份的超级块进行恢复
dd if=/root/block of=/dev/sdb
- 备份 MBR 分区表
- 备份 MBR 分区表
dd if=/dev/sda of=/data/dpt.img bs=1 count=64 skip=446
- 将 ISO 文件写入 USB 驱动器
- 创建可启动 USB,一次读 4M 的数据,
status=progress
显示进度dd if=/path/to/image.iso of=/dev/sde bs=4M status=progress
- 创建可启动 USB,一次读 4M 的数据,
- 创建一个 1G 的文件,将其制作为交换分区
- 创建一个 1G 的文件
dd if=/dev/zero of=/var/swapfile bs=1M count=1024
- 将其制作为交换分区
mkswap /var/swapfile swapon /var/swapfile
- 创建一个 1G 的文件
- 制作光盘镜像
- 制作光盘镜像
dd if=/dev/cdrom of=/root/rhel5.iso
- 另一种方法
cat /dev/cdrom > /root/rhel5.iso
- 进程
dd if=/dev/zero of=/dev/null
会占用大量的 CPU 资源,因为进程优先级相同,系统大概率不会死机。- 调高优先级占用 CPU,
-f
优先级 1-99,系统会死机。chrt -f 10 dd if=/dev/zero of=/dev/null
总结
dd
命令是一个功能强大且灵活的工具,适用于多种数据操作任务,如备份和恢复磁盘、创建启动盘、克隆磁盘等。通过合理使用 dd
命令及其各种选项,可以高效地完成各种复杂的文件和磁盘操作。希望本文能帮助你更好地理解和使用 dd
命令。