PXE, DHCP, TFPT 实现自动化安装 CentOS

来源:互联网 发布:中文模糊匹配算法 编辑:程序博客网 时间:2024/05/29 10:58

在早期的服务器中有很多无盘工作站,就是没有硬盘的主机。没有硬盘就是没有操作系统,那么这样的主机如何开机呢?

在这种场景中,我们为那些无盘主机提供了一个共享磁盘的服务器,这些磁盘中存储着无盘主机的操作系统。当无盘主机启动时,根据网络协议去服务器的共享磁盘中读取属于自己主机的操作系统的基本文件,然后加载到本地内存中将操作系统启动起来。

但是,没有操作系统哪来的IP地址呢?没有IP地址怎么进行网络通信呢?

即使在同一个网段是根据MAC地址进行通信的,但是不能根据MAC地址去进行寻址去确定哪一台是服务器啊。我们知道,当我们需要与同一个网段中的主机进行通信时需要先广播,确定该主机的MAC地址,然后才根据MAC地址进行通信的。但是如果只有MAC地址,怎么去确定需要通信的主机的MAC地址呢?

基于这种场景,研发了一种协议,叫做bootp协议,而无盘主机的网卡是一种特殊网卡,能够在开机瞬间自我唤醒并且基于RARP协议进行广播将自己扮演成bootp的客户端与服务端进行通信,去向服务器去申请获取IP地址。bootp服务端有一个IP列表,会从这个列表中挑选一个可用的IP给客户端。当客户端拥有IP之后会从服务器端获取操作系统基本文件,加载到本地内存中,从而启动。当第一次获取之后,就会永久有效。服务器端就会将该IP地址永久分配给该客户端。

当硬盘越来越廉价之后,bootp协议就发展为dhcp协议了。

一、DHCP

DHCP协议是网络通信中的一种协议,主要作用是为客户端分配IP。

(1)DHCP协议工作原理:

租约

  • dhcp discover:发现dhcp服务器。当主机需要IP地址的时候就会广播,谁是dhcp服务器

  • dhcp offer:服务器提供IP、掩码、网关以及其他

  • dhcp request:客户端回复报文,表明已经选择了一个IP

在同一个局域网内,或许并不只有一台服务器,客户端会选择第一个到达网卡的服务器提供的IP,并进行检测,看是否有其他主机在使用这个IP。因为可能有其他主机通过静态配置IP地址将该IP使用。如果有主机正在使用这个IP,那么客户端就会拒绝该IP。如果一切正常,客户端才会回复报文。被选中的服务器就会将该IP从可用IP列表中删除。没有别选中的服务器就会收回自己的IP地址放入IP池中,等待下一次dhcp请求。

  • dhcp ack:服务器端接收到了客户端的回复报文之后也会进行确认

续租

当客户端使用时间过去了一半的时候,就会向服务器直接发送dhcp request请求,表明想继续使用该IP:

  1. 如果服务器端同意请求,那么则会响应dhcp ack报文。
  2. 如果服务器端没有响应,那么就会在剩下时间过去一半之后再来询问,如果还没有,则会在剩下时间过去一半之后再来询问,如果还没有,则发起dhcp discover报文
  3. 如果服务器端响应拒绝,那么则表示dhcp的进程池被管理员修改了,里面没有该IP地址。那么客户端就会发起dhcp discover报文

(2)DHCP服务配置:

在CentOS中有两个包可以配置DHCP服务,一个是dhcp包,一个是dnsmasq,这里以 dhcp 包为例。

安装 dhcp# yum install -y dhcpdhcpd配置文件要从其他地方copy过来# cp /usr/share/doc/dhcp-4.1.1/dhcpd.conf.sample /etc/dhcp/dhcpd.conf# vim /etc/dhcp/dhcpd.conf

/etc/dhcp/dhcpd.conf

 option domain-name "example.org";      //通常来说也没什么意义option domain-name-servers 8.8.8.8;         //能够覆盖客户端的/etc/resolve.conf文件options routers 172.18.0.1          //也可以使用在这里,表示全局变量default-lease-time 600;     //默认租约期限,单位是s,可以修改为一天86400max-lease-time 7200;        //最大租约期限,也可以修改为一天86400subnet 172.18.0.0 netmask 255.255.0.0 {         //可选的IP范围        range 172.18.0.100 172.18.0.200;        options routers 172.18.0.1;             //一般使用本机IP作为路由}

