如何在Linux中使用dd命令进行操作

最后一步是把一个系统镜像写进U盘,插上去能启动,装机没问题。那一刻就知道整套操作都没跑偏:有镜像、有恢复、有性能测试,还有把坏盘的数据尽量拉出来的记录,全都按计划完成了。

如何在Linux中使用dd命令进行操作

接下来把过程从头到尾讲清楚一点,好让人照着走不出坑。先说拷镜像这步。我要把整块盘或某个分区做成一个镜像文件,这一步实则是整个流程的关键。用 dd 来做镜像,想象它就是把整个设备当成一个大块,按块读写。命令格式很直接:把源设备当输入(if=),把目标文件当输出(of=)。举个例子,把 /dev/sda 整盘做成镜像文件,我会这么下命令:dd if=/dev/sda of=/root/sda-image.img bs=4M status=progress。这个命令会把磁盘的分区表、文件系统、数据全部拷出来,恢复时再把这个镜像倒回去就行。

讲到把镜像写进U盘,让它能引导,方式也简单:直接把ISO写进整个设备。命令像这样:dd if=/path/to/os.iso of=/dev/sdb bs=4M conv=fsync status=progress。这里用了 conv=fsync,是为了等所有数据都真正刷到介质上才结束,能减少写完拔出就不完全落盘的风险。写完后可以用 fdisk -l 检查分区信息,或者直接把U盘插到目标机上试启动,进不进安装界面一试便知。

如何在Linux中使用dd命令进行操作

往前退一步是克隆磁盘。把旧盘完整搬到新盘上,我常用这种办法:dd if=/dev/sda of=/dev/sdb bs=1M conv=noerror,sync status=progress。noerror 的意思是读到错误不停止,sync 会在读不到完整块时补零,防止后续数据错位。碰到坏扇区时,这俩参数特别管用,能把能读出的数据尽量保下来,而不会由于一个小错误整个过程被打断。

在克隆前我一般先做坏盘的数据恢复尝试。方法是把坏盘用 dd 读成一个镜像文件,命令和克隆差不多,但目标不是另一块盘而是文件:把 /dev/sdX 读成一个 img 文件,期间同样用 conv=noerror,sync。这样能跳过读错的地方,把能读出来的块都保存下来。之后再用各种工具从这个镜像里尝试恢复文件或分区。不能保证每次都能完整恢复,但比直接在坏盘上折腾强多了。有时候只能把部分块救出来,这种情况下就把能读的都拯救出来,再看能不能拼凑出完整文件系统。

还有一步常做的,是把盘彻底擦掉或做测试文件。想把旧数据覆盖得难以恢复,我会用 /dev/urandom 或 /dev/zero 写满磁盘:dd if=/dev/urandom of=/dev/sdX bs=1M status=progress,或者先生成一个全零的文件:dd if=/dev/zero of=1G-zero.file bs=1M count=1024。前者随机写入,安全性高但慢;后者速度快,适合预分配空间、做写入压力测试或模拟大文件写入。这里要提醒一句,/dev/urandom 写满整盘会花不少时间,做之前先估算好时间和对设备写耐久的影响。

把盘做性能测试也常用 dd。想测读取速度,可以把数据读掉不写入磁盘:dd if=/dev/sda of=/dev/null bs=4M count=2500。这只看读取能力,不关心写入。测写入速度时,则要把数据写到磁盘并确保系统把数据真正刷下去:dd if=/dev/zero of=/tmp/testfile bs=4M count=1000 conv=fdatasync。conv=fdatasync 会在命令结束前把数据从内核写入介质,得到的速率更接近实际应用场景。

dd 在文本处理上也能派上用场。有时只需要把大文件的前几兆拿出来做分析,可以限定读取长度:dd if=bigfile.log of=head-10M.log bs=1M count=10。还可以用 conv=ucase 或 conv=lcase 做大小写转换(这取决于 dd 的实现是否支持),在跟一些老系统打交道时,甚至会遇到 ASCII 与 EBCDIC 的转换需求。目前遇到这种编码互换的少了,但遇上老设备或特定场景时,这些选项可能会救场。

聊些实际操作时容易踩到的坑。设置块大小 bs 很关键。太小效率低,太大又可能占用过多内存。一般 1M 或 4M 是比较稳妥的选择。长期运行任务时加上 status=progress,能看到实时进度,不用瞎等。另一个常见错误是搞错设备名。操作前多跑一个 lsblk 或 fdisk -l,确认下 /dev/sdb 是U盘还是别的盘,别一不小心把系统盘给覆盖了。还有别急着拔设备,最好等 dd 结束并确认数据刷完,可以运行 sync,或者用上面提到的 conv=fsync/conv=fdatasync,让程序在退出前把缓存写完。

整个工作的顺序也有讲究:先把重大盘做镜像备份,把能救的数据先拷出来;备份完成后再做克隆、擦除或把镜像写到安装介质;最后做性能验证和启动测试。这样一来,如果哪步出问题,按时间线倒回去检查就容易定位。许多错误并不是 dd 本身,而是人为操作顺序或设备认错导致的。按部就班、核对再核对,能把风险降到最低。

实操里还有一些小习惯值得养成。写镜像前确保目标设备没有被挂载,避免文件系统处于活动状态;写完后重新读取分区表(列如用 partprobe),确认系统认得新分区;遇到坏盘做镜像时,尽量用最快的接口和稳定的电源,避免外接不稳定的USB集线器造成读写中断。遇到数据很重大的情况,优先把镜像保存到另一台机器或网络存储上,多拷几份比后悔强。

我这套流程多次用在给朋友装机、帮公司做数据迁移,甚至给几块伤过的盘做救援。记得有一次做救盘,目标盘有好几个坏扇区,直接用正常工具挂不上,我就把它整盘镜像下来,再从镜像里一点点把能读的块拯救出来。最后虽然没能全部恢复,但把绝大多数重大文件拿回来了。那回让我更信任按流程来、耐心记录比冲动操作强得多。

操作时,心态也要放稳。数据本来就脆弱,别遇到点问题就慌着按各种破坏性命令去尝试。多做备份、写日志、一步一步来,出错时就把每步的输出和状态记录下来,这样倒着排查能更快找到问题根源。

© 版权声明

相关文章

1 条评论

您必须登录才能参与评论!
立即登录