PXE

标签(空格分隔): 未分类


PXE是什么

预启动执行环境(preboot execution environment)由intel设计的协议通过PXE可以使得计算机能够通过网络启动,PXE分为客户端和服务端,PXE的客户端安装在网卡的ROM中,当计算机寻找引导设备的过程中,网卡的ROM被载入到内存中运行,此时,如果PXE的服务器环境配置正确的时候(有DHCP给予IP,然后还给予了Bootload文件路径),它会把bootloader下载下来,然后启动bootloader,接下来的流程和光盘就差不多了。

PXE的Client的IP地址由DHCP获得,那么得到Bootload文件路径后,它怎样下载呢?在网卡的ROM中,已经有了一个专门的传输程序TFTP Client,通过TFTP协议到TFTP Server上下载所需的文件。

工作过程图(来源网上)

PXE_第1张图片
200711031194023885260.gif-14.8kB

PXE client是需要安装Linux的计算机,TFTP Server和DHCP Server运行在另外一台Linux Server上。Bootstrap文件、配置文件、Linux内核以及Linux根文件系统都放置在Linux Server上TFTP服务器的根目录下。
PXE client在工作过程中,需要三个二进制文件:bootstrap、Linux 内核和Linux根文件系统。Bootstrap文件是可执行程序,它向用户提供简单的控制界面,并根据用户的选择,下载合适的Linux内核以及Linux根文件系统。

总体流程:
(1).Client向PXE Server上的DHCP发送IP地址请求消息,DHCP检测Client是否合法(主要是检测Client的网卡MAC地址),如果合法则返回Client的IP地址,同时将pxe环境下的Boot loader文件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请求pxelinux.cfg文件(其实它是目录,里面放置的是是启动菜单,即grub的配置文件),TFTP将配置文件发回Client,继而Client根据配置文件执行后续操作。
(5).Client向TFTP发送Linux内核请求信息,TFTP接收到消息之后将内核文件发送给Client。
(6).Client向TFTP发送根文件请求信息,TFTP接收到消息之后返回Linux根文件系统。
(7).Client加载Linux内核(启动参数已经在4中的配置文件中设置好了)。
(8).Client通过nfs/ftp/http下载系统安装文件进行安装。如果在4中的配置文件指定了kickstart路径,则会根据此文件自动应答安装系统。

Centos7 使用PXE自动安装过程

配置DHCP服务器

dhcp服务器主要是用来提供网卡的IP地址和“boot loader”文件名和tftp的服务器地址
安装dhcp服务

[root@varnish ~]# yum install dhcp

编辑配置文件
[root@varnish dhcp]# vim dhcpd.conf

# option definitions common to all supported networks...
option domain-name "li-zw.com";
option domain-name-servers 114.114.114.114;
default-lease-time 600;
max-lease-time 7200;
log-facility local7;
"dhcpd.conf" 32L, 913C                                        
subnet 192.168.10.0  netmask 255.255.255.0 {    #dhcp作用域
        range 192.168.10.110 192.168.10.120;    #地址池范围
        option subnet-mask 255.255.255.0;       #掩码
        next-server 192.168.10.10;              #tftp服务器地址 
        filename "pxelinux.0";                  #bootloader文件名
}

启动服务

[root@varnish dhcp]# systemctl start dhcpd

配置tftp服务器

tftp服务器主要提供boot loader和boot loader,内核文件与内核文件的根文件系统

安装服务

[root@varnish dhcp]# yum install tftp-server

安装好之后,需要对tftpd做些配置,
tftp是由xinetd这个super daemon所管理的,因此设定好TFTP之后,要启动的是xinetd。
安装好tftp-server之后,在xinetd.d目录下多出tftp的配置文件
编辑配置

[root@varnish dhcp]# vim /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,启动xinted就会启动tftp了
        per_source              = 11
        cps                     = 100 2
        flags                   = IPv4
}

bootloader文件和辅助工具与内核和它的根文件系统

bootloader文件由syslinux这个包提供,安装它

[root@varnish dhcp]# yum install -y syslinux

把这个提供的一些文件复制到tftpd根目录中

[root@varnish dhcp]# cp  /usr/share/syslinux/{menu.c32,vesamenu.c32,pxelinux.0} /var/lib/tftpboot/

vesamenu.c32     #也是图形界面的菜单
pxelinux.0      #引导文件
/usr/share/syslinux/menu.c32        #屏幕上呈现菜单

以上都相当于bootloader文件和一些提供菜单功能的工具
bootloader的配置文件还需要指定
bootloader程序会去找pxelinux.cfg这个目录下的配置文件,可以放置默认的开机选项,也可以针对不同的客户端主机提供不同的开机选项。一般来说,可以在pxelinux.cfg目录内建立一个名为default的文件来提供默认选项。当要针对不同的客户端提供不同的开机选项时,则是是以16进制来命令配置文件格式的方法来提供,例如客户端192.168.30.148则它的配置文件为COA81E94。

复制内核和根文件系统
挂载linuxCD光盘

[root@varnish ~]# mount /dev/cdrom /media

复制专门为PXE准备的内核个根文件系统

[root@varnish media]# cp images/pxeboot/{vmlinuz,initrd.img} /var/lib/tftpboot/
[root@varnish media]# cd /var/lib/tftpboot/
[root@varnish pxelinux.cfg]# cp /media/isolinux/isolinux.cfg ./default   把isolinux.cfg复制成pxe的配置文件

编辑pxelinux.0的配置文件

