使用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将硬件时间当作本地时间,但是我不想用,也不想介绍。

UEFI是什么,有什么用?如何使用UEFI方式安装系统?

UEFI直白的讲是一种系统启动方式,但是这样讲实际上是不严格的。UEFI的全称是统一可扩展固件接口(Unified Extensible Firmware Interface),这就表示实际上它是一系列统一的接口标准,但是我们通常更关注它对系统引导的影响,我们通常拿它和BIOS方式做对比,本片文章也主要讨论UEFI对于启动的影响。

我们在配置启动选项的时候通常看到的是UEFI和Legacy两种方式,Legacy也就是传统BIOS对应的启动方式。说是启动方式,实际上说成“发现启动的方式”更加好理解。因为在启动过程中UEFI和Legacy主要功能是发现磁盘上可以启动的选项。

现在我们就来看看Legacy方式和UEFI方式分别是怎么发现启动的。在早期,系统的启动项是写在主引导记录也就是MBR中的,这个记录只能写在磁盘开头的446字节中,很明显主引导记录的容量和位置都有很大的局限性,并且磁盘的分区信息也是写在主引导记录中的,主引导记录的容量限制就更加明显了。也正是因为主引导记录的体积限制,我们只能用它创建4个分区的描述,这也是广为流传的一个硬盘只能创建4个主分区的原因。因为主引导记录的特点,电脑在开机的时候只需要完成一定工作后读取主引导记录并按照主引导记录的描述继续读取需要运行的程序就可以了,但是如果主引导记录损坏,那整个磁盘就都会遇到故障,这也是使用Legacy经常遇到系统无法启动的原因。

而对应UEFI的引导方式不再继续使用MBR分区方式,而是采用GPT分区表。GPT分区表可以带来更多的分区和更大的分区容量。虽然很多人用不上更多的分区和更大的磁盘,但我依然推荐使用GPT分区方式。实际上GPT分区表里是有MBR的,但是包含MBR记录的目的仅仅是告诉那些只支持MBR的电脑不要乱动我的分区表。在使用GPT分区表的情况下,机器不能仅仅通过读取第一个扇区就确定可以从哪里启动了,但是不用担心因为UEFI比BIOS更加强大,它不仅能轻松发现哪些分区可以启动,甚至可以直接挂载分区进行文件管理。实际上UEFI发现启动选项正式依靠文件管理,UEFI可以直接读取各个分区的文件搜索可以启动的文件,如果你的机器是使用UEFI方式引导的,你通常可以在启动分区中发现一个叫做EFI的文件夹,这里面就是引导要用到的程序。如果你确定你的电脑是UEFI方式引导的,但是却看不到EFI文件,那是因为有一个专门的EFI分区,并且这个分区通常是没有设置卷标或者挂载出来。使用这个方式发现引导的好处很明显,首先避免的主引导记录的位置和容量的限制,所有分区的任意位置都可以存储引导信息和引导程序,其次,如果你的硬盘头部的扇区损坏了,你完全可以不用他们,只需要在分区的时候跳过它们,不管你的分区在哪个位置,都可以通过写入EFI文件配置启动。其次得益于UEFI的文件管理功能,有些高级的主板甚至支持直接挂载分区对分区中的文件进行编辑,这样在发生引导错误的时候我们就可以直接通过覆写文件的方式进行修复,实际上Windows10上的自动修复修复功能就是这样实现的(但是确实更加复杂),相比传统的编辑磁盘头部的主引导记录,这种方式真避免了很多麻烦。

那么如何设置UEFI启动呢?配置UEFI启动需要在安装系统的时候配置。首先你要确定你的机器支持UEFI模式启动,只要你的机器不是古董机通常都可以使用UEFI方式启动,你可以在BIOS(你注意到我这里使用BIOS指代UEFI和传统BIOS,实际上UEFI就是一种BIOS)选项中查看引导选项,通常有Legacy、UEFI和兼容3种模式,如果你确定你不在需要使用Legacy启动方式,你也可以直接设置为仅UEFI模式。

然后需要确定你要安装的操作系统是否支持UEFI模式启动。方法很简单,使用虚拟磁盘挂载安装镜像或者使用解压缩软件打开镜像,查看镜像中有没有EFI文件夹。如果存在EFI文件夹,那就说明这个镜像支持以UEFI的方式启动。

下面我们就来创建一个可以使用UEFI模式启动的U盘,使用Legacy方式启动的启动U盘通常需要使用烧录软件模拟成CD-ROM进行创建,相比之下,创建UEFI模式启动的U盘就简单多了。首先将U盘格式化为FAT32格式,如果你的U盘已经是FAT32格式就不需要再进行格式化了,然后使用虚拟光驱挂载镜像,将所有文件拷贝的U盘中,或者直接使用解压缩工具解压到U盘中。得益于UEFI模式使用文件管理发现启动项的方式,只要使用主板上的UEFI程序支持的文件系统并将所有安装文件拷贝到分区中就可以创建一个引导分区。同理,使用任何主板支持的存储介质都可以创建一个安装盘。

值得之前没有使用UEFI安装系统的同学注意,在使用UEFI安装系统的时候要选择有UEFI前缀的引导项,如果你找不到这个引导项,需要到BIOS中确认是否支持或者打开UEFI引导方式。

希望通过上文,你可以明白UEFI并没有多么复杂,相比之下使用UEFI来配置计算机更加简单,并且可以带来更多的好处。甚至有些厂商会在UEFI中嵌入反病毒程序,这也都得益于UEFI文件管理等新特点。至于BIOS和UEFI在运行中的区别,我们可以理解成传统BIOS只知道读取磁盘的第一条记录,然后按照他的描述去启动,而UEFI不一样,UEFI清楚的知道自己启动的是什么以及如何启动它,甚至还可以对启动项目安排一下,总之更高级就是了。