标签(空格分隔): 未分类
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 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
最后测试