centos7-PXE自动安装系统


一、PXE简介

对与运维人员来说,如何安装操作系统想必并不陌生;但当我们面对大量需要安装系统的环境时,自动化安装系统就成了一项必备的技能;下面就让我们一起走进PXE这项批量自动化安装操作系统的技术吧。

PXE(Pre-boot Execution Environment,预启动执行环境)是由Intel公司开发的最新技术,工作于Client/Server的网络模式,支持工作站通过网络从远端服务器下载映像,并由此支持通过网络启动操作系统,在启动过程中,终端要求服务器分配IP地址,再用TFTP(trivial file transfer protocol)或MTFTP(multicast trivial file transfer protocol)协议下载一个启动软件包到本机内存中执行,由这个启动软件包完成终端基本软件设置,从而引导预先安装在服务器中的终端操作系统。PXE可以引导和安装Windows,linux等多种操作系统。

1、工作原理

(1) Client向PXE Server上的DHCP发送IP地址请求消息,DHCP检测Client是 否合法(主要是检测Client的网卡MAC地址),如果合法则返回Client的 IP地址,同时将启动文件pxelinux.0的位置信息一并传送给Client 
(2) Client向PXE Server上的TFTP发送获取pxelinux.0请求消息,TFTP接收 到消息之后再向Client发送pxelinux.0大小信息,试探Client是否满意,当 TFTP收到Client发回的同意大小信息之后,正式向Client发送pxelinux.0 
(3) Client执行接收到的pxelinux.0文件 
(4) Client向TFTP Server发送针对本机的配置信息文件(在TFTP 服务的 pxelinux.cfg目录下),TFTP将配置文件发回Client,继而Client根据配 置文件执行后续操作。 
(5) Client向TFTP发送Linux内核请求信息,TFTP接收到消息之后将内核文件 发送给Client ? Client向TFTP发送根文件请求信息,TFTP接收到消息之后返回Linux根文 件系统 
(6) Client启动Linux内核 
(7) Client下载安装源文件,读取自动化安装脚本

2、PXE客户机的启动流程

1、	PXE客户机从DHCP服务器获取IP地址,以及tftp服务器IP和PXE启动文件的路径。
2、	PXE客户机从TFTP服务器获取pxelinux.0启动文件。
3、	PXE客户机从TFTP服务器获取pxelinux.cfg/default启动菜单文件、内核文件vmlinuz、系统镜像initrd.img
4、	PXE客户机根据default菜单文件的设置启动安装程序。
5、	用户手动进行系统安装,或PXE客户根据ks.cfg自动应答文件来全自动安装系统。

二、部署

1.1、系统环境介绍

root@centos7-test ~]# hostnamectl
   Static hostname: centos7-test
         Icon name: computer-vm
           Chassis: vm
        Machine ID: 8dd8387e9e6847de9ebf22d7d1efeaaf
           Boot ID: 2f0863e52b274506b23b49c6b875f976
    Virtualization: vmware
  Operating System: CentOS Linux 7 (Core)
       CPE OS Name: cpe:/o:centos:centos:7
            Kernel: Linux 3.10.0-1160.62.1.el7.x86_64
      Architecture: x86-64


1.2、服务器初始环境准备

关闭selinux

在/etc/selinux/config文件中把SELINUX=enforcing修改为SELINUX=disabled

修改后重启系统使配置生效

查看SELinux的状态

[root@centos7-test ~]# sestatus
SELinux status:                 disabled

1.3、安装并配置DHCP服务,创建DHCP作用域,启动服务

安装dhcp服务
yum install -y dhcp

查看dhcp配置文件
root@centos7-test ~]# locate  dhcpd.conf
/etc/dhcp/dhcpd.conf
/usr/share/doc/dhcp-4.2.5/dhcpd.conf.example

修改DHCP服务的配置文件,如下:

#
# DHCP Server Configuration file.
#   see /usr/share/doc/dhcp*/dhcpd.conf.example
#   see dhcpd.conf(5) man page
#
subnet  192.168.200.0  netmask 255.255.255.0 {        #指定为哪个网段分配网络参数
      option subnet-mask    255.255.255.0;          #设置子网掩码
      option domain-name-servers  114.114.114.114;      #设置分配给客户端的DNS服务器地址
      range 192.168.200.200 192.168.200.254;          #设置准备为客户端分配的IP地址范围
      default-lease-time    21600;                 # 地址租赁时间 600秒后失效
      max-lease-time       43200;
      next-server         192.168.200.101;            # 下一个要访问的地址,就是tftp地址。
      filename           "pxelinux.0";              #要访问tftp上哪一个文件。
}

