Centos7-PXE自动安装系统部署

发布时间 2023-10-05 00:11:17作者: 我的城市没有海

一、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) 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下载安装源文件,读取自动化安装脚本

 

 

二、系统环境介绍

[root@centos-pxe ~]# hostnamectl
   Static hostname: centos-pxe
         Icon name: computer-vm
           Chassis: vm
        Machine ID: 6f77c9d820f543cfa504e66735016f42
           Boot ID: f1f784b4d24f476d8d120d93e7d376bf
    Virtualization: vmware
  Operating System: CentOS Linux 7 (Core)
       CPE OS Name: cpe:/o:centos:centos:7
            Kernel: Linux 3.10.0-1160.99.1.el7.x86_64
      Architecture: x86-64

 关闭selinux

sed -i 's/^SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

 重启系统之后查看

[root@centos-pxe ~]# sestatus
SELinux status:                 disabled

 三、安装配置dhcp

1、安装dhcp服务

[root@centos-pxe ~]# yum install -y dhcp

 2、配置

修改配置文件如下:
vim /etc/dhcp/dhcpd.conf
subnet  192.168.100.0  netmask 255.255.255.0 {                #指定为哪个网段分配网络参数
      option subnet-mask    255.255.255.0;                    #设置子网掩码
      option domain-name-servers  223.5.5.5,223.6.6.6;        #设置分配给客户端的DNS服务器地址
      range 192.168.100.201 192.168.100.254;                #设置准备为客户端分配的IP地址范围
      default-lease-time    21600;                            # 地址租赁时间 600秒后失效
      max-lease-time       43200;
      next-server         192.168.100.100;                    # 下一个要访问的地址,就是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 firewalld
 
查看服务端口
ss -tulanp|grep -w 67

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

1、安装

yum  install  -y tftp tftp-server  xinetd  syslinux 

 2、配置

修改tftp服务配置文件
vim /etc/xinetd.d/tftp

service tftp
{
	socket_type		= dgram
	protocol		= udp						# TFTP默认使用UDP协议
	wait			= no						# no表示客户机可以多台一起连接,yes表示客户机只能一台一台连接
	user			= root
	server			= /usr/sbin/in.tftpd		
	server_args		= -s /var/lib/tftpboot		# 指定TFTP根目录(引导文件的存储路径)
	disable			= no						# no表示开启TFTP服务
	per_source		= 11
	cps			= 100 2
	flags			= IPv4
}

重启xinetd服务并设为开机自启
 
systemctl restart xinetd.service
systemctl enable xinetd.service
systemctl start tftp.service 
systemctl enable tftp.service 
在防火墙开放tftp服务
 
firewall-cmd --permanent --zone=public --add-service=tftp
 
重启firewalld使配置生效
systemctl restart firewalld

 四、准备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复制得到。

1、挂载centos镜像

创建挂载目录
mkdir /{dvd,dvd1}
 
将centos7镜像挂载到/dvd目录,将centos8镜像挂载到/dvd目录
[root@centos-pxe ~]# mount CentOS-7.7-x86_64-Everything-1908.iso /dvd
mount: /dev/loop0 写保护,将以只读方式挂载

[root@centos-pxe ~]# mount CentOS-Stream-8-x86_64-20221222-dvd1.iso /dvd1
mount: /dev/loop0 写保护,将以只读方式挂载

[root@centos-pxe ~]# df -hT
文件系统                类型      容量  已用  可用 已用% 挂载点
devtmpfs                devtmpfs  1.9G     0  1.9G    0% /dev
tmpfs                   tmpfs     1.9G     0  1.9G    0% /dev/shm
tmpfs                   tmpfs     1.9G   12M  1.9G    1% /run
tmpfs                   tmpfs     1.9G     0  1.9G    0% /sys/fs/cgroup
/dev/mapper/centos-root xfs       194G   24G  171G   13% /
/dev/sda1               xfs       2.0G  197M  1.8G   10% /boot
tmpfs                   tmpfs     378M     0  378M    0% /run/user/0
/dev/loop0              iso9660    11G   11G     0  100% /dvd1
/dev/loop1              iso9660    11G   11G     0  100% /dvd

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

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

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

[root@centos-pxe /var/lib/tftpboot]# cp  -v  /usr/share/syslinux/pxelinux.0   ./
"/usr/share/syslinux/pxelinux.0" -> "./pxelinux.0"

复制/dvd/isolinux/* 下的所有文件到当前目录
[root@centos-pxe /var/lib/tftpboot]# cp  -v  /dvd/isolinux/*   ./
"/dvd/isolinux/boot.cat" -> "./boot.cat"
"/dvd/isolinux/boot.msg" -> "./boot.msg"
"/dvd/isolinux/grub.conf" -> "./grub.conf"
"/dvd/isolinux/initrd.img" -> "./initrd.img"
"/dvd/isolinux/isolinux.bin" -> "./isolinux.bin"
"/dvd/isolinux/isolinux.cfg" -> "./isolinux.cfg"
"/dvd/isolinux/memtest" -> "./memtest"
"/dvd/isolinux/splash.png" -> "./splash.png"
"/dvd/isolinux/TRANS.TBL" -> "./TRANS.TBL"
"/dvd/isolinux/vesamenu.c32" -> "./vesamenu.c32"
"/dvd/isolinux/vmlinuz" -> "./vmlinuz"

创建centos7和centos8目录
mkdir {centos7,centos8}

将initrd.img,vmlinuz移动到centos7目录下
mv {initrd.img,vmlinuz} centos7

复制centos8镜像中的initrd.img,vmlinuz文件到centos8目录下
cp /dvd1/isolinux/{initrd.img,vmlinuz} centos8/

[root@centos-pxe /var/lib/tftpboot]# tree ./
./
├── beijing.png
├── boot.cat
├── boot.msg
├── centos7
│   ├── initrd.img
│   └── vmlinuz
├── centos8
│   ├── initrd.img
│   └── vmlinuz
├── grub.conf
├── isolinux.bin
├── memtest
├── pxelinux.0
├── pxelinux.cfg
│   ├── default
│   └── default.bak
├── splash.png
├── TRANS.TBL
└── vesamenu.c32

3 directories, 16 files

创建pxelinux.cfg目录
[root@centos-pxe /var/lib/tftpboot]# mkdir  -v  pxelinux.cfg
mkdir: 已创建目录 "pxelinux.cfg"

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

 五、、编辑default文件

编辑default文件
vim /var/lib/tftpboot/pxelinux.cfg/default

default vesamenu.c32
# timout时间是引导时等待用户手动选择的时间,设为1可直接引导,单位为1/10秒。
timeout 600

display boot.msg

# Clear the screen when exiting the menu, instead of leaving the menu displayed.
# For vesamenu, this means the graphical background is still displayed without
# the menu itself for as long as the screen remains in graphics mode.
menu clear
# 菜单背景图片、标题、颜色。
#指定背景图片,要求是640*480像素的文件,可以使用windowsPC上画图打开重设图片大小调整像素
menu background splash.png
#menu title CentOS 7
menu title ======== Welcome to Install the Centos System ========
menu vshift 8
menu rows 18
menu margin 8
#menu hidden
menu helpmsgrow 15
menu tabmsgrow 13

# Border Area
menu color border * #00000000 #00000000 none

# Selected item
menu color sel 0 #ffffffff #00000000 none

# Title bar
menu color title 0 #ff7ba3d0 #00000000 none

# Press [Tab] message
menu color tabmsg 0 #ff3a6496 #00000000 none

# Unselected menu item
menu color unsel 0 #84b8ffff #00000000 none

# Selected hotkey
menu color hotsel 0 #84b8ffff #00000000 none

# Unselected hotkey
menu color hotkey 0 #ffffffff #00000000 none

# Help text
menu color help 0 #ffffffff #00000000 none

# A scrollbar of some type? Not sure.
menu color scrollbar 0 #ffffffff #ff355594 none

# Timeout msg
menu color timeout 0 #ffffffff #00000000 none
menu color timeout_msg 0 #ffffffff #00000000 none

# Command prompt text
menu color cmdmark 0 #84b8ffff #00000000 none
menu color cmdline 0 #ffffffff #00000000 none

# Do not display the actual menu unless the user presses a key. All that is displayed is a timeout message.

menu tabmsg Press Tab for full configuration options on menu items.

menu separator # insert an empty line
menu separator # insert an empty line

label Centos7
  menu label ^Install CentOS-7-x86_64-Everything_Server_2009
  kernel centos7/vmlinuz
  append initrd=centos7/initrd.img ks=http://192.168.100.100/ks/centos7_server_ks.cfg

label Centos7
  menu label ^Install CentOS-7-x86_64-Everything_Desktop_2009
  kernel centos7/vmlinuz
  append initrd=centos7/initrd.img ks=http://192.168.100.100/ks/centos7_desktop_ks.cfg

label Centos7
  menu label ^Install CentOS-7-x86_64-Everything_Minimal_2009
  kernel centos7/vmlinuz
  append initrd=centos7/initrd.img ks=http://192.168.100.100/ks/centos7_minimal_ks.cfg

label Centos8
  menu label ^Install CentOS-Stream-8-x86_64-latest_Server
  kernel centos8/vmlinuz
  append initrd=centos8/initrd.img inst.repo=http://192.168.100.100/os8 inst.ks=http://192.168.100.100/ks/centos8_server_ks.cfg

label Centos8
  menu label ^Install CentOS-Stream-8-x86_64-latest_Desktop
  kernel centos8/vmlinuz
  append initrd=centos8/initrd.img inst.repo=http://192.168.100.100/os8 inst.ks=http://192.168.100.100/ks/centos8_desktop_ks.cfg

label Centos8
  menu label ^Install CentOS-Stream-8-x86_64-latest_Minimal
  kernel centos8/vmlinuz
  append initrd=centos8/initrd.img inst.repo=http://192.168.100.100/os8 inst.ks=http://192.168.100.100/ks/centos8_minimal_ks.cfg

#本地磁盘引导
label local
  menu label Boot from ^local drive
  localboot 0xffff

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

 1、安装nginx

yum install -y nginx

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

修改Nginx服务配置文件,使其显示目录列表
 
找到http模块,修改如下
[root@centos-pxe ~]# vim /etc/nginx/nginx.conf
[root@centos-pxe ~]# grep -Ev '^$|#' /etc/nginx/nginx.conf
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
    worker_connections 1024;
}
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             /etc/nginx/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 /etc/nginx/conf.d/*.conf;
    server {
        listen       80;
        listen       [::]:80;
        server_name  _;
        root         /var/www/html;        #更改主目录
        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@centos-pxe ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

重启nginx服务并设为开机自启
[root@centos-pxe ~]# systemctl restart nginx.service
[root@centos-pxe ~]# systemctl enable nginx.service
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.

防火墙开放nginx服务
[root@centos-pxe ~]# firewall-cmd --permanent --zone=public --add-service=http
success
[root@centos-pxe ~]# systemctl restart firewalld
[root@centos-pxe ~]# 

 七、准备centos安装源