在 Linux 和 Unix 系统中,dd 是一个功能强大且多用途的命令行工具。它用于复制和转换数据。尽管最初设计简单,dd 现在已经成为系统管理员、开发人员和高级用户的必备工具,用于备份、恢复和操作磁盘镜像等任务。
dd 的基本语法如下:
dd if=<输入文件> of=<输出文件> [option]
要复制一个文件,可以使用以下命令:
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(主引导记录):
dd if=/dev/sdX of=/path/to/mbr_backup.img bs=512 count=1
dd if=/path/to/mbr_backup.img of=/dev/sdX bs=512 count=1
为了安全地擦除磁盘上的数据,可以用零填充:
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 版本不支持 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 工具监控进度:
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 还有许多其他有用的参数,可以根据具体需求进行调整。
dd if=inputfile of=outputfile bs=4M iflag=direct
dd if=inputfile of=outputfile bs=4M conv=noerror,sync
dd if=inputfile of=outputfile bs=4M oflag=direct
dd if=inputfile of=outputfile bs=4M status=progress
dd if=inputfile of=outputfile bs=1M seek=100
dd if=inputfile of=outputfile bs=1M skip=100
指定要复制的块数。
dd if=inputfile of=outputfile bs=1M count=100
dd if=inputfile of=outputfile bs=4M
dd if=inputfile of=outputfile ibs=1M obs=2M
dd 是一个灵活而强大的工具,广泛应用于数据备份、恢复、克隆和销毁等操作。通过掌握 dd 的基本用法和高级选项,用户可以在各种场景下高效地管理数据。尽管功能强大,但使用 dd 时需特别小心,以避免意外的数据丢失。