使用Cobbler配置PXE服务器

之前我介绍过如何手动配置一个PXE服务器,但是手动配置PXE服务器步骤太过繁琐,而且有太多配置文件需要设置,很容易发生遗漏。幸好已经有大神帮我们解决了这个问题(我本来想写一个简单的Web代理程序,之前我在github上寻找过这样的程序,但是没有找到)。本篇文章我将尝试使用Cobbler解决手动配置PXE服务器的麻烦问题,Cobbler是一个PXE管理程序,可以用来管理镜像和kickstart配置文件等。 Cobbler 最初由 Michael DeHaan 编写,现在项目主导人是 James Cammarata, 他目前在 Ansible 公司工作。(所以我们后面还会介绍ansible的使用。)

本文使用的是CentOS 7系统,依照Cobbler官网的 quick start 进行部署,不同的系统会有少许区别,Cobbler对 red hat系的系统更加友好。

首先安装cobbler, CentOS7 原生库中没有Cobbler,可以安装epel-release库。

yum install -y epel-release

然后安装cobbler

yum install -y cobbler

请留意虽然cobbler会帮助安装tftp和httpd,但是并不会帮助安装dhcp,所以安装完成cobbler后还需要手动安装dhcp。

yum install -y dhcp

安装完成后需要进行一些必要的配置,配置文件是/etc/cobbler/settings,使用yaml格式。

1.部署后的默认密码,default_password_crypted:”$1$bfI7WLZz$PxXetL97LkScqJFxnW7KS1″

这里配置的密码是加密后的密码,你可以使用openssl passwd -1输入密码并得到加密后的密码,然后将得到的密码配置到这里。

2.server和next_server地址,server地址指的是cobbler server使用的地址,next_server地址指的是DHCP/PXE和TFTP服务器使用的地址。

3.DHCP管理和DHCP服务器模板

通过修改manage_dhcp设置是否由cobbler管理dhcp服务器,cobbler是通过生成dhcpd.conf管理dhcp服务器的,所以我们需要自行安装dhcp服务。

dhcpd.conf依据模板生成,模板文件是/etc/cobbler/dhcp.template,我们可以自定义template的内容。

cobbler将镜像保存在/var/www/cobbler/ks_mirror目录中,所以对/var目录的空间依赖很重,请确保/var目录有足够的空间。

启动Cobbler和设置自启动

使用命令

systemctl start cobblerd.service启动cobbler服务,

使用

systemctl enable cobblerd.service设置cobbler开机启动。

使用

systemctl status cobblerd.service查看cobbler服务状态。

启动cobblerd服务之前首先启动httpd服务,否则使用cobbler check检查时会报错。

systemctl start httpd

然后执行systemctl start cobblerd

cobbler check会为配置pxe服务器提供进一步的建议,你需要依照建议依次解决这些问题。处理完成后重启cobblerd服务。

systemctl restart cobblerd

反复检查并解决后,使用cobbler sync命令初始化cobbler服务。

看到任务完成后cobbler的部署就算完成了,但是不要忘了允许TFTP和HTTP通过防火墙,如果你是用firewalld防火墙,允许他们通过的操作相对简单。

firewall-cmd --add-service=tftp --permanent
firewall-cmd --add-service=http --permanent
firewall-cmd reload

当然也不要忘了保证dhcpd tftp httpd 的正常运行。

下面我们需要添加镜像,来使用cobbler。

首先下载需要的镜像,比如我是用CentOS 7 minimal镜像

将镜像挂载到合适的目录

mount -t iso9660 -o loop,ro CentOS-7-x86_64-Minimal-1708.iso /mnt                                                                                                                                                                                                                                                                                                       

然后使用cobbler import 命令添加镜像。

cobbler import --name=CentOS7 --arch=x86_64 --path=/mnt

添加完成会可以使用cobbler distro list 查看所有发行版,使用cobbler profile list 查看所有描述。

更详细的报告使用cobbler distro report –name=CentOS7-x86_64查看。

现在我们已经可以使用PXE启动了。

但是创建system object 可以使用cobbler更多的特征。使用命令