default vesamenu.c32   # 这是必须项,或者使用menu.c32
timeout 600            # 超时等待时间,60秒内不操作将自动选择默认的菜单来加载

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
menu background splash.png   # 背景图片
menu title CentOS 7          # 大标题
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 linux
  menu label ^Install CentOS 7   # 菜单文字
  kernel vmlinuz        # 内核文件路径,注意相对路径是从tftp的根路径/tftpboot开始的,所以要改为"./CentOS7.2/vmlinuz"
  append initrd=initrd.img inst.stage2=hd:LABEL=CentOS\x207\x20x86_64 quiet  
                        # 内核启动选项,其中包括initrd的路径,同样要改为"./CentOS7.2/initrd.img"
                        # stage2文件的搜索路径,搜索的文件一般是".treeinfo",找不到该文件则找LiveOS/squashfs.img
                        # 一般pxe环境下此路径直接指向系统安装文件的路径,具体做法见下文示例

label check
  menu label Test this ^media & install CentOS 7
  menu default          # menu default表示开机时光标一开始默认停留在此label上
  kernel vmlinuz
  append initrd=initrd.img inst.stage2=hd:LABEL=CentOS\x207\x20x86_64 rd.live.check quiet

menu separator # insert an empty line

# utilities submenu          # 子菜单项的设置方法
menu begin ^Troubleshooting
  menu title Troubleshooting

label linux
  menu label ^Install CentOS 7
  kernel vmlinuz
  append initrd=initrd.img inst.stage2=http://192.168.10.10/centos7.5 quiet


提供kickstart与光盘仓库实现自动安装

安装httpd

[root@varnish ~]# yum install -y httpd

把kickstart文件放到网站根目录

[root@varnish ~]# cp anaconda-ks.cfg /var/www/html/
[root@varnish html]# vim anaconda-ks.cfg 

#version=DEVEL
# System authorization information
auth --enableshadow --passalgo=sha512
# Use CDROM installation media
cdrom
# Use graphical install
graphical
# Run the Setup Agent on first boot
firstboot --enable
ignoredisk --only-use=sda
# Keyboard layouts
keyboard --vckeymap=cn --xlayouts='cn'
# System language
lang zh_CN.UTF-8 --addsupport=en_GB.UTF-8,en_US.UTF-8

# Network information
network  --bootproto=dhcp --device=ens33 --onboot=off --ipv6=auto --no-activate
network  --hostname=node1

# Root password
# System services
services --enabled="chronyd"
# System timezone
timezone Asia/Shanghai --isUtc
# System bootloader configuration
bootloader --append=" crashkernel=auto" --location=mbr --boot-drive=sda
#version=DEVEL
# System authorization information
auth --enableshadow --passalgo=sha512
# Use CDROM installation media
#cdrom
# Use graphical install
graphical

#User network install 
url --url="http://192.168.10.10/centos7.5"
# Run the Setup Agent on first boot
firstboot --enable
ignoredisk --only-use=sda
# Keyboard layouts
keyboard --vckeymap=cn --xlayouts='cn'
# System language
lang zh_CN.UTF-8 --addsupport=en_GB.UTF-8,en_US.UTF-8

# Network information
network  --bootproto=dhcp --device=ens33 --onboot=yes --ipv6=auto --no-activate
network  --hostname=test1

# Root password
# System services
services --enabled="chronyd"
# System timezone
timezone Asia/Shanghai --isUtc
# System bootloader configuration
bootloader --append=" crashkernel=auto" --location=mbr --boot-drive=sda
autopart --type=lvm
# Partition clearing information
clearpart --none --initlabel

selinux --disabled

%packages
@^minimal
@core
@debugging
@development
@system-admin-tools
chrony
kexec-tools

%end

%addon com_redhat_kdump --enable --reserve-mb='auto'

%end

%anaconda
pwpolicy root --minlen=6 --minquality=1 --notstrict --nochanges --notempty
pwpolicy user --minlen=6 --minquality=1 --notstrict --nochanges --emptyok
pwpolicy luks --minlen=6 --minquality=1 --notstrict --nochanges --notempty
%end

其中SHA-512位的加密密码在CentOS 6上可以使用"grub-crypt --sha-512"生成,CentOS7上可以使用python等工具来生成,如下:
python -c 'import crypt,getpass;pw=getpass.getpass();print(crypt.crypt(pw) if (pw==getpass.getpass("Confirm: ")) else exit())'

挂载光驱到httpd的Centos7.5目录上

[root@varnish centos7.5]# mount --bind /media/ /var/www/html/centos7.5

在PXE的配置文件中加入kickstart的文件路径

[root@varnish html]# mv anaconda-ks.cfg ana.ks

提供PXE配置文件

[root@varnish html]# vim /var/lib/tftpboot/pxelinux.cfg/default 
添加以下内容
default vesamenu.c32
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
menu background splash.png
menu title CentOS 7
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 linux
  menu label ^Install CentOS 7
  menu default
  kernel vmlinuz
  append initrd=initrd.img inst.stage2=http://192.168.10.10/Centos7.5 ks=http://192.168.10.10/an.cfg quiet

这里需要提醒,我的测试系统的Centos7.5,必须提供2G以上的内存,如果内存不够,会出现“/sbin/dmsquash-live-root: write error:no space left on device”报错。无论如何都不会出现anaconda的安装节目的,谨记
这个错误会导致后期的操作不能正常运行,所以后续还有好多报错,例如“/dev/root does not exist”之类的报错

启动httpd服务器

[root@varnish html]# systemctl restart httpd 

最后测试

你可能感兴趣的:(PXE)