Linux SSH 流式烧录与压缩传输指南
一、背景介绍
在嵌入式开发和维护中,常常需要通过 SSH 从 PC 向设备端传输大文件(如系统镜像、固件)并将其直接烧录到指定磁盘(如 /dev/mmcblk2
)。然而,设备端存储空间有限,无法直接存储整个大文件。这种情况下,采用流式传输和解压的方式成为最佳选择。
二、基本原理
- 流式传输:PC 端数据通过 SSH 管道直接传输到设备端,不在设备端保存临时文件。
- 压缩与解压:PC 端压缩数据流,设备端解压并直接写入磁盘。
- 并行传输:启用多线程压缩/解压提升速度。
三、流式传输与烧录方法
3.1 基本流式烧录(无压缩)
bash
ssh remote_user@device_ip "dd of=/dev/mmcblk2 bs=4M" < cm100s_mmcblk2p2
- 直接将本地文件流式传输并写入设备磁盘。
3.2 启用压缩传输(gzip)
bash
gzip -c cm100s_mmcblk2p2 | ssh remote_user@device_ip "gzip -d | dd of=/dev/mmcblk2 bs=4M status=progress"
- 本地压缩数据,设备端解压并写入。
3.3 多线程压缩传输(pigz)
bash
pigz -p $(nproc) < cm100s_mmcblk2p2 | ssh remote_user@device_ip "pigz -d | dd of=/dev/mmcblk2 bs=4M status=progress"
- 使用
pigz
多线程压缩,提升传输速率。
3.4 直接传输压缩文件(.gz、.xz、.lz4)
- 如果文件已压缩,无需解压:
bash
cat cm100s_mmcblk2p2.gz | ssh remote_user@device_ip "gzip -d | dd of=/dev/mmcblk2 bs=4M status=progress"
3.5 使用 rsync 支持断点续传
bash
rsync --partial --progress -e ssh cm100s_mmcblk2p2 remote_user@device_ip:/dev/stdout | ssh remote_user@device_ip "dd of=/dev/mmcblk2 bs=4M"
--partial
:中断后可继续。
四、提高写入可靠性
4.1 启用写入校验
bash
ssh remote_user@device_ip "sync && hexdump -C /dev/mmcblk2 | head"
4.2 自动化脚本
- 自动选择压缩格式(gzip/xz/lz4)。
- 自动检测写入完整性。
- 断点续传自动重试。
五、故障排查
- SSH 连接中断 :确保网络稳定,使用
rsync --partial
。 - 设备空间不足:采用流式传输(如 gzip -d | dd)。
- 数据校验失败 :确保块大小与传输方式一致(
bs=4M
)。
六、附录:优化建议
- 启用多线程压缩(
pigz
)。 - 确保 PC 端和设备端 CPU 性能匹配。
- 使用专用网络(千兆网)提高传输速度。