启动服务,并查看分配出去的IP:

# service dhcpd start查看监听端口,DHCP 监听的是 udp/67# ss -unlp查看分配出去的IP# cat /var/lib/dhcpd/dhcpd.leases

二、tftp

tftp 一个简单、小型的文件共享服务器,为什么这里要使用到 tftp 服务器呢?

网卡在制作过程中,由于受限于大小,在其中内置了一个小型的 tftp 客户端模块,以便于能够实现自动化安装。

(1)tftp 的安装:

# yum install -y tftp-server# rpm -ql tftp-server/etc/xinetd.d/tftp      //由于tftp很少使用,所以由超级守护进程代为管理/usr/sbin/in.tftpd/var/lib/tftpboot       //共享目录

(2)tftp 的启动:

要启动 tftpd 首先要启动超级守护进程 xinetd,并且在配置文件中将 tftpd 开启

# vim /etc/xinetd.d/tftpservice tftp{    socket_type     = dgram    protocol        = udp     wait            = yes     user            = root    server          = /usr/sbin/in.tftpd    server_args     = -s /var/lib/tftpboot    disable         = no                //将 disable 修改为 no    per_source      = 11    cps         = 100 2    flags           = IPv4}启动服务器# service xinetd start查看是否正常监控,tftpd 监听的是 udp/67, 而且是 xinetd 代为监听# ss -unlp

三、PXE

PXE: preboot execute environment,预引导执行环境,可以理解为它为 DHCP 与 tftp 服务提供了环境。详情请参考:PXE-维基百科

每一个计算机要启动都会去找 bootloader,然后根据 bootloader 去找到内核,不管是硬盘还是光盘,其中都包括了 bootloader 。那么根据网卡怎么去找 bootloader 呢?

pxelinux 提供了能够引导文件,其中的 pxelinux.0 就相当于 bootloader, 但是在 CentOS 中该文件由 syslinux (pxelinux 是 syslinux 的衍生产品)提供,将其中的 pxelinux.0 复制到 tftp 目录下,并由 dhcp 服务指明该文件所在位置。

而在这一过程中,tftp 服务所负责的是提供 bootloader(pxelinux.0)与开机所需要的文件与内核,dhcp 服务所负责的便是给客户端提供IP,并指明 tftp 服务的 IP 与 pxelinux.0 的位置。流程大致如下:

PXE

(1)获取 pxelinux.0 并将该文件拷贝到 tftp 服务的共享根目录

# yum install -y syslinux# ll /usr/share/syslinux/pxelinux.0 -rw-r--r-- 1 root root 26759 Oct 16  2014 /usr/share/syslinux/pxelinux.0# cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/

(2)配置 DHCP 服务,指明 pxelinux.0 的位置

# vim /etc/dhcp/dhcpd.confsubnet 172.18.0.0 netmask 255.255.0.0 {    range 172.18.0.100 172.18.0.255;    option routers 172.18.0.1;    next-server 172.18.0.1;     tftp 服务器的 IP,通常都是与 DHCP 在同一个服务器上面    filename "pxelinux.0";          bootloader 文件}

(3)将内核文件与其他配置文件复制到 tftp 中

挂载光盘,复制文件# mount -r /dev/cdrom /mnt/cdrom# cp /mnt/cdrom/images/pxeboot/{vmlinuz,initrd.img} /var/lib/tftpboot/# cp /mnt/cdrom/isolinux/{vesamenu.c32,splash.jpg,boot.cat} /var/lib/tftpboot/如果嫌麻烦,也可以直接将光盘文件中 isolinux 目录下的所有文件全部复制到 tftp 的根目录中,但是要将grub.conf文件删除在 tftp 根目录下创建一个 pexlinux.cfg 目录,并将 /mnt/cdrom/isolinux/grub.conf 复制到该目录中并改名为 default# mkdir /var/lib/tftpboot/pxelinux.cfg# cp /mnt/cdrom/isolinux/grub.conf /var/lib/tftpboot/pxelinux.cfg/default
原创粉丝点击