天天看点

PXE详解

一、地址服务器dchp

二、PXE介绍

三、配置过程(CentOS7)

四、CentOS6配置PXE

1.dhcp工作原理:

a)当DHCP客户机第一次登陆网络时,如客户机上无任何IP信息设定,它会向网络 发出DHCP DISCVER数据包,为保证服务器能够收到请求,数据包源地址为0.0.0.0,目的地址是255.255.255.255 即以广播形式发送DHCP DISCOVER信息。

b)当DHCP服务器监听到客户端发出的DHCP DISCOVER广播后,它会从那些还没有透出的地址范围中选择可用IP及其它TCP/IP设定以DHCP OFFER数据包形式发送给客户机。

c)如客户端收到网络上多台DHCP服务器的响应,客户端会挑选最快一个DHCP OFFER并向网络发送一个DHCP REQUEST广播封包,告诉所有DHCP服务器它将使用哪一台服务器提供的IP地址。同时,客户端还会向网络发送ARP广播数据包,查询网络上有没有其它机器使用该IP地址,如何发现此IP已经被占用,客户端则会发送一个DHCP DECLINE数据包给DHCP服务器,拒绝接受其DHCP OFFER,并重新发送DHCP REQUEST信息。

客户端可以保留自己的一些TCP/IP设定,如网关,DHS地址等。

d)将地址分配给客户端后,DHCP 服务器会发送一个DHCP ACK消息,以确认IP租约正式生效,结束完整的DHCP工作过程。

e)DHCP客户端成功地从服务器取得IP地址后,一般不需要再发送DHCP DISCOVER信息,除非租约已经到期或者IP地址重新设定回0.0.0.0 此时客户端会直接使用已经租用到的IP地址向为其发放此IP地址的DHCP服务器发出DHCP REQUEST信息,DHCP服务器会尽量让客户端使用原来的IP地址,如无特殊情况,会直接响应DHCP ACK,允许客户端继续使用此IP地址,如果此地址已经失效或已经被其它主机使用,服务器会一个DHCP NACK数据包给客户端,要求其重新执行DHCP DISCOVER.

客户端执行DHCP DISCOVER后,台无DHCP服务器响应客户端请求,客户端会随机使用169.254.0.0/16网段中的一个IP地址配置本机地址。

dhcp工作原理简述:

    1.OS开机后,没有ip地址,只有mac,发送rarp广播,谁能给我一个ip

        arp:ip---->mac

        rarp:mac-->ip

    2.dhcp收到请求后,查看自己的地址池是否有可用地址,有的话,就直接给他

        假如有多个dhcp同时给我返回ip地址,谁反应快,我用谁的ip

dhcp工作流程:(基于广播方式进行)

    1.client: dhcp discover

    2.server:dhcp offer(IP/mask,gw,...) //server可能有多个

        lease time:租约

        续租:50%,75%,87%, //续租是单播的(client:dhcp request,server:dchp ack/noak),续租的时间,在一半的时候,没有回复,75%,一半的一半    

                        //假如dhcp回复dhcp nak(noack) ,client将再次发送dhcp discovery                

    3.client:dhcp request //请求使用该地址     

    4.Server:dhcp ack

dhcp是基于广播的,gw会阻断广播

    假如需要跨网络:可使用dhcp_porxy,或者多提供一台dhcp

    dhcp还可以告诉client网络中一个fs server的地址

一个主机接入到TCP/IP网络,要为配置哪些网络参数:

    IP/mask

    Gate

    DNS server

    NTP server

参数配置方式:

    静态指定

    动态分配

        bootp //boot protocol引导协议-->DHCP

            (无盘工作站)://网卡能够到s端自动请求,加载自己所属的OS文件,

            bootp:无盘工作站基于此获取ip地址,这个ip第一次获取是动态的,以后就是固定的

                //早期硬盘比较贵的时候,使用无盘工作站,现在用的不多

        dhcp:引入了“租约”概念的bootp;也可以实现为特定主机保留某固定地址;