重启dhcp服务,并设为开机自启
systemctl restart  dhcpd.service
systemctl enable  dhcpd.service

在防火墙开放dhcp服务
firewall-cmd --permanent --zone=public --add-service=dhcp

重启firewalld使配置生效
systemctl restart firewald

查看服务端口
ss -tulanp|grep -w 67

 1.4、安装并TFTP文件共享服务,并进行配置

yum  install  -y  tftp-server  xinetd  syslinux

修改tftp服务配置文件
cat /etc/xinetd.d/tftp
把disable  =  yes  改为disable = no

重启xinetd服务并设为开机自启
systemctl restart xinetd.service
systemctl enable xinetd.service

在防火墙开放tftp服务
firewall-cmd --permanent --zone=public --add-service=tftp

重启firewalld使配置生效
systemctl restart firewald

 1.5、准备PXE启动文件

PXE服务器上tftp服务要准备的启动文件如下:

pxe启动文件:/var/lib/tftpboot目录中的文件列如下

pxelinux.0   启动的引导程序。在系统中安装syslinux软件后得到的。(查:updatedb;locate  pxelinux.0)

pxelinux.cfg/default   启动时的菜单文件,相当于grub.conf。从系统光盘的isolinux/isolinux.cfg复制得到。

vmlinuz    内核文件,从系统光盘的pxeboot/vmlinuz复制得到

initrd.img  系统映像文件,从系统光盘的pxeboot/initrd.img复制得到

