文章目录
前言
在 Linux 和 Unix 系统中,dd 是一个功能强大且多用途的命令行工具。它用于复制和转换数据。尽管最初设计简单,dd 现在已经成为系统管理员、开发人员和高级用户的必备工具,用于备份、恢复和操作磁盘镜像等任务。
dd 的基本用法
dd 的基本语法如下:
dd if=<输入文件> of=<输出文件> [option]
- if:输入文件(input file)
- of:输出文件(output file)
实例
复制文件
要复制一个文件,可以使用以下命令:
dd if=sourcefile of=destfile
这将把 sourcefile 的内容复制到 destfile。
制作磁盘镜像
dd 常用于创建磁盘镜像文件:
dd if=/dev/sdX of=/path/to/disk.img
将 /dev/sdX 替换为实际的设备名称,这将创建一个磁盘镜像文件 disk.img。
从磁盘镜像恢复数据:
要将镜像文件恢复到磁盘,可以反向操作:
dd if=/path/to/disk.img of=/dev/sdX
创建压缩的磁盘镜像
结合 gzip 和 dd 创建压缩的磁盘镜像:
创建镜像:
dd if=/dev/sdX | gzip > /path/to/disk.img.gz
恢复压缩镜像:
gunzip -c /path/to/disk.img.gz | dd of=/dev/sdX
创建启动盘:
将 ISO 文件写入 USB 驱动器以创建启动盘:
dd if=/path/to/ubuntu.iso of=/dev/sdX bs=4M
sync
bs=4M 设置块大小为 4MB,sync 确保数据从缓存中写入磁盘。
克隆磁盘
直接克隆一块磁盘到另一块磁盘,这对于磁盘升级或替换非常有用。
dd if=/dev/sdX of=/dev/sdY bs=4M
备份和恢复 MBR:
备份 MBR(主引导记录):
dd if=/dev/sdX of=/path/to/mbr_backup.img bs=512 count=1
恢复 MBR:
dd if=/path/to/mbr_backup.img of=/dev/sdX bs=512 count=1
其他常用选项
- bs:设置块大小。例如,bs=4M 表示块大小为 4MB。
- count:仅复制指定数量的块。
- skip:跳过输入文件的指定块数。
- seek:跳过输出文件的指定块数。
高级用法
数据擦除
为了安全地擦除磁盘上的数据,可以用零填充:
dd if=/dev/zero of=/dev/sdX bs=1M
或者用随机数据填充:
dd if=/dev/urandom of=/dev/sdX bs=1M
创建稀疏文件
稀疏文件只实际占用文件中包含数据的块的空间,而未使用的部分不占用实际磁盘空间:
dd if=/dev/zero of=sparse.file bs=1M count=0 seek=1000
监控 dd 进度
如果你的 dd 版本不支持 status=progress,可以通过向 dd 进程发送 USR1 信号来显示进度:
dd if=/dev/zero of=/path/to/output.file bs=1G &
pid=$!
while kill -USR1 $pid 2>/dev/null; do sleep 1; done
使用 pv 监控进度
结合 pv 工具监控进度:
dd if=/dev/zero bs=4M count=1024 | pv | dd of=disk.img bs=4M
创建交换分区
可以使用 dd 创建交换分区文件:
dd if=/dev/zero of=/swapfile bs=1M count=1024
mkswap /swapfile
swapon /swapfile
创建带有文件系统的磁盘镜像
创建一个文件系统并复制文件:
dd if=/dev/zero of=/path/to/filesystem.img bs=1M count=1000
mkfs.ext4 /path/to/filesystem.img
mkdir /mnt/myimage
mount -o loop /path/to/filesystem.img /mnt/myimage
cp -r /path/to/data/* /mnt/myimage
umount /mnt/myimage
性能测试
dd 可以用来测试磁盘性能。例如,
测试写入速度:
dd if=/dev/zero of=testfile bs=1G count=1 oflag=dsync
测试读取速度:
dd if=testfile of=/dev/null bs=1G count=1 iflag=dsync
oflag=dsync 选项用于确保输出文件(通常是磁盘设备或文件)在写操作完成后立即同步到存储设备。这意味着每个写操作在完成后,数据都会被立即刷新到磁盘,确保数据的持久性。这样可以防止数据丢失,但可能会降低写入性能,因为每次写入操作都需要等待数据写入磁盘完成。
除了 oflag 外,dd 还有许多其他有用的参数,可以根据具体需求进行调整。
iflag
- direct:直接从磁盘读取数据,绕过缓存。
- fullblock:确保读取完整的块。
- sync:将输入数据同步到输出,填充剩余空间。
dd if=inputfile of=outputfile bs=4M iflag=direct
conv
- noerror:忽略读取错误,继续进行操作。
- sync:填充输入块中剩余的部分,用零填充。
- notrunc:不截断输出文件。
dd if=inputfile of=outputfile bs=4M conv=noerror,sync
oflag
- append:在输出文件末尾附加数据。
- direct:直接写入磁盘,绕过缓存。
- sync:每个写操作同步到磁盘。
- notrunc:不截断输出文件。
dd if=inputfile of=outputfile bs=4M oflag=direct
status
- none:不显示任何状态信息。
- noxfer:不显示传输速率信息。
- progress:显示进度信息。
dd if=inputfile of=outputfile bs=4M status=progress
seek 和 skip:
- seek:跳过输出文件中的指定块数。
- skip:跳过输入文件中的指定块数。
dd if=inputfile of=outputfile bs=1M seek=100
dd if=inputfile of=outputfile bs=1M skip=100
count
指定要复制的块数。
dd if=inputfile of=outputfile bs=1M count=100
bs、ibs、obs
- bs:设置同时作为输入和输出的块大小。
- ibs:设置输入块大小。
- obs:设置输出块大小。
dd if=inputfile of=outputfile bs=4M
dd if=inputfile of=outputfile ibs=1M obs=2M
注意事项
- 小心使用:dd 是一个非常强大的工具,但如果使用不当,可能会导致数据丢失或系统无法启动。确保在运行命令前仔细检查输入和输出文件的路径。
- 执行效率:根据具体任务调整块大小 (bs) 以优化性能。例如,对于大文件传输,较大的块大小可以提高速度。
- 权限要求:一些操作可能需要超级用户权限,例如处理磁盘设备时,可以使用 sudo 命令提升权限。
总结
dd 是一个灵活而强大的工具,广泛应用于数据备份、恢复、克隆和销毁等操作。通过掌握 dd 的基本用法和高级选项,用户可以在各种场景下高效地管理数据。尽管功能强大,但使用 dd 时需特别小心,以避免意外的数据丢失。