在使用PXE结合kickstart文件可实现网络全自动安装Linux系统,按照kickstart语法须要在ks.cfg文件中指定操作系统安装的位置(指定硬盘)如hda、sda或硬盘的UUID等唯一标识,分区信息以及建立mbr的位置。
如果硬盘命令指定有误,或与实际硬盘命令不符,无法找到对应的设备等那么anaconda会直接ks.cfg文件错误而导致安装失败;如果在ks.cfg文件中不指定硬盘信息,那么在进行到分区步骤时,anaconda会在此停下来让人工操作以便任务继续,那么批量主机安装系统时则严重降低部署效率。
- 正常情况下CentOS、RHEL、SUSE、Ubuntu等Linux系统按照SAS/SATA接口硬盘默认为/dev/sda、/dev/sdb、/dev/sdc....,但也有特殊情况,比如HP服务器主板加装P410阵列卡配置RAID后在CentOS/RHEL平台下默认以/dev/cciss/c0d0、/dev/cciss/c0来命名的;不同的虚拟化平台所虚拟化磁盘在Linux平台默认命令也可能不一样,Xen虚拟化磁盘默认以/dev/xvda、/dev/xvde命令;Kvm虚拟化磁盘默认以/dev/vda、/dev/vdb来命令等等。
- 如果主板直接接SAS/SATA硬盘或通过RAID控制器管理的本地硬盘通过PXE安装系统,会顺利将系统与mbr安装到本地硬盘上;如果主板通过光纤HBA卡映射的SAN存储,通过Linux内核优先扫描到,则被命令为/dev/sda等情况,那么默认可能会出现将操作系统安装到本地硬盘,而mbr安装到了SAN存储,导致安装完成后系统无法正常启动。
那么可否让anaconda可否根据磁盘大小或类型来自动识别磁盘的命名,并确定我们想要安装系统的位置呢?
这个问题是可以解决的,在kickstart语法中有pre预安装环境这一部分,在执行安装之前可做一些操作。在载入内核使用脚本判断出我们所需要安装硬盘的命名,再指定给kickstart文件调用即可。
这里我们使用容量大小为32GB的磁盘来安装操作系统与mbr,可从/proc/partitions文件内容判断第一块容量大小为32GB*1024*1024=3355442KB磁盘即可。
预安装脚本部分(注意%pre最后要以%end来结束标识):
disk=$(while read line;do awk ‘BEGIN{} {if ($3 == "33554432" && $2 == "0") print $4} END{}‘;done < /proc/partitions)
cat > /tmp/part-include << EOF
# Disk partitioning information
part / --asprimary --fstype="ext4" --ondisk=$disk --size=24576
part swap --fstype="swap" --ondisk=$disk --size=8191
EOF
将判断识别后的磁盘名称按照kickstart语法写入临时文件/tmp/part-include,再将kickstart文件中分区参数的部分修改为调用/tmp/part-include文件中的内容
%include /tmp/part-include
完整部分如下图:
就这样不论磁盘如何命名,仅依据容量来判定安装系统的位置实现灵活性安装系统。