百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

Linux系统dd命令复制和转化数据:多场景应用与代码示例深度解析

ahcoder 2025-03-24 13:26 17 浏览

一、引言

在 Linux 系统中,dd 命令宛如一把瑞士军刀,具备强大且多样化的功能。

它主要用于复制文件,同时还能在复制过程中对数据进行转换和格式化。

无论是备份磁盘、创建系统镜像,还是测试磁盘读写性能,dd 命令都能精准发力,成为系统管理员和开发者的得力助手。

本文将深入剖析 dd 命令的基本语法、常用选项,并通过丰富且完善的命令代码示例,全方位展示其在不同场景下的卓越应用。

一、基本语法

dd 命令的基本语法如下:

dd [选项]

其中,选项 可以有多个,用于指定输入文件、输出文件、块大小、复制块数等参数。常见的选项及含义如下:

if=:指定输入文件(input file)。

of=:指定输出文件(output file)。

bs=:指定块大小(block size),单位可以是字节(默认)、KB(K)、MB(M)、GB(G)等。

count=:指定复制的块数。

conv=:指定数据转换的方式,如 notrunc 表示不截断输出文件,sync 表示将每个输入块填充到 bs 指定的大小,noerror 表示读取错误时继续,swab 表示交换每对字节,ucase 表示将小写字母转换为大写字母,lcase 表示将大写字母转换为小写字母。

status=:显示复制过程的状态信息,值可以为 none(默认,不显示)、noxfer(不显示传输统计信息)、progress(显示进度信息)。

iflag=:为输入文件指定标志,如 direct 表示直接 I/O,绕过缓存;fullblock 表示仅读取完整的块;nonblock 表示以非阻塞模式读取;skip_bytes 表示跳过指定字节数后开始读取;noatime 表示不更新文件的访问时间。

oflag=:为输出文件指定标志,如 direct 表示直接 I/O,绕过缓存;append 表示追加到输出文件末尾;sync 表示每次写操作后进行同步;seek_bytes 表示跳过指定字节数后开始写入;nocreat 表示不创建输出文件(如果文件不存在则报错)。

二、常用应用场景及命令代码示例

(一)备份磁盘或分区

1、备份整个磁盘

# 此命令将 /dev/sda 磁盘完整备份到 /dev/sdb 磁盘
# 块大小设置为 4MB,有助于提高数据传输效率
# status=progress 实时显示备份进度,方便用户监控
# iflag=direct 和 oflag=direct 启用直接 I/O,绕过系统缓存,加快备份速度
# iflag=sync 确保每次读操作后同步,保证数据一致性
# oflag=dsync 确保数据同步写入目标磁盘
# conv=noerror 确保在遇到读取错误时继续执行,避免因小错误中断备份
# 执行前先确认 /dev/sdb 磁盘容量足够且数据可覆盖
sudo dd if=/dev/sda1 of=/backup/sda1.img bs=1M status=progress iflag=fullblock,nonblock,skip_bytes=1024,noatime,sync
# 备份完成后,检查目标磁盘的文件系统完整性
# -f 选项强制进行检查
# -y 选项自动回答所有问题为 "yes",避免人工干预
sudo e2fsck -f /dev/sdb
# 为确保备份准确,可对比两个磁盘的 MD5 哈希值
md5sum /dev/sda
md5sum /dev/sdb

2、备份分区

# 从 /backup/sda1.img 镜像文件恢复数据到 /dev/sda1 分区
# 块大小 1MB,与备份时保持一致
# 以追加方式写入(oflag=append)避免覆盖原有数据
# 每次写操作后进行同步(oflag=sync)保证数据写入一致性
# 跳过目标分区前 2048 字节后开始恢复(oflag=seek_bytes=2048)
# 若输出文件不存在则报错(oflag=nocreat)避免误操作
# oflag=dsync 确保数据同步写入目标分区
sudo dd if=/dev/sda1 of=/backup/sda1.img bs=1M status=progress iflag=fullblock,nonblock,skip_bytes=1024,noatime
# 备份完成后,查看镜像文件的详细信息
ls -lh /backup/sda1.img
# 计算镜像文件的 SHA-256 哈希值,用于后续验证
sha256sum /backup/sda1.img

