通过修改 initrd.img 来实现 PXE 启动过程中进行硬盘 RAID 初始化
环境:CentOS 7.6
解压/压缩命令
# 解压原始文件
mkdir ./test
xz -dc initrd.img | cpio -id
# 修改完成后打包(因为无 lzma 工具,故使用gzip)
find . | cpio --quiet -H newc -o | gzip -9 -n > ../initrd-raid.img.gz
mv ../initrd-raid.img.gz /var/lib/tftpboot/centos7.6/initrd-raid.img
# 二次打包命令
mv initrd-raid.img initrd-raid.img.gz && gzip -d initrd-raid.img.gz
cpio -id < initrd-raid.img
思路
参考 基于PXE自动配置RAID方法:
我们要在内存中运行一个小的内核系统,并检测到raid,然后对raid进行配置,我们使用了基于centos6.5的内核和initrd.img(initrd.img本身是一个小的内存中运行的系统),但这个小系统本身带的工具太少,需要我们加入MegaCli64命令,以及用到的shell命令,定制一个符合我们要求的小系统,并重新打包。
由于我们需要在正式安装前配置raid,所以我们利用ks文件中的%pre执行一些检测和配置工作,然后直接重启就OK了。
根据上述思路,我在 CentOS 7.6 环境中通过在 ks 文件中的 @pre
操作来执行配置 RAID 的操作未能成功,于是转变思路,在 initrd.img 加载过程中直接配置 RAID。
根据 Linux 安装启动过程, initrd.img 加载时,会执行 init
命令进行初始化,然后执行 ./usr/bin/dracut-initqueue
,通过修改该初始化脚本中的调用操作,增加获取到 IP 地址后从 ks 服务器端获取配置 RAID 的脚本,实现 PXE 过程中动态配置 RAID 的操作。
总结如下:
- 读取全局环境变量
/tmp/ks_urls
,获得 ks 文件的服务器地址 - 从 ks 文件服务器 scripts 目录读取 raid 脚本并执行
- 再执行系统安装流程(可用 init u 来重新执行)
修改文件,cat ./test/usr/lib/dracut/hooks/initqueue/online/12-fetch-raid-net.sh
,增加 config_raid()
方法:
#!/bin/bash
# fetch-kickstart-net - fetch kickstart file from the network.
# runs from the "initqueue/online" hook whenever a net interface comes online
# initqueue/online hook passes interface name as $1
netif="$1"
command -v getarg >/dev/null || . /lib/dracut-lib.sh
. /lib/url-lib.sh
. /lib/anaconda-lib.sh
config_raid() {
local ks_server
ks_server=`cat /tmp/ks_urls | grep -oE "([0-9]{1,3}\.){3}[0-9]{1,3}"`
curl -o /tmp/raid.sh http://$ks_server/scripts/raid.sh
bash -x /tmp/raid.sh
if [ $? -ne 0 ];then
warn "Could Not Config Raid"
return 1
else
info "Config Raid Done"
return 0
fi
}
config_raid
[ $? -ne 0 ] && exit 1
其中,raid.sh
内为基本的 MegaCli 配置命令。
实际操作步骤
- 解压 initrd.img
- 加入 MegaCli 包
a.cp -r /opt ./
b. 通过ldd opt/MegaRAID/MegaCli/MegaCli64
查看 MegaCLi 缺少的依赖包并从正常系统拷入
c. 加入执行raid.sh
时需要的 shell 命令curl
,记得chmod +x
d. 打包 initrd.img - 替换原来 initrd.img ,PXE 启动进行测试
总结
- 现网环境没有服务器比较老旧,只能通过带内来进行实现(无奈.jpg)
- 个人思路,在实际机器(DELL)中成功运行,参考价值较小,希望大佬可以指正
- 了解
dracut-initqueue
很有意思 - 新的服务器貌似都支持了
Redfish
接口来进行硬件相关的配置
参考链接:
上一篇: 《剑指Offer》题目总结(持续更新)
下一篇: 剑指Offer题解(持续更新)