cobbler system add –name=test –profile=CentOS7-x86_64创建systemobject。

使用cobbler system list查看列表。

使用system 可以配置更多的信息。我现在还没有用到就不做介绍了,更多内容可以到cobbler官网查看。

使用firewalld设置NAT

之前配置的PXE服务器虽然已经可用,但是一直是将PXE服务器所在的机器作为子网的一台设备使用,其他客户机要上网还需要另外配置路由器,这样布置起来整个网络很复杂。所以干脆利用PXE服务器的双网卡设置NAT,让PXE服务器同时承担起网关的作用。

我搭建PXE服务器的时候使用的是CentOS7系统,使用CentOS7默认的防火墙搭建NAT非常简单方便,不需要设置内核参数等操作。我在网上找相关的教程找了好久都是既设置防火墙又调整内核参数,我觉的这样的操作很明显不优雅,不像是正确的操作。本文参照CSDN的一篇文章操作,全程只用到了firewalld。

首先我们要知道firewalld是按照zone来管理网络的,将网口添加到不同的zone下就会使用不同的规则,firewalld自带的两个zone:external和internal就是为NAT设置的,我们只需要将连接WAN的网口添加到external下,将连接LAN的网口添加到internal下就可以完成NAT的设置。我这里连接WAN的网口是enp3s0,连接LAN的网口是enp4s0。

使用命令

firewall-cmd --change-interface=enp3s0 --zone=external --permanent

将enp3s0添加到external zone下,命令中–permanent参数是设置永久配置。这个设置不会立即生效,需要重新使用命令 firewall-cmd –reload重新载入。如果不加–permanent设置会立刻生效,但是firewalld重启后会失效。

然后使用命令

firewall-cmd --change-interface=enp4s0 --zone=external --permanent

将enp4s0添加到internal zone下,同样使用firewall-cmd –reload,然后我们就可以将enp4s0的地址设置为子网网关,子网的设备就可以通过向enp4s0发送请求访问外网了。

请留意如果你之前public设置了自定义的配置,需要在internal重新配置。external zone默认也是允许ssh通过的,如果你不希望外网使用ssh进入网关,需要删除这个服务。

解决Windows和Linux双系统时间冲突的办法

对于使用双系统的小伙伴,从linux切换回windows会发现windows显示的时间会出现问题,这是因为windows将BIOS中保存的硬件时间当作本地时间来看待,而linux将BIOS时间作为UTC时间来看待。

这就会导致切换会Windows后时间会差你所在时区的量,解决这个问题有两个办法,一个办法是让Windows认为硬件时间是UTC时间,另一个办法是让linux认为硬件时间是本地时间。

我觉得全世界应该使用统一的时间戳,这样全世界在同一时刻的时间戳应该是一样的,和位置无关,而且可以直接通过比较时间戳的大小判断时间的先后,这样会避免很多麻烦,只有在你需要将时间呈现出来的时候才会根据时区转换出正确的时间。

所以在我看来最好的办法就是让Windows认为硬件时间是UTC时间,设置的方法是在注册表中添加一个RealTimeIsUniversal的变量。

首先在开始搜索regedit,或者使用Win+R运行regedit,找到\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation路径,在路径中添加一个变量为RealTimeIsUniversal的DWORD变量,然后将值设置为1.

添加RealTimeIsUniversal变量
设置RealTimeIsUniversal值为1

另外一种方法是设置linux将硬件时间当作本地时间,但是我不想用,也不想介绍。

扩展Linux根目录分区

扩展用lvm方式创建的分区是非常简单的操作,但是因为之前没有操作过,简单的记录一下。

我不喜欢只有步骤的文章,但是因为是简单记录我又不想在这里写太多的理论知识,所以在看这篇文章之前,我希望你最好知道什么是lvm,也清楚lvm一些关键的词汇。

首先我们要知道,调整物理分区的大小是很麻烦的,所以调整虚拟分区的大小实际上是通过增加物理分区实现的。

之前用来做实验的虚拟机觉得不会用太多存储空间,就只添加了一个8G的硬盘,在根目录空间紧张的情况下,需要在虚拟机上扩容这块虚拟磁盘。新增的空间不能直接使用,需要到虚拟机中将根目录扩容才可以。

