1.问题与需求
问题:
- 新部署的机器设备(主控RK3588), 没有经过烧录定制镜像, 研发部署, 直接组装发送到客户现场
- 需要通过frpc远程部署: 安装ros2 + python包 + docker镜像 + 环境配置 + 自启动配置 + SN设备信息
- 写自动部署脚本, 实现一键部署升级
- 无奈物联网卡做了白名单限制, apt 和 pip 在线安装依赖库失败, 需要现场人员支持, 开放手机热点,
- 在线安装速度较慢, 需要30~40分钟, 才能安装, 部署, 调试好一台设备
需求:
期望能有一种不依赖现场人员 介入/操作, 更快速的部署方式
2.方案选择_与_实现
1.方案汇总
优点 | 缺点 | |
---|---|---|
RKDevTool.exe 烧录 | 1.官方工具, 烧录镜像速度最快 | 1.需要现场人员支持, 让主控rk3588进入 dload/maskrom 模式 2.需要现场人员, 携带笔记本电脑+usb线, 安装瑞芯微usb驱动, 进行固件烧录 |
dd备份,还原 | 1.还原速度极快 | 1.系统运行时, dd 还原 rootfs分区, 覆写根文件系统分区, 导致命令失败; 需要进入recovery模式还原 2.需现场人员支持, 按recovery键+重启, 让系统进入recovery模式(类似PC电脑进入Live CD模式), dd还原分区 |
tar备份,还原 | 1.部署速度中等 | 1.系统运行时, tar覆盖根文件系统文件, 概率导致进程运行异常; 导致部署失败 2.同dd还原, 需要现场人员支持, 让控制器进入recovery模式(类似PC Live CD模式), tar 还原才能安全还原成功 |
rsync备份,还原 | 1.属于增量升级 2.部署成功率较高, 较为安全 | 1.第一次部署速度较慢, 后续增量更新速度较快 |
一键部署脚本 | 部署成功率高 | 1.部署速度慢 2.物联网卡有白名单限制, apt和pip安装命令失败, 需求现场人员手机热点, 或连接其它可上网网络 |
2.各方案命令实现
[!info] 说明
系统磁盘: /dev/nvme0p1
rootfs分区: /dev/nvme0p1p8
第二磁盘(扩展磁盘): /dev/sda3, 挂载目录/mnt/disk
1.dd 系统备份_还原命令
备份
# 备份
dd if=/dev/nvme0p1p8 of=/mnt/disk/rootfs.img
# 修复文件错误
e2fsck -f -p rootfs.img
# 减少镜像大小
resize2fs -M rootfs.img
还原
# 还原
dd if=rootfs.img of=/dev/nvme0p1p8
# 分区扩容
resize2fs /dev/nvme0p1p8
ssh远程dd_备份_还原
# 远程主机磁盘备份到本地
ssh user@ip "dd if= /dev/nvme0p1p8" | dd of=rootfs.img# 本地备份恢复到远程主机
dd if=rootfs.img | ssh user@ip "dd of=/dev/sda"
ssh远程dd_备份_还原_压缩版
# 备份
ssh usr@ip "sudo dd if=/dev/sda | gzip -c" | dd of=rootfs.img.gz# 还原
dd if=rootfs.img.gz | ssh user@ip "gunzip | dd of=/dev/sda"
2.tar 系统备份_还原命令
备份
# 备份
tar -pcf /mnt/disk/rootfs.tar --exclude={"/dev","/proc","/sys","/tmp","/var","/run","/mnt","/media","/lost+found"} /# 备份+压缩为gz
tar -zpcf /mnt/disk/rootfs.tar.gz --exclude={"/dev","/proc","/sys","/tmp","/var","/run","/mnt","/media","/lost+found","/bak"} /
还原
# 还原
tar -pxf /mnt/disk/rootfs.tar -C /# 解压gz + 还原
tar -zpxf /mnt/disk/rootfs.tar.gz -C /
3.rsync 系统备份_还原命令
备份
# 备份
sudo rsync -aAX --delete --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/var","/run/*","/mnt/*","/media/*","/lost+found","/bak"} / /mnt/disk/rootfs# 压缩
tar -zpcf /mnt/disk/rootfs.tar.gz /mnt/disk/rootfs
还原
# 解压
tar -zpxf /mnt/disk/rootfs.tar.gz -C /mnt/disk/rootfs# 还原
sudo rsync -aHAXx --no-perms --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found"} /mnt/disk/rootfs/ /
rsync远程备份_还原
# 备份到其它设备上
rsync -aAXvz --delete --progress -e ssh \--exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found","/var/cache/*","/var/tmp/*"} \/ usr@ip:/home/xxx/rootfs# 从远程设备还原到本地
sudo rsync -aAXvz --delete -e ssh usr@ip:/home/xxx/rootfs /
3.方案确认
经过20~30台机器设备部署, 实测rsync升级_部署_较快,较安全(在系统已经运行情况下)成功率100%
1.rsync本质上, 属于增量备份_还原, 系统已有的文件不会被复写, 只有新文件+变更文件, 才会被更新同步;
- 在系统已经运行状态下:
- dd 还原命令失败
- tar 覆写系统文件, 会导致系统服务/进程异常, 已运行进程禁止写, 导致失败
2.rsync解压与还原速度中等, 慢于RKDevTool.exe烧录, 和 dd还原
3.优点是: 不需要人工介入/操作, 只需要下载 + 解压 + 还原 (注: 烧录,dd,tar 需要人工操作, 进入指定模式)
注:
rsync同步也同样推荐在recovery模式(类似PC Live CD模式), 安全性才最高
4.其它想法
- 能否够通过修改uboot配置, 让系统进入recovery模式 --> 从而实现dd还原
- 假设 / 和 /boot 挂载到不同的分区, 创建一个新根文件分区, 并有一个基础的linux系统环境, 通过修改grub/uboot参数, 让系统从另一个 根文件分区启动(类似recovery分区) --> 从而实现dd还原
- 想尝试新一代文件系统: zfs, brtfs 快照, 导出, 部署功能; 文件系统支持特性, 实现快速导出, 部署到其它设备
uboot修改 根文件分区
vim /boot/extlinux/extlinux.conf
console=ttyFIQ0,1500000 root=/dev/mmcblk1p5 rw rootwait
console=ttyFIQ0,1500000 root=/dev/mmcblk1p6 rw rootwait
grub修改 根文件分区
vim /boot/grub/grub.cfg
linux /vmlinuz-5.19.0-32-generic root=UUID=19cceeeb-61f6-43e4-afbd-1bff9940bac5 ro recovery nomodeset dis_ucode_ldr
linux /vmlinuz-5.19.0-32-generic root=UUID=19cceeeb-61f6-43e4-afbd-1bff9940xxxx ro recovery nomodeset dis_ucode_ldr