当前位置: 首页 > news >正文

通过定制initramfs实现从单系统分区到双系统的无缝升级

背景

我们的客户有一些本地部署的网关设备(CentOS 7)需要做固件升级。 原有的单系统分区架构缺乏有效的回滚机制, 升级遇到故障后无法回滚, 导致服务中断, 用户体验差

目标

设计一种解决方案, 自动将客户的网关设备从单系统分区平滑升级到双系统,同时保证用户配置(IP, DNS, 登录口令)不丢失
整个升级过程对客户完全透明, 无需客户进行额外操作(比如添加磁盘, 创建新机器)

方案

方案描述优点缺点
定制initramfs通过定制initramfs进入紧急模式,预先加载升级包和配置文件到内存,再重建磁盘分区用户无感知, 且备份了旧的配置内存空间有限, 升级包+解压后系统文件需小于内存
安装ISO下载并安装目标系统ISO不需要单独出一个升级包客户的配置很难同步, 升级后需要用户做一些手动配置

最终采用定制initramfs方案。 客户虚拟机内存最低配置是8G, 需保证initramfs阶段的升级包+解压后系统文件小于8G
测试结果: c7最小化镜像900M, 安装后磁盘占用1.3G; 安装Microk8s后磁盘占用3G左右, 升级包1.7G, initramfs用掉4G内存, 远小于8G, 可行

实现

在这里插入图片描述

目标系统分区设计

# lsblk
NAME         MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda            8:0    0   10G  0 disk
├─sda1         8:1    0    2M  0 part
├─sda2         8:2    0    1G  0 part /boot
└─sda3         8:3    0  8.8G  0 part
  ├─VA-root  253:0    0  7.8G  0 lvm  /
  ├─VA-image 253:1    0  512M  0 lvm  /image
  └─VA-data  253:2    0  512M  0 lvm  /data

升级包设计

内容描述
目标系统的分区表文件(sgdisk)使用sgdisk导出的新系统的分区表文件,支持双系统启动
目标系统文件的压缩包(.tar.xz)把虚拟机导出到OVA,再把VMDK根文件系统中所有文件备份成压缩包
initramfs-convert.img基于官方ISO的initramfs定制
vmlinuz-convert一个压缩内核, 直接从官方ISO取
upgrade.sh二阶段执行, 一阶段在客户机上执行, 下载升级包, 进入紧急模式; 二阶段在initramfs执行, 完成分区重建, 安装和启动目标系统

实现细节:

  • 分区方案采用BIOS/GPT, BIOS是为了兼容老客户, GPT可以支持2T以上磁盘, 可扩展性和性能更好
  • tar备份目标系统时, 需要--numeric-owner保留文件的UID/GID, 以及文件扩展属性xattr(有snap的应用运行状态)

难点

initramfs空间有限, 需要尽可能压缩升级包

  • 使用CentOS 7官方的minimal ISO做镜像(900M)
  • 只分配必要磁盘空间, 等客户升级成功后动态分配剩余空间, 使升级包尽可能做小
  • 导出OVA前, 清理临时文件,日志文件, 禁用交换分区
  • 使用压缩比率高的压缩算法(xz)

调试方法

1.手动进入GRUB rescue模式加载内核, 手动挂载磁盘根分区,查看失败日志

set root=(hd0,gpt2)
linux (hd0,gpt2)/vmlinuz-convert root=/dev/mapper/VA-root ro rd.lvm.lv=VA/root
initrd (hd0,gpt2)/initramfs-convert.img

2.先对虚拟机做快照, 如果调试失败通过快照迅速恢复系统

调试问题

Q: 切换到新系统后, 输入正确的用户名和密码也无法登录, console一直打印localhost login
A: 通过手动进入GRUB rescue模式调试, 挂载磁盘日志发现是SELinux的问题, 将目标系统的SELinux设置为disabled后,问题得到解决

相关文章:

  • python自动工具起号迅速,批量自动发布各类短视频
  • C语言数据结构之顺序表
  • 剑指 Offer II 063. 替换单词
  • 计算机视觉算法实战——老虎个体识别(主页有源码)
  • Python中的装饰器(Decorator) 详解
  • 六十天前端强化训练之第十二天之闭包深度解析
  • 【RK3588嵌入式图形编程】-SDL2-SDL_Image使用详解
  • 3D空间曲线批量散点化软件V1.0正式发布,将空间线条导出坐标点,SolidWorks/UG/Catia等三维软件通用
  • 为什么 MySQL InnoDB 的 Repeatable Read 可以阻止幻读?
  • Django工程获取请求参数的几种方式
  • 一遍通俗易懂的新华三交换机文档指南操作手册
  • AI日报 - 2025年3月10日
  • [项目]基于FreeRTOS的STM32四轴飞行器: 六.2.4g通信
  • ArduPilot开源代码之AP_OSD
  • 基于Python的商品销量的数据分析及推荐系统
  • 使用 Docker 部署 GitLab 并持久化数据
  • comctl32!ListView_OnSetItem函数分析LISTSUBITEM结构中的image表示图标位置
  • 简单的 Python 示例,用于生成电影解说视频的第一人称独白解说文案
  • Oracle数据库监听学习
  • NoteGen是一款开源跨平台的 AI 笔记应用,专注于 recording 和 writing ,基于 Tauri 开发
  • 缅甸内观冥想的历史漂流:从心理治疗室到“非语言现场”
  • 夜读丨读《汉书》一得
  • 经济日报整版聚焦:上海构建法治化营商环境,交出高分答卷
  • 巴防空系统击落印度无人机,印称巴方违反停火协议
  • 巴西总统卢拉将访华
  • 习近平会见缅甸领导人敏昂莱