开机后可以看到,sda的空间已经扩大到20G了,需要通过添加分区将额外的12G利用起来。

简单的可以使用fdisk指令添加分区,创建新的主分区就可以了。选择分区编号和大小那里我都是选择默认的。

有些文章提到要使用t指令修改分区类型,我觉的其实是没有必要的,后面的pvcreate指令会替我们做这件事情的,但是我也是第一次做扩容的操作,所以还没有实验。

然后我们要使用这个分区创建pv, 使用命令 pvcreate [分区]。

现在将新创建的pv添加到vg中,使用命令vgextend [vg] [pv]。

最后扩展根目录的lv,使用命令 lvextend -l [pe 数量] [lv]。

扩展lv最好使用按照PE数量操作。

现在我用的/dev/centos/root这个虚拟分区的体积已经增大了,但是df -h查看一下。

根分区的大小并没有变化,因为这里显示的是文件系统的格式话后的分区大小,我们还需要扩展文件系统分区的大小。

最后的最后,使用xfs_growfs 指令扩展文件系统大小。

刚开始,我看的教程使用的是resize2fs指令,我试了几遍也没有用,然后我反应过来应该是文件系统不同,查询了一下,果然resize2fs指令是用来调整ext系列格式分区的。

 

配置syslinux菜单界面

CentOS 7的安装引导菜单简洁美观,但是我们制作的pxe启动却需要使用指令引导,这真的算不上优雅。所以我们现在来制作一个启动引导菜单。

本文参考syslinux官网config文档操作,编辑菜单的详细参数可以参考menu文档。设计布局比较复杂,所以我们就复制CentOS7的布局到我们的配置文件中就可以了。

首先需要找到CentOS7安装光盘中的syslinux配置文件。挂载光盘到/media目录,syslinux的配置文件就在/media/isolinux中,打开isolinux.cfg。内容如下:

我们只需要参考这个文件编辑我们放在/var/lib/tftpboot/pxelinux/pxelinux.cfg/目录下的default就可以实现一个和CentOS7安装引导目录一样美观引导菜单。

注意,如果你的/var/lib/tftpboot/pxelinux目录下没有vesamenu.c32,你可以拷贝/media/isolinux目录下的vesamenu.c32文件到该目录下。

然后配置default文件如下,详细各参数是什么一次请参考syslinux官网文档,各标签中append的参数可以参考红帽的文档中的引导选项章节

然后开启PXE客户机,因为我没有使用背景图片,所以引导菜单看起来是下面的样子,如果你觉得很丑可以使用背景图片。

在原有PXE服务器上配置UEFI启动方式

先前我们已经配置了供BIOS启动使用的PXE服务器了,但是考虑到可能使用超过2T的系统盘,所以在原有的基础上配置供UEFI启动使用的环境。本文同样参考红帽CentOS7的文档准备网络安装章节。

之前我们已经配置过了dhcpd、tftp、httpd服务器了,就不需要重新配置了,只需要在原有的基础上添加UEFI启动文件。

挂载安装镜像光盘到/media目录,拷贝shim和grub2-efi安装包到/root目录,使用rpm2cpio shim-version-architecture.rpm | cpio -dimv命令提取shim包。在/var/lib/tftpboot/创建uefi目录。使用cp publicly_available_directory/boot/efi/EFI/redhat/shim.efi /var/lib/tftpboot/uefi/拷贝shim.efi到uefi目录,使用cp publicly_available_directory/boot/efi/EFI/redhat/grubx64.efi /var/lib/tftpboot/uefi/拷贝grubx64.efi到uefi目录。

在uefi目录创建grub.cfg文件,配置如下:

 

然后拷贝vmlinuz和initrd.img到uefi目录。

现在服务器已经配置好了,可是我还没有能从网络PXE启动的主板,现在还没发测试。

配置 Kickstart 安装

Kickstart的作用就是将安装系统过程中的配置自动化,同时也可以执行简单的脚本。这里我们就用最简单的办法先跑一边 Kickstart 安装。