(二) 恢复磁盘或分区

从镜像文件恢复分区

# 从 /backup/sda1.img 镜像文件恢复数据到 /dev/sda1 分区
# 块大小 1MB,与备份时保持一致
# 以追加方式写入(oflag=append)避免覆盖原有数据
# 每次写操作后进行同步(oflag=sync)保证数据写入一致性
# 跳过目标分区前 2048 字节后开始恢复(oflag=seek_bytes=2048)
# 若输出文件不存在则报错(oflag=nocreat)避免误操作
# oflag=dsync 确保数据同步写入目标分区
sudo dd if=/backup/sda1.img of=/dev/sda1 bs=1M status=progress oflag=append,sync,seek_bytes=2048,nocreat,dsync
# 恢复完成后,挂载分区检查数据
sudo mount /dev/sda1 /mnt
ls /mnt
sudo umount /mnt
# 再次计算分区数据的 SHA-256 哈希值,与备份时的哈希值对比
sudo sha256sum /dev/sda1

(三) 创建空文件

# 创建一个大小为 5GB 的空文件 largefile.img
# 块大小为 1GB,复制 5 个块
# 显示进度信息(status=progress)方便了解创建进度
# 填充每个块到指定大小(conv=sync)确保文件大小准确
# oflag=dsync 确保数据同步写入文件
dd if=/dev/zero of=largefile.img bs=1G count=5 status=progress conv=sync oflag=dsync
# 创建完成后,查看文件的详细属性
stat largefile.img
# 验证文件大小是否符合预期
du -sh largefile.img

(四)测试磁盘读写性能

1、测试磁盘写性能

# 向 /dev/sda 磁盘写入一个 2GB 的文件进行写性能测试
# 块大小 1MB,使用直接 I/O 绕过缓存
# 确保写入的块为完整块(oflag=fullblock)提高测试准确性
# 每次写操作后进行同步(oflag=sync)保证数据真正写入磁盘
# oflag=dsync 确保数据同步写入磁盘
# 多次运行取平均值,这里设置为 5 次
for i in {1..5}; do
echo "Running write test iteration $i..."
dd if=/dev/zero of=/dev/sda bs=1M count=2048 oflag=direct,fullblock,sync,dsync status=progress
sleep 5
done
# 计算多次测试的平均写入速度
# 可将每次测试输出的速度记录下来,使用 bc 工具计算平均值
speed_sum=0
for i in {1..5}; do
speed=$(dd if=/dev/zero of=/dev/sda bs=1M count=2048 oflag=direct,fullblock,sync,dsync status=progress 2>&1 | grep -oP '\d+\.\d+ MiB/s' | awk '{print $1}')
speed_sum=$(echo "$speed_sum + $speed" | bc)
sleep 5
done
average_speed=$(echo "scale=2; $speed_sum / 5" | bc)
echo "Average write speed: $average_speed MiB/s"

2、测试磁盘读性能

# 从 /dev/sda 磁盘读取数据进行读性能测试
# 块大小 1MB,读取 2048 个块
# 使用直接 I/O 绕过缓存,仅读取完整的块
# 以非阻塞模式读取避免进程阻塞
# iflag=sync 每次读操作后进行同步
# 多次运行取平均值,这里设置为 5 次
for i in {1..5}; do
echo "Running read test iteration $i..."
dd if=/dev/sda of=/dev/null bs=1M count=2048 iflag=direct,fullblock,nonblock,sync status=progress
sleep 5
done
# 计算多次测试的平均读取速度
# 可将每次测试输出的速度记录下来,使用 bc 工具计算平均值
read_speed_sum=0
for i in {1..5}; do
read_speed=$(dd if=/dev/sda of=/dev/null bs=1M count=2048 iflag=direct,fullblock,nonblock,sync status=progress 2>&1 | grep -oP '\d+\.\d+ MiB/s' | awk '{print $1}')
read_speed_sum=$(echo "$read_speed_sum + $read_speed" | bc)
sleep 5
done
average_read_speed=$(echo "scale=2; $read_speed_sum / 5" | bc)
echo "Average read speed: $average_read_speed MiB/s"

(五) 数据转换

