任意多个磁盘时的kickstart配置方法

最近工作遇到一个需求:当机器中存在任意多个磁盘时,kickstart配置文件应该如何编写?
我查询了一些资料,得到的结果大多是针对特定数量的磁盘的配置(比如,2个,3个)。 那么假如因为某些原因,在安装系统时,不知道有多少块磁盘,kickstart配置如何编写呢? 或者说,有没有一种kickstart配置方法,能适应任意多个磁盘呢?

带着这个问题,我总结出一种方法,可以适用任意多个磁盘的场景。
先展示一下完整的ks文件内容,其中各个配置的含义不是本文讨论的范围,这里就不赘述了。

#version=DEVEL

url  --url=http://ipxe.server/os/openeuler2203
text
firstboot --enable  
keyboard --vckeymap=us --xlayouts='us'
lang en_US.UTF-8

rootpw --iscrypted $6$NJ5Fs0ISKECuHT.G$vPG.17ll3Sc05Fb6kY1OawQS0sk6ydIzEpIcX/6ekiMG5kEshblqkSkhfbcDTz7DC9xkLqSWtEkSWHTeyseSZ/

services --disabled="chronyd"

timesource --ntp-disable
timezone Asia/Shanghai --utc

%include  /tmp/part
shutdown

%packages
@^minimal-environment
tar
%end

%addon com_redhat_kdump --disable --reserve-mb='auto'

%end


%pre
#!/bin/sh

#set sda 61057.3359375 sdb 476940.023438 sdc 30524.0 mmcblk0boot0 30524.0
set $(list-harddrives)

disk_info=("$@")
let disk_num=$#/2
disk_name=()
disk_size=()

for i in "${!disk_info[@]}"
do
    if (( $i % 2 == 1 )); then
        disk_size+=("${disk_info[i]}")
    else
        if [[ ${disk_info[i]} == mmcblk0* ]]; then
            disk_name+=("${disk_info[i]:0:7}")
        else
            disk_name+=("${disk_info[i]}")
        fi
    fi
done

echo "bootloader --append=\" crashkernel=auto\" --location=mbr --driveorder=${disk_name[0]}" > /tmp/part
disk_names=""
for ((i=0;i< ${disk_num};i++))
do   
    if (( $i ==0 )); then
        disk_names+="${disk_name[$i]}"
    else
        disk_names+=",${disk_name[$i]}"
    fi
done

echo "clearpart --drives=${disk_names} --all --initlabel" >> /tmp/part

disk_size0=`echo ${disk_size[0]} | cut -d "." -f 1`
if [ $disk_size0 -gt 2050000 ]; then
    echo "part biosboot --fstype=biosboot --size=1" >> /tmp/part
fi

echo "ignoredisk --only-use=${disk_names}" >> /tmp/part
echo "part /boot --fstype=\"xfs\" --ondisk=${disk_name[0]} --size=1024" >> /tmp/part

pv=""
for ((i=0;i< ${disk_num};i++))
do
    echo "part pv.${i} --size=1 --ondisk=${disk_name[$i]} --grow" >> /tmp/part
    pv+=" pv.${i}"
done
echo "volgroup openeuler --pesize=32768 $pv" >> /tmp/part
echo "logvol /var  --fstype=\"xfs\"  --size=8192  --name=var --vgname=openeuler" >> /tmp/part
echo "logvol swap  --fstype=\"swap\" --size=100   --recommended --name=swap --vgname=openeuler" >> /tmp/part
echo "logvol /     --fstype=\"xfs\"  --size=20480 --name=root --vgname=openeuler" >> /tmp/part
echo "logvol /data --fstype=\"xfs\"  --size=1   --grow --name=data --vgname=openeuler" >> /tmp/part
%end
%post

%end

其中的关键是:%include 以及 %pre 部分。

%include 部分表明此处插入一段引用,引用的具体内容为,/tmp/part 文件中的内容。
而 %pre 部分就是往/tmp/part 文件中写入有关磁盘划分的配置。%pre部分本质上是一段shell 脚本。但是由于kickstart的执行是在chroot的模式下进行的,有很多限制。所以,如何在有限制的情况下编写这段shell脚本成了问题的关键。

list-harddrives

%pre 部分,最关键的一句是“set $(list-harddrives)”,这个命令有什么作用呢?要回答这个问题,要先看list-harddrives 返回什么?
根据https://anaconda-installer.readthedocs.io/en/latest/list-harddrives.html 的描述,返回的内容是:
任意多个磁盘时的kickstart配置方法_第1张图片
哈哈,这里就可以获得所有硬盘驱动的信息,有了这些信息,是不是硬盘数量,名称,大小,就全都有了。

通过set的方式,间接的将这些硬盘信息,作为参数,供后面的shell脚本使用。这样你就可以实现,任何你想要的磁盘配置效果了。

你可能感兴趣的:(个人总结,linux,kickstart,pxe)