首先配置一个空白的虚拟机,配置合适的虚拟磁盘,不要配置cdrom,不要安装系统,需要和之前配置的PXE_Server在同一个虚拟网络中。

开机,使用PXE安装,配置成想要的系统。安装完成后可以在/root目录下看到anaconda-ks.cfg文件,这个配置文件就是安装我们刚才的配置生成的。现在我们需要把他放在PXE_Server上,让PXE_Clinet通过网络抓取这个文件。

拷贝anaconda-ks.cfg到PXE服务器的/var/www/html目录下,通过浏览器访问http://192.168.100.3/anaconda-ks.cfg,测试是否能打开kickstart配置文件。然后修改/var/lib/tftpboot/pxelinux/pxelinux.cfg/目录下的default文件。参考红帽教程如何执行Kickstart安装?章节添加inst.ks配置项。如下:

 

使用现在虚拟机在通过PXE安装的时候就可以自动获取到Kickstart配置文件了。

新建一个空白的虚拟机进行测试。安装过程会自动执行,除了输入linux选项,不需要任何输入操作。

使用安装时生成的kickstart 配置文件不能满足我们的需求,我们需要对kickstart进行一定的定制。

1.禁用防火墙和selinux,虽然我非常不建议禁用防火墙和selinux,但是我的同事觉得有selinux和防火墙部署程序经常遇到问题太麻烦了,所以还是先禁用掉防火墙和selinux吧。我们需要在kickstart 配置文件中添加 firewall –disabled 和 selinux –permissive 来实现。

2.安装完成后自动重启,安装程序完成后默认是等待用户进行重启的,但是自动部署不可能等着用户去重启,需要安装完成后就自动重启并完成后面的操作,所以我们需要加入一行 reboot 指令。

3.配置安装后动作。

使用CentOS 7 搭建PXE_Server

具体部署过程参考redhat官方文档准备网络安装章节

新的项目需要部署大量的系统,所以需要做一个PXE_Server,之前有做过PXE_Server,但是过程没有记录下来。这次不光需要使用PXE安装操作系统,还需要进行设置和采集信息,所以后面还需要部署kickstart服务器。

首先需要一个可以正常使用的linux系统,我全新安装了一个CentOS 7 虚拟机,为了方便测试并且不影响公司其他人使用网络,我选择了使用NAT网络,并且需要关闭VMware的虚拟网络的DHCP,以免和后面PXE_Server的DHCP发生冲突。

因为关闭了DHCP,为了能使用yum安装软件,完成系统安装后需要配置网络,我是用nmtui工具进行配置。

配置的时候留意子网前缀和网关地址。

使用yum install tftp-server -y 安装tftp,安装成功后修改/etc/xinet.d/tftp 文件,将 disabled 参数从 yes 改为 no。如果使用防火墙需要允许tftp服务通过防火墙,测试环境下可以关闭防火墙。使用firewall-cmd –add-service=tftp –permanent永久允许tftp通过防火墙,success之后使用firewall-cmd –reload重载配置。

随后安装DHCP服务,我使用的是红帽条件的dhcpd服务,红帽官网有专门的教程。使用yum install dhcp -y安装dhcpd,如果你不需要进一步了解如何配置dhcp,按照网络安装章节的教程进行就可以了。配置/etc/dhcp/dhcpd.conf如下:

修改地址段为适合自己的配置。

接下来安装pxelinux.0,它的作用相当于传统启动中的grub。打开完整的DVD ISO镜像,我安装系统的时候使用的是minimal镜像,所以需要把VMware虚拟CD-ROM中的镜像换成完整的镜像,并将CD-ROM连接到虚拟机,后面也会用这个镜像做安装文件。将镜像挂载到/media目录,拷贝syslinux 的rpm包到合适的目录,教程中卸载了CD-ROM,因为我们后面还要继续用这个文件,所以就不卸载了。

然后使用rpm2cpio 提取rpm包,指令类似 rpm2cpio syslinux-4.05-13.el7.x86_64.rpm | cpio -dimv。使用mkdir /var/lib/tftpboot/pxelinux 创建pxelinux目录,并将提取出的pxelinux.0文件拷贝到pxelinux中,执行cp ~/usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/pxelinux。

