PXE系列文章(8)- PXE 自动化装机技术回顾
到目前为止, 我们已经按技术标准实现了 Debian/Ubuntu
系列 OS 基于 preseeding 技术的自动化装机流程.其实 CentOS 的 PXE 环境构建也一样,基本是把 CentOS-7-x86_64-DVD-1810.iso
标准镜像中 /images/pxeboot
目录下的 vmlinuz
/initrd.img
拷贝到 /var/lib/tftp
下. pxelinux.0
引导程序文件不像 Debian\Ubuntu
在版本 iso
镜像中管理, 而是在 syslinux
包中, 当然 syslinux
包一定是在标准镜像中, 需要单独解开这个包或者是在宿主机器上安装该包然后将内容再拷贝出来, 另外还有一些依赖的内容比如 boot.msg
等等文件还需要标准镜像中拷贝出来, 具体依赖项还需要看你 pxelinux.cfg/default
文件中使用了哪些内容.
我们看到, 我们所有的自动化装机相关的内容来说都在 /var/lib/tftp
目录下配置, 不同操作系统使用不同的版本或者不同类型的文件, 都将放置在该目录下,有同样的文件也有大量不同类型的文件, 这样的话, /var/lib/tftp
目录下将变的特别臃肿, 不便于维护更新.比如 Debian/Ubuntu
和 RHEL/CentOS
系列以来 pxelinux.0
文件的版本管理其实就有可能不一样的,即使是同一系列的 OS,比如 CentOS 6X
和 CentOS 7X
就完全有可能使用更大的版本差异的 pxelinux.0
, 那如果该引导程序文件低版本在引导高版本的系统时有不兼容的问题, 那不就麻烦了? 我们装 CentOS 6X
的时候, 要换回 6X
的 pxelinux.0
文件, 装 CentOS 7X
的时候, 要使用 7X
的 pxelinux.0
文件, 那这地方就出现竞争瓶颈了, 还不能同时装不同版本的 CentOS
了.
我们看到, pxelinux.cfg\default
文件是用来定义装机启动配置的, 安装不同操作系统发行版时, 都需要改变该文件的内容. 因为各自发行版使用的内核(不同 OS 对内核的约定命名以及版本也是不一样的)以及内存镜像(有叫initrd, 有叫 initramfs, 压缩方式不一样, 内部格式也不一样)不一样, 内核配置参数, 预处理配置文件也不一样, 同样 default
也就成为竞争资源了. 当然 PXE
可以指定对应机器的 MAC
命名的文件来替换 pxelinux.cfg\default
, 但是当我们装同样类型的机器1万台, 那就要有 1 万个 MAC
地址映射的文件, 更不用说不同类型机器, 还需要走不同类型的流程, 比如有的机器网卡特殊, 内核未集成其驱动, 需要装特定类型的网卡驱动, 有的机器 Raid 卡特殊, 需要装特殊类型的 Raid 卡驱动等等, 再说这 1 万台机器, 还有不同的 Raid 配置/网络配置需求, 你还要生成类似 preseeding
配置中 preseed/late_command
映射的不同操作命令, 而且这里仅支持 shell 脚本, shell 脚本对大量逻辑的编程能力有, 但是偏弱的, 脚本一打开, 各种 apt install xxx
, 各种的 sed xxx
, 以及各种 if...then...elif...else...fi
, 我估计还没看具体内容, 脑袋就已经疯掉了.
什么事物都有两面, 而是说这个技术有他的优点, 也有他的缺点, 在机器数量比较少/类型比较标准/需求比较明确简单的情况下使用这种方式是非常方便的. 但是一旦量上去了,类型上去了,需求也变得不是那么明确的时候,就比较痛苦了, 即使按这种模式做出来, 但是成本其实是很高的, 一个是交付效率很难提升, 一个是交付质量提升也困难, 一个是环境给技术人员提供的解决问题的手段也是有限的. 而且还有大量的用户定制逻辑在 kickstart/preceeding 的逻辑中,对上层应用的反馈能力也是较弱的, 出问题还必须通过带外(ILO)的 VNC 终端才能一步一步跟进. 因为 PXE
默认的 initrd
并不包含远程终端的能力, 只能通过 ILO
管理页提供的超级控制台(ttyS0)才能查看, 该终端刷屏之后, 根本就没法回滚日志, 需要使用 ALT + FX
的方式切换到不同的虚拟终端,才能查看安装器的日志. 如果上述脚本中, 某条命令没有将日志输出, 这就麻烦了.你根本就找不到原因, 所以你还要确定其中的所有命令都有完整正确的日志输出, 更要命的是如果某条命令是因为硬件没有及时响应或者偶发的失败, 需要重试, 那 shell 脚本里面重试不更逆天了, 那代码就真心就不能看了.
所以我们的诉求的是, 满足业务量增长的需求, 提高交付效率和交付质量, 以及提升整体系统的容错和纠错的能力, 减少技术人员服务成本.
通过 IPMI
操作物理机 PXE
启动后, 实际就是启动内核以及初始化内存镜像, 各发行版在这个逻辑上, 在内存镜像内集成了各自的安装器, 比如 CentOS的 Kickstart, Debian/Ubuntu 的 preseeding.
其实完全可以在内存镜像内集成一个完整的 OS, 因为 initrd 其实本身就是缩小版本定制的根(/)盘, 因为早期内存较小, 设计上当然希望是少占用资源, 因为一个minimal 版本的完整镜像怎么也要个几十上百兆.
如果内存镜像启动的是一个完整基于内存的 OS, 就可以提供网络管理能力,比如集成 SSH, 那同样可以在其中构建一个服务, 来接收业务层的调度, 执行对应的指令. 这样业务实现和管理起来就方便多了.将整个用户侧 OS 的交付过程的逻辑集成到这个服务中, 该服务按不同功能抽象逻辑, 组织上下文, 随时和调度保持沟通, 有任何失败实时反馈, 有任何可重试的错误, 及时重试. 这样也就将内部逻辑单元化, 模块化了, 而不是在一个大shell 脚本中,看没完没了的 if...else...fi
.
接下来的实现, 我们希望按照这个方向来实践.