*.msg    消息文件,从系统光盘的isolinux/*.msg复制得到。

vesamenu.c32   grub菜单的32位管理程序。从系统光盘的isolinux/ vesamenu.c32复制得到。

splash.jpg  grub界面的背景图片。从系统光盘的isolinux/ splash.jpg复制得到。

准备PXE启动文件的具体实施:(此案例的系统光盘是挂载在/dvd目录下)

挂载centos7镜像

创建挂载目录
mkdir /dvd

将centos7镜像挂载到/dvd目录
mount /var/www/html/centos7/CentOS-7.7-x86_64-Everything-1908.iso /dvd

说明:如果系统内没有镜像文件,可以上传货下载一个镜像文件进行挂载

 进入/var/lib/tftpboot目录,复制一些PXE启动需要的文件

进入/var/lib/tftpboot目录
cd  /var/lib/tftpboot

将pxelinux.0复制到该目录

 cp  -v  /usr/share/syslinux/pxelinux.0   ./

 

 创建pxelinux.cfg目录

 mkdir  -v  pxelinux.cfg

 复制/dvd/isolinux/* 下的所有文件到当前目录

 cp  -v  /dvd/isolinux/*   ./

 

 查看是否复制成功

 [root@centos7-test /var/lib/tftpboot]# ls
 boot.cat  grub.conf   isolinux.bin  memtest     pxelinux.cfg  TRANS.TBL     vmlinuz
 boot.msg  initrd.img  isolinux.cfg  pxelinux.0  splash.png    vesamenu.c32

 

 将isolinux.cfg文件移动到pxelinux.cfg目录下并从命名为default

 mv  isolinux.cfg  pxelinux.cfg/default

 最后重启PXE客户机测试,可以看到启动到安装菜单界面

1.6、安装Nginx服务,并配置使其显示目录文件列表

安装Nginx服务
yum install -y nginx

修改Nginx服务配置文件,使其显示目录列表

找到http模块,修改如下
cat /etc/nginx/nginx.conf

...

http {

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '

                      '$status $body_bytes_sent "$http_referer" '

                      '"$http_user_agent" "$http_x_forwarded_for"';

 

    access_log  /var/log/nginx/access.log  main;

 

    sendfile            on;              #自动显示目录

    tcp_nopush          on;           #人性化方式显示文件大小否则以byte显示

    tcp_nodelay         on;            #按服务器时间显示,否则以gmt时间显示

    keepalive_timeout   65;

    types_hash_max_size 4096;

    include       mime.types;

    default_type  application/octet-stream;

    autoindex on;

    autoindex_exact_size off;              #默认为on,显示出文件的确切大小,单位是bytes。改为off后,显示出文件的大概大小,单位是kB或者MB或者GB

    autoindex_localtime on;      #默认为off,显示的文件时间为GMT时间。改为on后,显示的文件时间为文件的服务器时间

 

    server_names_hash_bucket_size 128;

    client_header_buffer_size 32k;

    large_client_header_buffers 4 32k;

    client_max_body_size 8m;

    limit_conn_zone  $binary_remote_addr zone=one:10m;

    gzip  on;

    gzip_min_length  1k;

    gzip_buffers     4 16k;

    gzip_http_version 1.0;

    gzip_comp_level 2;

    gzip_types       text/plain application/x-javascript text/css application/xml;

    gzip_vary on;

 

    log_format  wwwlogs  '$remote_addr - $remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for';

 

         include vhost/*.conf;

 

    server {

        listen       80;

        listen       [::]:80;

        server_name  _;

#        root         /usr/share/nginx/html;

        root         /var/www/html;

        # Load configuration files for the default server block.

        include /etc/nginx/default.d/*.conf;

 

        error_page 404 /404.html;

        location = /404.html {

        }

 

        error_page 500 502 503 504 /50x.html;

        location = /50x.html {

        }

    }

...


检查配置是否正确
root@centos7-test /var/lib/tftpboot]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

重启Nginx服务,并设为开机自启
systemctl restart nginx.service
systemctl enable nginx.service

在防火墙开放nginx服务
firewall-cmd --permanent --zone=public --add-service=nginx

重启firewalld使配置生效
systemctl restart firewald

 1.7、准备centos系统安装源

在/var/www/html/下创建os7、os8、os9三个目录
[root@centos7-test ~]# mkdir /var/www/html/{os7,os8,os9}
[root@centos7-test ~]# ls /var/www/html/
centos7  centos8  centos9  os7  os8  os9

将上面挂载到/dvd目录下的centos7镜像文件全部复制到os7目录下
cp -rf /dvd/* /var/www/html/os7/

之后卸载centos7镜像文件
umount /dvd

挂载centos8系统镜像到/dvd目录下,挂载成功后拷贝到os8目录下
mount /var/www/html/centos8/CentOS-Stream-8-x86_64-latest-dvd1.iso /dvd

cp -rf /dvd/* /var/www/html/os8/

卸载centos8镜像文件
umount /dvd

挂载centos9系统镜像到/dvd目录下,挂载成功后拷贝到os9目录下
mount /var/www/html/centos9/CentOS-Stream-9-latest-x86_64-dvd1.iso /dvd
cp -rf /dvd/* /var/www/html/os9/

至此,三个安装源均准备完毕

重启nginx服务,并进行访问测试
systemctl restart nginx.service

在浏览器输入服务器IP地址进行访问

 1.8、kickstart文件准备

说明:

生成kickstart配置文件的三种方法:

方法1、 每安装好一台Centos机器,Centos安装程序都会创建一个kickstart配置文件,记录你的真实安装配置。如果你希望实现和某系统类似的安装,可以基于该系统的kickstart配置文件来生成你自己的kickstart配置文件。(生成的文件名字叫anaconda-ks.cfg位于/root/anaconda-ks.cfg)

方法2、Centos提供了一个图形化的kickstart配置工具。在任何一个安装好的Linux系统上运行该工具,就可以很容易地创建你自己的kickstart配置文件。kickstart配置工具命令为redhat-config-kickstart(RHEL3)或system-config-kickstart(RHEL4,RHEL5).网上有很多用CentOS桌面版生成ks文件的文章,如果有现成的系统就没什么可说。但没有现成的,也没有必要去用桌面版,命令行也很简单。

方法3、阅读kickstart配置文件的手册。用任何一个文本编辑器都可以创建你自己的kickstart配置文件。

创建存放ks文件的目录,并创建ks.cfg文件

创建ks文件目录
mkdir -p /var/www/html/ks

将根目录下的anaconda-ks.cfg复制到/var/www/html/ks目录下,并重命名为centos7_ks.cfg
cp anaconda-ks.cfg /var/www/html/ks/centos7_ks.cfg

 编辑centos7_ks.cfg文件