在pxelinux/创建pxelinux.cfg/目录,并在pxelinux.cfg目录中创建default配置文件。参照红帽教程配置default文件,其中inst.repo=项目需要配置安装源,我们准备使用http安装源,所以先搭建引导要用的http服务器。

其他配置选项参考红帽文档引导选项的章节。配置http安装源教程参考准备安装源章节

首先使用yum install httpd -y安装httpd服务器,然后将DVD ISO 映像挂载到http服务器root目录中。教程中将文件全部拷贝到了http服务器root目录,我这里图省事就直接将影响挂载到了服务器目录,毕竟我们用的本来就是虚拟机。在/var/www/html下创建centos7目录,将/dev/cdrom挂载到/var/www/html/centos7目录下。随后使用systemctl start httpd.service 启动httpd,使用浏览器访问确认是否生效,注意需要使用firewalld-cmd –add-service=http –permanent && firewalld-cmd –reload配置firewalld允许http服务。可以访问之后别忘了打开httpd的开机启动,使用systemctl enable httpd.service。

继续编辑/var/lib/tftpboot/pxelinux/pxelinux.cfg/default文件,修改inst.repo=http://192.168.100.3/centos7。

复制引导映像到tftpboot/pxelinux/目录,使用命令cp /media/images/pxeboot/{vmlinuz,initrd.img} /var/lib/tftpboot/pxelinux/。

下面运行tftpd和dhcp服务PXE_Server就算搭建完成了,因为tftp现在已经不依赖xinetd了可以不用按照教程上的systemctl start xinetd.service 启动tftpd,而是直接执行systemctl start tftp。

下面进行PXE启动测试。

安装一台全新的虚拟机,设置硬盘但不设置cdrom。启动后PXE启动获得了正确的ip地址和配置文件,出现boot:提示符后回车启动默认选项,这是提示Could not find kernel image: vesamenu.c32之前配置的时候也出现过这个错误,我还不清楚是我理解不够还是红帽官方的文档有问题。解决的办法是看到boot:提示符后输入linux回车。或者修改default配置文件中的default为linux,就可以直接使用回车启动了。

 

使用U盘安装CentOS7卡在”Starting dracut initqueue hook…”的原因及解决办法

使用U盘安装系统的过程中遇到卡在Starting dracut initqueue hook这里的情况,过一会会报timeout的错误。这是因为安装程序没有找到安装文件的位置。

安装程序是按照卷标寻找分区的,可以在开机过程中按tab编辑开机选项,uefi启动按e编辑。

我们可以看到卷标是CentOS 7 x86_64,但是卷标长度超出了windows的卷标长度限制,并且Windows限制卷标只能使用大写字母,所以安装程序无法找到正确的分区。

所以按照之前查到的资料,编辑启动选项,按照路径查找镜像分区。首先等待timeout报错完成,这是会进入dracut的简易终端,cd /dev 执行ls查看有哪些分区,我的分区有sda和sdb、sdb4,所以sdb4就是镜像所在的分区,编辑inst.stage2=hd:LABEL=CentOS\x207\x2086_64为inst.stage2=hd:/dev/sdb4按enter开机,efi安装按ctrl+x启动。之后就能正常开机了。

更简单的方法是在制作完usb启动盘之后手动修改一个好记的卷标,然后在在进入引导项的时候编辑卷标为手动设置的卷标,比如我将卷标设置为“CENTOS 7”,然后编辑引导项为inst.stage2=hd:LABEL=CENTOS\x207,注意,windows手动设置的卷标只能是大写,所以就算你设置的是小写的卷标,windows也会自动转换为大写卷标。

或者如果你使用UEFI方式引导U盘,可以将安装文件复制到U盘之后,直接编辑/EFI/BOOT/grub.cfg,将CentOS\x207\x20x86_64修改为CENTOS\x207。这样就不需要每次开机的时候都编辑引导配置了。

或者直接使用Rufus进行刻录,卷标选项中填写一个符合Windows限制的卷标。