Ubuntu 23.04下dd工具未完全覆盖存储设备,如何确保数据正确写入?
Ubuntu 23.04下dd工具未完全覆盖存储设备,如何确保数据正确写入?
我之前也碰到过类似的情况,dd命令看似执行完成,但实际物理介质上还残留旧数据,大概率是缓存机制或者写入参数的问题,给你几个实用的解决思路:
- 强制同步缓存,确保数据落地到物理介质
Linux系统会把磁盘写入数据暂存在内存缓存里,dd默认不会自动等待缓存刷到硬件。你可以给dd加conv=fsync参数,让它写完后强制同步缓存:
dd if=/dev/zero of=/dev/sdb bs=4M conv=fsync
或者写完dd后手动执行sync命令,等它执行完毕再去验证,这样能保证内存里的缓存数据都真正写到SD卡上。
确认设备路径没写错
很多时候会不小心把数据写到SD卡的分区(比如/dev/sdb1)而非整个SD卡设备(/dev/sdb),未覆盖的区域自然会残留旧数据。可以用lsblk命令确认SD卡的完整设备名,确保你指定的是整个设备而非单个分区。用哈希校验验证写入结果
如果要确保你的镜像文件能正确写入,最可靠的方法是对比源文件和目标设备的哈希值:- 先计算源镜像的哈希:
sha256sum your_image.img- 再计算SD卡对应镜像大小的内容哈希(避免读取镜像外的空白区域干扰结果):
head -c $(stat -c %s your_image.img) /dev/sdb | sha256sum两个哈希值完全一致的话,就说明数据已经正确写入了。
提前擦除SD卡旧数据(可选)
部分SD卡有磨损均衡机制,旧数据可能存在备用块中。你可以先用blkdiscard命令擦除整个设备的旧数据,再用dd写入:
blkdiscard /dev/sdb
⚠️ 注意:这个命令会彻底清空SD卡所有数据,执行前务必确认设备路径正确!
你碰到的strings读出随机文本的问题,很大概率是因为没同步缓存,读到的是内存里残留的旧数据,同步后再读就不会有这种情况了。
备注:内容来源于stack exchange,提问作者jp_