# 将输入文件 input.txt 中的小写字母转换为大写字母,并输出到 output.txt
# 不截断输出文件(conv=notrunc)
# 填充每个输入块到指定大小(conv=sync)
# 遇到读取错误继续执行(conv=noerror)
# 交换每对字节(conv=swab)
# oflag=dsync 确保数据同步写入输出文件
dd if=input.txt of=output.txt bs=1K conv=ucase,notrunc,sync,noerror,swab oflag=dsync
# 转换完成后,查看输出文件内容
cat output.txt
# 对比输入输出文件的字节数
wc -c input.txt output.txt

(六)克隆光盘

# 将光盘 /dev/cdrom 的内容克隆到镜像文件 cd_image.iso
# 块大小为 2048 字节,符合光盘标准
# 以直接 I/O 方式读取光盘提高克隆效率
# 仅读取完整的块保证数据完整性
# iflag=sync 每次读操作后进行同步
# oflag=dsync 确保数据同步写入镜像文件
sudo dd if=/dev/cdrom of=cd_image.iso bs=2048 status=progress iflag=direct,fullblock,sync oflag=dsync
# 克隆完成后,验证镜像文件的 MD5 值
md5sum cd_image.iso
# 可进一步使用光盘挂载工具验证镜像文件的可用性
sudo mount -o loop cd_image.iso /mnt/cdrom
ls /mnt/cdrom
sudo umount /mnt/cdrom

(七)制作可引导的 USB 设备

# 将 Ubuntu 镜像文件 ubuntu.iso 写入到 USB 设备 /dev/sdb
# 块大小 4MB,加快写入速度
# 使用直接 I/O 绕过缓存,每次写操作后进行同步
# oflag=dsync 确保数据同步写入 USB 设备
sudo dd if=ubuntu.iso of=/dev/sdb bs=4M status=progress iflag=direct,oflag=direct,sync
# 写入完成后,使用 fdisk 查看 USB 设备分区信息
sudo fdisk -l /dev/sdb
# 可使用 parted 工具进一步查看和调整分区表
sudo parted /dev/sdb print

三、注意事项

数据安全:dd 命令操作直接且不可逆,一旦操作失误可能导致数据丢失。在执行重要操作前,务必做好数据备份,并仔细确认设备名称和参数。

权限问题:对磁盘和分区进行操作通常需要 root 权限,因此很多 dd 命令需要使用 sudo 来执行。确保在使用 sudo 时谨慎操作,避免因权限滥用造成系统问题。

性能影响:大规模数据复制或磁盘性能测试会占用大量系统资源,可能影响其他任务的正常运行。尽量在非繁忙时段进行操作,或合理控制测试规模。

设备名称确认:在指定输入和输出设备时,要仔细核对设备名称,避免误操作导致数据丢失。可以使用 lsblk 等命令查看系统中的设备信息。

块大小选择:不同的块大小会影响 dd 命令的性能。一般来说,较大的块大小适用于大文件或磁盘操作,但可能会增加内存使用;较小的块大小则更灵活,但可能会降低传输效率。需要根据实际情况进行调整。

错误处理:虽然 conv=noerror 选项可以在遇到读取错误时继续执行,但可能会导致备份或复制的数据不完整。在使用该选项时,要充分考虑数据的重要性和完整性要求。

总结

dd 命令作为 Linux 系统中的强大工具,凭借其丰富的选项和灵活的应用场景,为用户提供了高效的数据处理解决方案。

通过合理运用各种选项,我们可以实现磁盘备份、恢复、文件创建、性能测试等多种功能。

然而,由于其操作的风险性,在使用过程中必须保持谨慎,仔细检查命令参数,确保数据安全和系统稳定。

掌握 dd 命令的使用,将使你在 Linux 系统管理和维护中更加游刃有余。

相关推荐

ARM64内核内存布局图(ARM64内核内存布局图解)

ARM64架构处理器采用48位物理寻址机制,最大可以寻找到256TB的物理地址空间。对于目前的应用来说已经足够了,不需要扩展到64位的物理地址寻址。虚拟地址也同样最大支持48位支持,所以在处理器的架构...

ARM64 linux 调试串口通信(ARM64 linux 调试串口通信实验报告)

