最近工作遇到一个需求:当机器中存在任意多个磁盘时,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 的描述,返回的内容是:
哈哈,这里就可以获得所有硬盘驱动的信息,有了这些信息,是不是硬盘数量,名称,大小,就全都有了。
通过set的方式,间接的将这些硬盘信息,作为参数,供后面的shell脚本使用。这样你就可以实现,任何你想要的磁盘配置效果了。