ILD

dd写入sd卡镜像速度慢问题
作者:Yuan Jianpeng 邮箱:yuanjp89@163.com
发布时间:2026-4-13 站点:Inside Linux Development

最近开发板需要使用sd卡启动,之前使用usb 2.0读卡器,写入速度只有3M/S,写入一个4.3G的镜像要花20多分钟。

换了一个usb 3.0的卡,发现写入还是慢,原来跟dd的bs参数有关系:


1 默认bs

$ sudo dd if=image/ModelA-L6.1.22-TF-V3.12-20250326.img of=/dev/sda status=progress
28639744 bytes (29 MB, 27 MiB) copied, 4 s, 7.2 MB/s 
35918336 bytes (36 MB, 34 MiB) copied, 5 s, 7.2 MB/s
50467328 bytes (50 MB, 48 MiB) copied, 7 s, 7.2 MB/s
86725120 bytes (87 MB, 83 MiB) copied, 12 s, 7.2 MB/

发现默认bs是512字节,写入速度7MB/s,和iotop显示的disk write speed相差不大,好像没有引入缓存。


1 bs=4096

$ sudo dd if=image/ModelA-L6.1.22-TF-V3.12-20250326.img of=/dev/sda status=progress bs=4096
2754322432 bytes (2.8 GB, 2.6 GiB) copied, 2 s, 1.4 GB/s
2781749248 bytes (2.8 GB, 2.6 GiB) copied, 3 s, 927 MB/s
2803171328 bytes (2.8 GB, 2.6 GiB) copied, 4 s, 699 MB/s
2809307136 bytes (2.8 GB, 2.6 GiB) copied, 5 s, 548 MB/s
2814447616 bytes (2.8 GB, 2.6 GiB) copied, 6 s, 467 MB/s
2825678848 bytes (2.8 GB, 2.6 GiB) copied, 7 s, 402 MB/s
2836049920 bytes (2.8 GB, 2.6 GiB) copied, 8 s, 354 MB/s
2847137792 bytes (2.8 GB, 2.7 GiB) copied, 9 s, 315 MB/s
2858008576 bytes (2.9 GB, 2.7 GiB) copied, 10 s, 285 MB/s
2868236288 bytes (2.9 GB, 2.7 GiB) copied, 11 s, 261 MB/s
2879614976 bytes (2.9 GB, 2.7 GiB) copied, 12 s, 240 MB/s
2894385152 bytes (2.9 GB, 2.7 GiB) copied, 13 s, 222 MB/s
2911219712 bytes (2.9 GB, 2.7 GiB) copied, 14 s, 208 MB/s

速度刚开始很快,应该是缓存了。使用iotop查看,磁盘写入速度有32MB/s。

按ctrl+C结束dd,发现无效,iotop显示后台在持续flush

bs在加大到64k,效果一样。


3 bs=4096 oflag=direct

$ sudo dd if=image/ModelA-L6.1.22-TF-V3.12-20250326.img of=/dev/sda status=progress bs=4096 oflag=direct
25448448 bytes (25 MB, 24 MiB) copied, 9 s, 2.8 MB/s^C
6592+0 records in
6592+0 records out
27000832 bytes (27 MB, 26 MiB) copied, 9.49053 s, 2.8 MB/s

速度很慢


4 bs=65536 oflag=direct

$ sudo dd if=image/ModelA-L6.1.22-TF-V3.12-20250326.img of=/dev/sda status=progress bs=65536 oflag=direct
199688192 bytes (200 MB, 190 MiB) copied, 6 s, 33.3 MB/s
231735296 bytes (232 MB, 221 MiB) copied, 7 s, 33.1 MB/s
264634368 bytes (265 MB, 252 MiB) copied, 8 s, 33.1 MB/s
298385408 bytes (298 MB, 285 MiB) copied, 9 s, 33.2 MB/s
331415552 bytes (331 MB, 316 MiB) copied, 10 s, 33.1 MB/s^C
5309+0 records in
5309+0 records out
347930624 bytes (348 MB, 332 MiB) copied, 10.5151 s, 33.1 MB/s
速度接近最高速度


5 bs=131072 oflag=direct

