天天看點

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,如需轉載請自行聯系原作者

繼續閱讀