CentOS

    dhcp(ISC,named):只提供dhcp

        dhcpd:dchp服务

        dhcrelay:中继服务 //这两个一般不会同时启用

    dnsmap:dhcp+dns //轻量级,常用语嵌入式

/var/lib/dhcpd/dhcpd.leases 租约数据库文件

/etc/dhcp/dhcpd.conf 主配置文件

2.配置文件详解

/etc/dhcp/dhcpd.conf 

============================

<code>host passacaglia {</code>

<code>  </code><code>hardware ethernet 0:0:c0:5d:bd:95;</code>

<code>  </code><code>fixed-address 207.175.42.254;   定义DHCP客户端指定的IP地址。非subnet内的地址</code>

<code>  </code><code>next-server:指明引导所在的服务主机的ip地址 </code><code>//</code><code>通常是一个tftp server{trival}简单文件传输协议</code>

<code>  </code><code>filename </code><code>"vmunix.passacaglia"</code><code>;   </code><code>//</code><code>初始化boot引导文件</code>

<code>  </code><code>server-name </code><code>"toccata.fugue.com"</code><code>;</code>

<code>}</code>

<code>subnet 10.5.5.0 netmask 255.255.255.224 {</code>

<code>  </code><code>range 10.5.5.26 10.5.5.30;</code>

<code>  </code><code>option domain-name-servers ns1.internal.example.org;    域名服务器</code>

<code>  </code><code>option domain-name </code><code>"internal.example.org"</code><code>;    负责的域</code>

<code>  </code><code>option domain-name-servers 192.168.2.1,192.168.2.5; 指定DNS服务器地址</code>

<code>  </code> 

<code>  </code><code>option </code><code>time</code><code>-offset -18000; Eastern Standard Time</code>

<code>  </code><code>option ntp-servers 192.168.1.1; 时间服务器</code>

<code>  </code><code>option netbios-name-servers     192.168.1.1;</code>

<code>  </code><code>option netbios-node-</code><code>type</code> <code>2;</code>

<code>  </code><code>option routers 10.5.5.1;                        默认网关</code>

<code>  </code><code>option subnet-mask 255.255.255.0;     子网掩码</code>

<code>  </code><code>option broadcast-address 10.5.5.31;    广播地址</code>

<code>  </code><code>default-lease-</code><code>time</code> <code>600;</code>

<code>  </code><code>max-lease-</code><code>time</code> <code>7200;    </code>

注:option 放在subnet内和subnet外,是有全局和局部之分

    冲突:subnet内的生效,匹配范围小的生效

监听端口

    Server:67/udp

    Client:68/udp

dhclient -d //工作在前台,可以看到获取ip过程

    //建议使用虚拟专用网,但是关闭vmware--首选项中的dhcp服务,可能会影响

1.PXE简介

PXE:preboot excution environment //

client------------&gt;dhcp  //获取ip地址

    |_____________&gt;tftp  //udp协议

    |_____________&gt;yum 仓库 

大体流程:DHCP(获取IP,寻找TFTP)&gt;TFTP(交换获取开机启动文件 /tftpboot即此文件夹)&gt;HTTP(加载安装文件)&gt;本地安装

Dhcpd: 分发IP地址。

Tftpd: 分发启动文件安装。

Httpd:分发系统文件安装。

加载安装文件不一定用http方式。

参考图一:

client网卡芯片必须支持网络引导--调整为网络引导

clinet开机后,发送rarp广播,获得一个ip地址,同时获得要加载的文件(引导)名称,文件server地址

基于此文件--加载内核文件{tftp获取}

CentOS:

    dchp {ip/mask,gw,dns,filename,next-server}

    tftp server(bootloader,kernel,initrd)

    yum repository(ftp,http,nfs)

2.ks简介

KickStart的工作原理是通过记录典型的安装过程中所需人工干预填写的各种参数,并生成一个名为ks.cfg的文件;

安装过程中(不只局限于生成KickStart安装文件的机器)当出现要求填写参数的情况时,安装程序会首先去查找KickStart生成的文件,当找到合适的参数时,就采用找到的参数,当没有找到合适的参数时,才需要安装者手工干预。等安装完毕,安装程序会根据ks.cfg中设置的重启选项来重启系统,并结束安装。

    kickstart //自动化安装,如果只提供网络引导,手动安装,可以不使用kickstart文件

三、配置过程    

关闭selinux和iptables //防止干扰

1.准备tftp        

yum install tftp tftp-server

chkconfig tftp on 

service tftp restart     

[root@localhost ~]# rpm -ql tftp-server //centos7

/etc/xinetd.d/tftp

/usr/lib/systemd/system/tftp.service  独立

/usr/lib/systemd/system/tftp.socket       瞬时守护进程

[root@pxe ~]# rpm -ql tftp-server  //Centos 6

/usr/sbin/in.tftpd

========================================

<code>service tftp  </code><code>//</code><code>不用修改配置文件</code>

<code>{</code>

<code>    </code><code>socket_type        = dgram</code>

<code>    </code><code>protocol        = udp</code>

<code>    </code><code>wait            = </code><code>yes</code>

<code>    </code><code>user            = root</code>

<code>    </code><code>server            = </code><code>/usr/sbin/in</code><code>.tftpd</code>

<code>    </code><code>server_args        = -s </code><code>/var/lib/tftpboot</code>

<code>   </code><code>#将此值改为no,表明开启此服务</code>

<code>    </code><code>disable            = no</code>

<code>    </code><code>per_source        = 11</code>

<code>    </code><code>cps            = 100 2</code>

<code>    </code><code>flags            = IPv4</code>

监听端口:udp/69

文件路径:/var/lib/tftpboot

    vim /etc/xinetd.d/tftp //可以修改响应参数

CentOS6:

    chkconfig tftp on

    service xinetd on

CentOS7:

    systemctl start tftp.socket

    systemctl enable tftp.socket

tftp IP_ADDRESS //即可访问

2.准备dhcp

vim /etc/dhcp/dhcpd.conf 

<code>ddns-update-style interim;</code>

<code>ignore client-updates;</code>

<code>subnet 192.168.10.0 netmask 255.255.255.0 {</code>

<code>    </code><code>option routers 192.168.10.1;</code>

<code>    </code><code>option subnet-mask 255.255.255.0;</code>

<code>    </code><code>range 192.168.10.100 192.168.10.200;</code>

<code>    </code><code>next-server 192.168.10.85;</code>

<code>    </code><code>filename </code><code>"pxelinux.0"</code><code>;</code>

<code>    </code><code>allow booting;</code>

<code>    </code><code>allow bootp;</code>

systemctl restart dhcpd.service //重启服务

3.准备yum仓库

mkdir /var/www/html/centos/7/x86_64 -pv

mount -r /dev/cdrom /var/www/html/centos/7/x86_64

systemctl start httpd

测试:http://192.168.4.100/centos/7/  //用浏览器看能否访问

4.kiskstart文件

mkdir /var/www/html/kickstarts/

vim centos7.cfg //安装完os后,root目录会有一个anaconda-ks.cfg

    url --url="http://192.168.23.11/centos/7/x86_64/"

图形配置界面: #system-config-kickstart

5.配置pxe

yum -y install syslinux 

rpm -ql syslinux 

    /usr/share/syslinux/pxelinux.0 

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

cp /var/www/html/centos/7/x86_64/images/pxeboot/{initrd.img,vmlinuz} /var/lib/tftpboot/

cp /usr/share/syslinux/{chain.c32,menu.c32,memdisk,mboot.c32} /var/lib/tftpboot

    chain.c32: vesamenu.c32,menu.c32:字符界面的

    initrd文件:memdisk

此时tftpboot目录共有://Centos7

    chain.c32,menu.c32,memdisk,mboot.c32,pxelinux.0,initrd.img,vmlinuz

Centos6对应的文件:

    pxelinux.0,initrd.img,vmlinuz,boot.cfg,vesamenu.c32,spalsh.png

    cp /mnt/cdrom/isolinux/isolinux.cfg /var/lib/tftpboot/pxelinux.cfg/default 

6.创建选项菜单

cd /var/lib/tftpboot

mkdir pxelinux.cfg

vim pxelinux.cfg/default //提供选择界面

<code>    </code><code>default menu.c32</code>

<code>        </code><code>prompt 5</code>

<code>        </code><code>timeout 30</code>

<code>        </code><code>MENU TITLE CentOS 7 PXE Menu</code>

<code>        </code> 

<code>        </code><code>LABEL linux</code>

<code>        </code><code>MENU LABEL Install CentOS 7 x86_64</code>

<code>        </code><code>KERNEL vmlinuz</code>

<code>        </code><code>APPEND initrd=initrd.img</code>

    注:此时开机,但是不能加载repo

测试1:menu tab //编辑启动项

    vmlinuz initrd=initrd.img ip=192.168.23.11 netmask=255.255.255.0 inst.repo=http://192.168.23.11/centos/7/x86_64

        inst.repo(centos7才有inst.repo,centos6 在ks中指定即可)是在网络上的,开始的ip实在网卡的,现在使用的ip是内核的,内核已经取得控制权了

        开机的时候获得的地址是网卡的地址,现在是内核控制,内核没有地址(linux的地址是内核的地址)    

    建议直接把:ip,inst.repo等参数,直接添加到default参数后面

注:仍然需要手动进行选择安装项 //ks还没有配置

7.自动执行安装        

cd /var/lib/tftpboot/pexlinux.cfg;vim default

==========================================

<code>default menu.c32</code>

<code>    </code><code>prompt 5</code>

<code>    </code><code>timeout 30</code>

<code>    </code><code>MENU TITLE CentOS 7 PXE Menu</code>

<code>    </code> 

<code>    </code><code>LABEL linux</code>

<code>    </code><code>MENU LABEL Install CentOS 7 x86_64</code>

<code>    </code><code>KERNEL vmlinuz</code>

<code>    </code><code>APPEDN initrd=initrd.img inst.repo=http:</code><code>//192</code><code>.168.23.11</code><code>/centos/7/x86_64</code> 

<code>    </code><code>LABEL linux auto</code>

<code>    </code><code>APPEDN initrd=initrd.img inst.repo=http:</code><code>//192</code><code>.168.23.11</code><code>/centos/7/x86_64</code> <code>ks=http:</code><code>//192</code><code>.168.23.11</code><code>/kickstarts/centos7</code><code>.cfg</code>

    //ip不指定,可以自动获取,假如有dhcp。ip=dhcp 即可,默认会自动获取

yum install dhcp tftp-server tftp syslinux vsftpd -y

vmware虚拟网络编辑器--&gt;vmnet1(仅主机模式):DHCP网段在192.168.3.0 

    仅主机模式手动设定的地址要在vmnet1分配的地址范围内 //vmware(vmnet1)自带的dhcp服务关闭

vim /etc/ssh/sshd_config 

    UseDNS=no //取消开启dns

pxe:192.168.3.111 //仅主机模式

1.配置dhcp

service dhcpd configtest //测试语法

<code>[root@localhost ~]</code><code># cat /etc/dhcp/dhcpd.conf  |egrep -v "^#|^$"</code>

<code>option domain-name </code><code>"mt.com"</code><code>;</code>

<code>option domain-name-servers 192.168.3.111;</code>

<code>default-lease-</code><code>time</code> <code>600;</code>

<code>max-lease-</code><code>time</code> <code>7200;</code>

<code>log-facility local7;</code>

<code>subnet 192.168.3.0 netmask 255.255.255.0 {</code>

<code>    </code><code>range 192.168.3.10 192.168.3.20;</code>

<code>    </code><code>next-server 192.168.3.111;</code>

[root@localhost ~]#service dhcpd restart ;ss -tunlp |grep 67 

chkconfig dhcpd on 

2.tftp 

<code>[root@localhost ~]</code><code># cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/</code>

<code>[root@localhost ~]</code><code># mkdir /media/cdrom ; mount -r /dev/cdrom /media/cdrom</code>

<code>[root@localhost ~]</code><code># cp /media/cdrom/images/pxeboot/{vmlinuz,initrd.img} /var/lib/tftpboot/  </code>

<code>    </code><code>//centos6</code> <code>不需要复制syslinux中的文件,</code>

<code>[root@localhost ~]</code><code># cp /media/cdrom/isolinux/{boot.msg,vesamenu.c32,splash.jpg} /var/lib/tftpboot/</code>

<code>[root@localhost tftpboot]</code><code># cd /var/lib/tftpboot/ ; mkdir pxelinux.cfg ;cd pxelinux.cfg</code>

<code>[root@localhost pxelinux.cfg]</code><code># cp /media/cdrom/isolinux/isolinux.cfg /var/lib/tftpboot/pxelinux.cfg/default</code>

<code>chmod</code> <code>a+wx default </code><code>//</code><code>默认ro</code>

3.pxe

[root@localhost pxelinux.cfg]# cat default

<code>default vesamenu.c32</code>

<code>#prompt 1</code>

<code>timeout 6</code>

<code>display boot.msg</code>

<code>menu background splash.jpg</code>

<code>menu title Welcome to CentOS 6.8!</code>

<code>menu color border 0 </code><code>#ffffffff #00000000</code>

<code>menu color sel 7 </code><code>#ffffffff #ff000000</code>

<code>menu color title 0 </code><code>#ffffffff #00000000</code>

<code>menu color tabmsg 0 </code><code>#ffffffff #00000000</code>

<code>menu color unsel 0 </code><code>#ffffffff #00000000</code>

<code>menu color hotsel 0 </code><code>#ff000000 #ffffffff</code>

<code>menu color hotkey 7 </code><code>#ffffffff #ff000000</code>

<code>menu color scrollbar 0 </code><code>#ffffffff #00000000</code>

<code>label auto_install  </code><code>//</code><code>手动添加的</code>

<code>  </code><code>menu label ^Auto Install pxe linux  </code><code>//</code><code>^在界面上A会自动跳转</code>

<code>  </code><code>menu default</code>

<code>  </code><code>kernel vmlinuz</code>

<code>  </code><code>append initrd=initrd.img ks=</code><code>ftp</code><code>:</code><code>//192</code><code>.168.3.111</code><code>/pub/centos6</code><code>.cfg </code>

<code>label linux</code>

<code>  </code><code>menu label ^Install or upgrade an existing system</code>

<code>  </code><code>append initrd=initrd.img</code>

<code>label vesa</code>

<code>  </code><code>menu label Install system with ^basic video driver</code>

<code>  </code><code>append initrd=initrd.img nomodeset</code>

<code>label rescue</code>

<code>  </code><code>menu label ^Rescue installed system</code>

<code>  </code><code>append initrd=initrd.img rescue</code>

<code>label </code><code>local</code>

<code>  </code><code>menu label Boot from ^</code><code>local</code> <code>drive</code>

<code>  </code><code>localboot 0xffff</code>

<code>label memtest86</code>

<code>  </code><code>menu label ^Memory </code><code>test</code>

<code>  </code><code>kernel memtest</code>

<code>  </code><code>append -</code>

4.yum

[root@localhost pxelinux.cfg]# mkdir /var/ftp/pub/centos

[root@localhost pxelinux.cfg]# mount --bind /media/cdrom/ /var/ftp/pub/centos

service vfstpd start 

chkconfig vsftpd on 

ftp 192.168.3.111 //anonymous 查看

5.ks准备

[root@localhost ~]# cp centos6.cfg /var/ftp/pub/

[root@localhost pxelinux.cfg]# system-config-kickstart /root/anaconda-ks.cfg 配置ks文件

==========================================================================================

注意ks 位于centos(cdrom内容)同级目录

ks文件内容

====================================================================================

<code>#platform=x86, AMD64, 鎴?Intel EM64T</code>

<code>#version=DEVEL</code>

<code># Firewall configuration</code>

<code>firewall --enabled --service=</code><code>ssh</code>

<code># Install OS instead of upgrade</code>

<code>install</code>

<code># Use network installation</code>

<code>url --url=</code><code>"http://192.168.3.110/centos"</code>

<code>#repo --name="CentOS" --baseurl=cdrom:sr0 --cost=100  //注意,这个repo要注释掉,否则会链接repo失败,根据url获取repo即可</code>

<code># Root password</code>

<code>rootpw --iscrypted $1$1fqZyR0n$OKTh75.k4WYgDspZtePTV0</code>

<code># System authorization information</code>

<code>auth  --useshadow  --passalgo=sha512</code>

<code># Use graphical install</code>

<code>graphical</code>

<code># System keyboard</code>

<code>keyboard us</code>

<code># System language</code>

<code>lang zh_CN</code>

<code># SELinux configuration</code>

<code>selinux --disabled</code>

<code># Do not configure the X Window System</code>

<code>skipx</code>

<code># Installation logging level</code>

<code>logging --level=info</code>

<code># System timezone</code>

<code>timezone  Asia</code><code>/Shanghai</code>

<code># Network information</code>

<code>network  --bootproto=dhcp --device=eth0 --onboot=on</code>

<code># System bootloader configuration</code>

<code>bootloader --append=</code><code>"crashkernel=auto rhgb quiet"</code> <code>--location=mbr --driveorder=</code><code>"sda"</code>

<code># Clear the Master Boot Record</code>

<code>zerombr</code>

<code># Partition clearing information</code>

<code>clearpart --all --initlabel </code>

<code># Disk partitioning information</code>

<code>part </code><code>/boot</code> <code>--fstype=</code><code>"ext2"</code> <code>--size=512</code>

<code>part / --fstype=</code><code>"ext4"</code> <code>--size=10240</code>

<code>part </code><code>/home</code> <code>--fstype=</code><code>"ext4"</code> <code>--size=10240</code>

<code>part </code><code>/opt</code> <code>--fstype=</code><code>"ext4"</code> <code>--size=10240</code>

<code>%packages</code>

<code>@base</code>

<code>@basic-desktop</code>

<code>@chinese-support</code>

<code>@core</code>

<code>@debugging</code>

<code>@desktop-debugging</code>

<code>@desktop-platform</code>

<code>@directory-client</code>

<code>@fonts</code>

<code>@input-methods</code>

<code>@internet-browser</code>

<code>@java-platform</code>

<code>@legacy-x</code>

<code>@network-</code><code>file</code><code>-system-client</code>

<code>@print-client</code>

<code>@remote-desktop-clients</code>

<code>@server-platform</code>

<code>@server-policy</code>

<code>@workstation-policy</code>

<code>@x11</code>

<code>abrt-gui</code>

<code>certmonger</code>

<code>device-mapper-persistent-data</code>

<code>krb5-workstation</code>

<code>libXmu</code>

<code>mtools</code>

<code>oddjob</code>

<code>pam_krb5</code>

<code>pax</code>

<code>samba-winbind</code>

<code>sgpio</code>

<code>%end</code>

========================================================================

备注:CentOS6和CentOS7所需的文件

CentOS 6 PXE: 

    yum -y install syslinux tftp-server

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

    cp /media/cdrom/images/pxelinux/{vmlinuz,initrd.img} /var/lib/tftp/boot/

    cp /media/cdrom/isolinux/{boot.cfg,vesamenu.c32,splash.png} /var/lib/tftp/boot/

    mkdir /var/lib/tftpboot/pxelinux.cfg/

    cp /media/cdrom/isolinux/isolinux.cfg /var/lib/tftpboot/pxelinux.cfg/default/

CentOS 7 PXE:

    cp /usr/share/syslinux/{chain.c32,mboot.c32,menu.c32,memdisk} /var/lib/tftpboot/

参考:

http://blog.51cto.com/cwtea/834991

本文转自MT_IT51CTO博客,原文链接:http://blog.51cto.com/hmtk520/2058856,如需转载请自行联系原作者

继续阅读