欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

通过修改 initrd.img 来实现 PXE 启动过程中进行硬盘 RAID 初始化

程序员文章站 2022-06-14 23:01:00
...

环境: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 的操作。

总结如下:

  1. 读取全局环境变量 /tmp/ks_urls,获得 ks 文件的服务器地址
  2. 从 ks 文件服务器 scripts 目录读取 raid 脚本并执行
  3. 再执行系统安装流程(可用 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 配置命令。

实际操作步骤

  1. 解压 initrd.img
  2. 加入 MegaCli 包
    a. cp -r /opt ./
    b. 通过 ldd opt/MegaRAID/MegaCli/MegaCli64 查看 MegaCLi 缺少的依赖包并从正常系统拷入
    c. 加入执行 raid.sh 时需要的 shell 命令 curl ,记得 chmod +x
    d. 打包 initrd.img
  3. 替换原来 initrd.img ,PXE 启动进行测试

总结

  1. 现网环境没有服务器比较老旧,只能通过带内来进行实现(无奈.jpg)
  2. 个人思路,在实际机器(DELL)中成功运行,参考价值较小,希望大佬可以指正
  3. 了解 dracut-initqueue 很有意思
  4. 新的服务器貌似都支持了 Redfish 接口来进行硬件相关的配置

参考链接: