老男孩教育专注IT教育10余年,只培养IT技术精英

全国免费咨询电话(渠道合作):400-609-2893

【Linux运维培训】PXE预启动执行环境实践详解!

老男孩IT教育

技术博客

2022年8月10日 17:41

工作环境中,想要安装Linux但是计算机没有光驱,或者是有大批量的计算机需要同时安装Linux, 就需要通过部署环境 PXE + DHCP + TFTP + HTTP + kickstart 方式来实现了

  工作环境中,想要安装Linux但是计算机没有光驱,或者是有大批量的计算机需要同时安装Linux, 就需要通过部署环境 PXE + DHCP + TFTP + HTTP + kickstart 方式来实现了

  PXE协议详解

  PXE,预启动执行环境(Preboot eXecution Environment,PXE,也被称为预执行环境)提供了一种使用网络接口(Network Interface)启动计算机的机制

  这种机制让计算机的启动可以不依赖本地数据存储设备(如硬盘)或本地已安装的操作系统

  PXE(Pre-boot Execution Environment)是由Intel设计的协议,它可以使计算机通过网络启动

  协议分为client和server两端,支持工作站通过网络从远端服务器下载映像,并由此支持来自网络的操作系统的启动过程,其启动过程中,终端要求服务器分配IP地址,再用TFTP(trivial file transfer protocol)或MTFTP(multicast trivial file transfer protocol)协议下载一个启动软件包到本机内存中并执行,由这个启动软件包完成终端基本软件设置,从而引导预先安装在服务器中的终端操作系统

  PXE工作原理

  ①PXE client从自己的PXE网卡启动,向本网络中的DHCP服务器请求ip地址

  ②DHCP服务器收到dhcp请求后,分配dhcp地址池中ip给PXE client

  ③PXE client向本网络中的TFTP服务器索取bootstarp文件

  ④PXE client取得bootstarp文件后之执行pxelinux.0文件引导,使用pxelinux环境来引导os安装程序

  ⑤PXE client然后读取pxelinux.cfg文件夹中的default(isolinux.cfg)引导文件,通过TFTP服务器加载内核vmlinuz根文件系统(boot.msg,vesamenu.c32,initrd.img,splash.jpg),通过http服务器加载ks.cfg引导文件

  ⑥启动linux内核完成安装

  在上图中,PXE client是需要安装Linux的计算机,TFTP Server和DHCP Server运行部署在在PXE Server端

  Bootstrap文件、配置文件、Linux内核以及Linux根文件系统都放置在Linux Server上TFTP服务器的根目录下

  | PXE必要条件

  1、pxe client必须支持pxe用户端功能,并且开机时选择网络启动,这样系统才能以网络的方式进入pxe启动程序

  2、pxe服务器必须至少提供DHCP及TFTP的服务才行,且其中DHCP服务器必须能够除未pxe client分配ip地址外,还需告知tftp所在的位置(即pxelinux.0的文件位置)

  TFTP服务器则为pxe client 提供bootloader 及 kernel 等重要文件下载服务

  4、使用NFS/HTTP/FTP之一的服务器提供pxe client所需程序及软件来源等通讯协议

  | PXE工作流程图

  PXE安装DHCP

  动态主机设置协议(Dynamic Host Configuration Protocol,DHCP)是一种使网络管理员能够集中管理和自动分配IP网络地址的通信协议,使用UDP协议工作,DHCP使用统一端口作为BOOTP:

  服务器端使用67/udp,客户端使用68/udp。主要有两个用途:

  ①用于内部网络或网络服务供应商自动分配IP地址给用户

  ②用于内部网络管理员作为对所有电脑作中央管理的手段

  DHCP协议的工作流程:

  ①客户端在局域网广播DHCPDISCOVER报文,请求获得ip地址、网关、dns地址 等信息;

  ②DHCP服务器收到DHCPDISCOVER报文后 ,发送DHCPOFFER 报文进行响应;

  ③客户端收到DHCPOFFER报文后,发送DHCPREQUEST 报文进行请求;

  ④最终DHCP 服务器发送 DHCPACK报文进行确认

  | 安装配置DHCP

# 安装 DHCP 服务

yum install -y dhcp

# 调整配置文件

cat > /etc/dhcp/dhcpd.conf <<'EOF'

# dhcpd.conf

#

option domain-name "oldboy.com";      # 全局定义域名

option domain-name-servers 223.5.5.5; # 全局定义dns 地址

default-lease-time 600;  # 全局定义默认租约期限

max-lease-time 7200;     # 全局定义最长租约期限

log-facility local7;     # 文件属性

subnet 10.0.0.0 netmask 255.255.255.0 {  # 这里改为分配的网段和掩码

range 10.0.0.100 10.0.0.200;  # 改为分配的IP的范围

option routers 10.0.0.2;      # 如果有网关,这里改为网关地址

next-server 10.0.0.3;         # 添加 tftp服务器地址

 filename="pxelinux.0";        # 告诉TFTP目录下的bootstarp文件

}

EOF

  | 启动dhcp并验证dhcpd进程是否处于监听状态

# 启动dhcp

systemctl start dhcpd.service

systemctl enable dhcpd.service

# 验证dhcpd是否启动

ps aux | grep dhcpd

  PXE 安装 TFTP

  简单文件传输协议也称小型文件传输协议(Trivial File Transfer Protocol, TFTP),工作在UDP/69 端口,是一种于1981年在RFC 783中定义的简化的文件传输协议(FTP)

  瞬时(非独立)守护进程:他们无需定义在运行级别下,只需要一次性的定义xinetd的运行级别

  xinetd——为那些极少接受用户请求的服务,专门提供监听功能,如 监听tftpd进程

  独立(standlone)守护进程 :能自我管理,无须xinet 提供监听服务的进程

  | 安装TFTP

安装TFTP和xinetd

# yum install xinetd tftp-server -y

相关目录

/etc/xinetd.d/tftp    # 配置文件路径

/var/lib/tftpboot    # 默认tftp存储目录

修改配置文件

# vi /etc/xinetd.d/tftp  

· · ·

service tftp

{

      socket_type             = dgram

      protocol                = udp

      wait                    = yes

      user                    = root

      server                  = /usr/sbin/in.tftpd

      server_args             = -s /var/lib/tftpboot # 默认tftp存储目录

      disable                 = no    # no 表明tftp处于启用状态 ,yes 表示tftp处于禁用状态

      per_source              = 11

      cps                     = 100 2

      flags                   = IPv4

}

启动服务

# systemctl start xinetd.service

# systemctl enable xinetd.service

# ss -tunl | grep 69

udp   UNCONN     0      0         *:69                   *:*         

  | 使用 syslinux 提供的bootstart

# 安装syslinux

yum install syslinux -y

# 相关目录文件

/usr/share/syslinux   # pxelinux.0 文件存储目录

# 复制pxelinux.0到 /var/lib/tftpboot 目录

cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/  

# 挂载镜像光盘

mkdir /oldboyedu/iso/centos -p

mount /dev/cdrom /oldboyedu/iso/centos/

  | 配置pxelinux.cfg 文件

# 创建pxelinux.cfg 文件夹

mkdir /var/lib/tftpboot/pxelinux.cfg

# 把isolinux.cfg引导文件拷贝到tftpd存储目录下的pxelinux.cfg文件中,并命名为default

cp /oldboyedu/iso/centos/isolinux/isolinux.cfg /var/lib/tftpboot/pxelinux.cfg/default

# 修改linux内核引导文件

# 于/var/lib/tftpboot/pxelinux.cfg/default的第61行加入

label linux

kernel vmlinuz

menu label ### PXE Install CentOS 7 ###

append initrd=initrd.img inst.repo=http://10.0.0.3/centos/os/

inst.ks=http://10.0.0.3/ks.cfg

  | 把内核及根文件拷贝到tftpd存储目录

cp /oldboyedu/iso/centos/images/pxeboot/{initrd.img,vmlinuz} /var/lib/tftpboot/  

cp /oldboyedu/iso/centos/isolinux/{boot.msg,vesamenu.c32,splash.png} /var/lib/tftpboot/

  PXE环境HTTPD部署

  创建kickstart文件方式:

  ①复制模板 /root/anaconda-ks.cfg ,而后使用vim编辑配置

  ②使用system-config-kickstart 来生成,建议也使用/root/anaconda-ks.cfg 作为模板来进行

  ksvalidator 查看ks文件语法是否正确

  kickstat文件的组成部分:

  1、命令段:用于配置系统 ,如:install ,firewall, part,lv 等

  2、软件包段%packages;指定要安装的程序包组(@组包名)及程序包(程序包名),每行一个 ;在程序包之前加 “-”号,表示不希望安装

  3、%pre %post脚本段:安装过程开始之前、后执行的安装预备式脚本

  | 关闭防火墙