ARM64linux调试串口通信随着国产机普及很多工作也转移到了新平台上,以前调试设备用的笔记本电脑也换成新国产ARM64架构的了。本文以绿联CM204USB-A转RJ45Console调试线...

Gentoo Linux 终止对 Itanium IA-64 体系的支持

GentooLinux是最后几个继续维护Itanium(IA-64)架构构建的Linux发行版之一,但现在这些已停产的英特尔处理器正在逐步淘汰。由于Linux6.7内核放弃了对Itan...

如何检查 Linux 系统是 32 位还是 64 位?这9个命令查的又快又准!

在Linux系统中,位数(bit)通常指的是CPU架构的位宽,即CPU一次能够处理的数据量。32位系统和64位系统在内存寻址能力、计算性能和软件支持上存在显著差异:「32位系统」:...

调出好画面!带你玩转飞凌嵌入式AM62x开发板的显示接口

来源:飞凌嵌入式官网“显示”是嵌入式开发板最为重要的功能之一,能够支持更多种类、更高规格的显示接口,意味着它能够应对的使用场景也更加广泛。每一款嵌入式开发板在出厂前都会做屏幕调试,但在客户的实际项目开...

带你玩转AM62x开发板的显示接口——LVDS的显示和修改方式

此前小编已为大家介绍过OK6254-C开发板的RGB显示和修改方式,今天将继续为大家介绍OK6254-C开发板的LVDS显示和修改方式。话不多说,我们进入正题。1、LVDS接口规格飞凌嵌入式OK62...

AM335x继任者?AM6254性能解析(am2361p)

飞凌嵌入式FET6254-C核心板基于TISitaraTMAM62x系列工业级处理器设计开发,采用ARMCortex-A53架构,主频最高可达1.4GHz;并集成了丰富的接口,可广泛应用于的工...

如何在 Linux 发行版中安装微信和 QQ?

很多人因为工作沟通的原因需要用到微信和QQ,那么如何在Linux发行版中安装微信和QQ呢?以下是一些尝试的解决方法。QQ上一个版本的QQLinux版还是在2009年,而在现在,基于N...

MySQL:物理备份工具XBK(mysql 备份方案)

XBK的优缺点:XBK(PerconaXtraBackup)优点:1.免费2.热备:备份期间不阻塞innodb和XtraDB表,但会阻塞Myisam表3.物理备份:备份恢复快XBK缺点:1.不支持远...

AMD锐龙9 9950X CPU AIDA64跑分曝光:比7950X最高快45%

IT之家6月26日消息,Anandtech论坛网友igor_kavinski本周一发布帖子,分享了AMD旗舰锐龙99950X处理器的AIDA64基准测试跑分,与当前基于Z...

qemu linux内核(5.10.209)开发环境搭建

版本信息宿主机:ubuntu20.04.6LTS(FocalFossa)虚拟机:ubuntu20.04.6LTS(FocalFossa)安装宿主机的步骤省略,和一般的在vmware中安...

iPhone 7成刷机神器,成功运行乌班图、Linux、安卓

在智能机刚开始流行的时候,很多手机发烧友都喜欢刷机,当时民间大神们制作了特别多优化的ROM。后来随着手机硬件的逐步提升,以及厂商们对系统的大力优化,让大家对于刷机的兴趣也越来越少。不知道大家还记得这部...

12 款最佳免费开源 Linux 渲染器 | 火狐浏览器 130.0 版本更新

12款最佳免费开源Linux渲染器Linux的一大优势在于其拥有丰富的开源软件,可以满足艺术家、摄影师、动画师和设计师的需求。凭借价格低廉的硬件、免费的软件以及少量的才能和灵感,任何人都可以创...

Linux中xargs 命令详解与实用场景

xargs是Linux系统中常用的命令行工具之一,它能够从标准输入构造参数列表并传递给其他命令使用,是处理批量数据操作时的重要利器。一、xargs的基本语法xargs[OPTION]...[C...

Linux 磁盘扩容(非LVM)方式(linux扩容lvm磁盘容量)

今天接到一个客户的需求,CentOS的/分区容量太小了,OA系统所有的数据都在这下面,由于当时前同事给客户安装系统时采用了标准分区,而不是LVM逻辑卷,所以不支持在线扩容。df-hT查看磁盘使...