一种通过 kexec 切换内核并安装系统的思路
背景
底层原理
Linux 内核崩溃的时候会将当前内存的一些信息保存到硬盘方便调试并重启,而内核内核崩溃了是谁存储到信息呢?答案是另一个内核
Linux 通过 kdump 服务在自身崩溃的时候拉起自己的一个“分身”,通过特定内核参数让“分身”收集日志。
这背后的技术就是 kexec
由于 kexec 切换内核会跳过 bios 自检等环节,大大缩短重启时间( x86 物理机开机约 5-10 分钟)
很自然的就想到,可不可以用 kexec 技术重装系统?
必要条件
- 物理机,且硬盘需要组 RAID
- 机器比较多,机房人少。需要通过 pxe 装机
- 物理机重装
之所以 k 搞这么复杂,一来是因为特殊场景,二来是提高一种 k 思路和可能性。少量机器推荐通过 u 盘安装
不直接用官方 ios 的原因是
- 系统安装之前物理机做一些操作,比如组 raid
- 如果不划 vlan 机器启动项又把网卡放到硬盘前面,重启就等于重装。qwq
- 技术探讨
一次 pxe-kexec 装机流程
pxe+bootOS+kexec+官方镜像
流程
- server 机安装好 pxe/ipxe 环境。主要是基础服务如 dhcp 、tftp 、ipxe 、nginx 、dns 。能达到无人值守安装官方镜像的程度。
- 使用官方镜像最小化安装,然后装上装上你顺手的工具,如 fish/zsh 。配好 ssh 免密登陆。将所有数据打包到一个 initramfs 里面,配上内核这将是我们的 bootOS
- 步骤 2 的两个文件放到步骤 1 的相应位置。pxe 是 tftp 目录,ipxe 则是 nginx 的目录。
- client 开机等待网络引导进入 bootOS ,此时系统将完全运行在内存中
- 登入 bootOS ,执行组 raid 脚本升级 bmc 固件等操作,此处可以用开机自启动脚本,或者先到 server 上拿到 dhcp IP ,然后通过 ansible/paramiko 库等自动执行
- 将原版镜像的 ios 镜像或者里面的 vmlinuzg 和 initrd 两个文件下载到 client ,并通过 kexec 命令切换到其内核。注意不要忘了带上可以无人值守装机的内核参数
- 此时屏幕将看到内核引导的日志,稍等片刻将进行系统安装
描述的比较粗略,实际每个步骤都可以写一篇教程,当然网上也都可以搜到
pxe-kexec 相比传统 pxe 的缺点
跟 pxe 相比可能不支持 Linux 外的一些系统,比如 esxi
理论上可行
不知道 bootOS 这种称呼对不对
不知道会不会有什么坑。理论上 Linux 都支持 bootOS 做一次就能满足所有 Linux 官方镜像
不知道大家批量装机,并且时不时重装等场景是怎么做到怎么做的。