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 命令。
7万+