# 永久关闭firewalld防火墙

systemctl stop firewalld

systemctl disable firewalld

# 永久关闭SELinux防火墙

setenforce 0

sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/sysconfig/selinux

  | httpd安装

# 安装httpd

yum install httpd -y

# 启动httpd

systemctl start httpd.service

systemctl enable httpd.service

# 拷贝模板到/var/www/html 目录,并重命名为ks.cfg

cp /root/anaconda-ks.cfg /var/www/html/ks.cfg

# 分配权限,为pxe client引导安装使用

chmod o+r /var/www/html/ks.cfg

# 拷贝安装系统

mkdir /var/www/html/centos/os -p

cp -rp /oldboyedu/iso/centos/* /var/www/html/centos/os/

# root密码加密,“1”为密码

perl -e 'print crypt("1",q($6$gWOj2dVM8nQl2OTG)),"\n"'

  以/root/anaconda.cfg 为模板,配置ks.cfg文件 ,配置repo url 和 ks.cfg

  ks引用格式如下:

  | 调整配置文件

cat >/var/www/html/ks.cfg<<'EOF'

#platform=x86, AMD64, or Intel EM64T

#version=DEVEL

# Install OS instead of upgrade

install

# Keyboard layouts

keyboard --vckeymap=us --xlayouts='us'

# Root password

rootpw --iscrypted $6$gWOj2dVM8nQl2OTG$5ZOKI81g1N82ygU95hT5fMZFBKRKCWXksYi/jkfCWfNXtI2mioQs/nDNBgWbha8dml2BiDjARyUtXITZXe6pr1

# Use network installation

url --url="http://10.0.0.3/centos/os" //指定网络安装的服务地址及目录

# System language

lang en_US.UTF-8 --addsupport=zh_CN.UTF-8 //语言

# Firewall configuration

firewall --disabled

# System authorization information

auth --useshadow --passalgo=sha512

# Use graphical install

graphical

firstboot --disable

# SELinux configuration

selinux --disabled

# Network information

network --bootproto=dhcp --device=ens33 --onboot=yes --noipv6 --activate //启动并激活网卡的名称

# Reboot after installation

reboot

# System timezone

timezone Asia/Shanghai --isUtc --nontp //设置时区

# System bootloader configuration

bootloader --location=mbr --boot-drive=sda

# Clear the Master Boot Record

zerombr //清除mbr信息

# Partition clearing information

clearpart --all --initlabel

# Disk partitioning information //磁盘为20G的硬盘,这里根据自己来进行修改

part /boot --fstype="xfs" --size=1024

part / --fstype="xfs" --size=17408

part swap --fstype="swap" --size=1024

%packages

@base

@compat-libraries

@desktop-debugging

@development

@dial-up

@fonts

@gnome-apps

@gnome-desktop

@legacy-x

@platform-devel

@remote-desktop-clients

@x11

vinagre

%end

EOF

# 安装ksvalidator 软件

yum -y install pykickstart

# ksvalidator验证ks.cfg语法是否正确,如有报错去掉中文注释即可

ksvalidator /var/www/html/ks.cfg

  | ks.cfg及repo验证

  注:ks.cfg若不能正常打开,确认是否有读权限

  注:若不能显示以上连接方式,确认httpd配置文件中,是否开启相关选项

  至此,PXE服务器环境部署完成,出现问题时,一般需要查看系统日志,如:/var/log/messages, 通过日志报错信息进行解决

  centos PXE环境测试,安装,启动

  配置PXE client 客户端,网络需与PXE服务器处于同一网段 10.0.0.0/24

  客户机操作系统为 Linux系统的 CentOS 7 64位版本

  开启虚拟机,选择第一个选项

  确认为自动分区后点击开始安装

  设置 root 密码

  系统重启

  安装完成

  总结:在本文中,我们通过一些示例学习了如何去部署PXE和对PXE的基础使用,希望能够给你们带来帮助。

本文经授权发布,不代表老男孩教育立场。如若转载请联系原作者。