$ sudo dd if=image/ModelA-L6.1.22-TF-V3.12-20250326.img of=/dev/sda status=progress bs=131072 oflag=direct
231079936 bytes (231 MB, 220 MiB) copied, 7 s, 33.0 MB/s
264372224 bytes (264 MB, 252 MiB) copied, 8 s, 33.0 MB/s
330170368 bytes (330 MB, 315 MiB) copied, 10 s, 33.0 MB/s
363724800 bytes (364 MB, 347 MiB) copied, 11 s, 33.1 MB/s

加大bs无改善



总结

使用dd写入磁盘镜像时,

1 要加上oflag=direct,否则写入数据在缓存中。

2 bs要设置,否则达不到最大速度,合理的值根据实际设置64k或这128k


================================ 补充

不指定oflag=direct ,也不设置bs

$ sudo dd if=image/ModelA-L6.1.22-TF-V3.12-20250326.img of=/dev/sda status=progress
11891200 bytes (12 MB, 11 MiB) copied, 1 s, 11.9 MB/s
23560704 bytes (24 MB, 22 MiB) copied, 2 s, 11.8 MB/s
35152384 bytes (35 MB, 34 MiB) copied, 3 s, 11.7 MB/s
46731776 bytes (47 MB, 45 MiB) copied, 4 s, 11.7 MB/s
58434048 bytes (58 MB, 56 MiB) copied, 5 s, 11.7 MB/s


现象是bs以512写入内核缓存,写入速度很慢,在缓存满之前,甚至都不写磁盘,

iotop显示:

Total DISK WRITE: 9M

Current DISK WRITE: 0K/S


================================ 补充

usb3.0读卡器插入usb2.0接口,速度还是慢一点

$ sudo dd if=image/ModelA-L6.1.22-TF-V3.12-20250326.img of=/dev/sda status=progress bs=65536 oflag=direct
676593664 bytes (677 MB, 645 MiB) copied, 26 s, 26.0 MB/s
703594496 bytes (704 MB, 671 MiB) copied, 27 s, 26.1 MB/s
729481216 bytes (729 MB, 696 MiB) copied, 28 s, 26.1 MB/s
753926144 bytes (754 MB, 719 MiB) copied, 29 s, 26.0 MB/s^C
11621+0 records in
11621+0 records out
761593856 bytes (762 MB, 726 MiB) copied, 29.2863 s, 26.0 MB/s


查看usb连接速度:

$ lsusb -t
/:  Bus 001.Port 001: Dev 001, Class=root_hub, Driver=xhci_hcd/16p, 480M
    |__ Port 002: Dev 002, If 0, Class=Vendor Specific Class, Driver=pl2303, 12M
    |__ Port 003: Dev 003, If 0, Class=Hub, Driver=hub/4p, 480M
        |__ Port 002: Dev 005, If 0, Class=Human Interface Device, Driver=usbhid, 12M
        |__ Port 002: Dev 005, If 1, Class=Human Interface Device, Driver=usbhid, 12M
        |__ Port 002: Dev 005, If 2, Class=Human Interface Device, Driver=usbhid, 12M
    |__ Port 008: Dev 004, If 0, Class=Vendor Specific Class, Driver=[none], 12M
    |__ Port 008: Dev 004, If 2, Class=Human Interface Device, Driver=usbhid, 12M
    |__ Port 009: Dev 006, If 0, Class=Hub, Driver=hub/4p, 480M
        |__ Port 001: Dev 008, If 0, Class=Human Interface Device, Driver=usbhid, 12M
        |__ Port 002: Dev 011, If 0, Class=Mass Storage, Driver=usb-storage, 480M
    |__ Port 014: Dev 007, If 0, Class=Wireless, Driver=btusb, 12M
    |__ Port 014: Dev 007, If 1, Class=Wireless, Driver=btusb, 12M
/:  Bus 002.Port 001: Dev 001, Class=root_hub, Driver=xhci_hcd/6p, 20000M/x2
    |__ Port 003: Dev 002, If 0, Class=Hub, Driver=hub/4p, 5000M

480M就是2.0

5000M就是3.0

Copyright © linuxdev.cc 2017-2024. Some Rights Reserved.