歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> bootstraping之PXE自動安裝操作系統

bootstraping之PXE自動安裝操作系統

日期:2017/2/28 13:43:45   编辑:Linux教程

運維工作縱向來看主要分為三個方向:

  • 1.BootStraping:主要做的是操作系統的安裝與配置,包括Bare Metal(pxe,cobbler)和Virtual Machine(image files)。

  • 2.Configuration:主要使用運維工具如puppet(rubby研發)、saltstack(python研發)、ansible、chef、cfengine等自動化運維工具做應用程序做批量部署與配置。

  • 3.Command and Conrol:主要使用自動化運維工具發送命令或指令實現對操作系統或者應用程序操縱或者控制。

我們今天主要探討下第一個方向,通過PXE,結合DHCP,以及TFTP等技術實現自動化的Bootstraping。

一、簡介

1.1 什麼是PXE

PXE(Pre-boot Execution Environment,預啟動執行環境)是由Intel公司開發的最新技術,工作於Client/Server的網絡模式,支持工作站通過網絡從遠端服務器下載映像,並由此支持通過網絡啟動操作系統,在啟動過程中,終端要求服務器分配IP地址,再用TFTP(trivial file transfer protocol)或MTFTP(multicast trivial file transfer protocol)協議下載一個啟動軟件包到本機內存中執行,由這個啟動軟件包完成終端基本軟件設置,從而引導預先安裝在服務器中的終端操作系統。

嚴格來說,PXE 並不是一種安裝方式,而是一種引導方式。進行 PXE 安裝的必要條件是在要安裝的計算機中必須包含一個 PXE 支持的網卡(NIC),即網卡中必須要有 PXE Client。PXE 協議可以使計算機通過網絡啟動。此協議分為 Client端和 Server 端,而PXE Client則在網卡的 ROM 中。當計算機引導時,BIOS 把 PXE Client 調入內存中執行,然後由 PXE Client 將放置在遠端的文件通過網絡下載到本地運行。運行 PXE 協議需要設置 DHCP 服務器和 TFTP 服務器。DHCP 服務器會給 PXE Client(將要安裝系統的主機)分配一個 IP 地址,由於是給 PXE Client 分配 IP 地址,所以在配置 DHCP 服務器時需要增加相應的 PXE 設置。此外,在 PXE Client 的 ROM 中,已經存在了 TFTP Client,那麼它就可以通過 TFTP 協議到 TFTP Server 上下載所需的文件了。

PXE的工作過程:

  1. PXE Client 從自己的PXE網卡啟動,向本網絡中的DHCP服務器索取IP;

  2. DHCP 服務器返回分配給客戶機的IP 以及PXE文件的放置位置(該文件一般是放在一台TFTP服務器上) ;

  3. PXE Client 向本網絡中的TFTP服務器索取pxelinux.0 文件;

  4. PXE Client 取得pxelinux.0 文件後之執行該文件;

  5. 根據pxelinux.0 的執行結果,通過TFTP服務器加載內核和文件系統 ;

  6. 進入安裝畫面, 此時可以通過選擇HTTP、FTP、NFS 方式之一進行安裝;

詳細工作流程,請參考下面這幅圖:

1.2 什麼是Kickstart

Kickstart是一種無人值守的安裝方式。它的工作原理是在安裝過程中記錄典型的需要人工干預填寫的各種參數,並生成一個名為ks.cfg的文件。如果在安裝過程中(不只局限於生成Kickstart安裝文件的機器)出現要填寫參數的情況,安裝程序首先會去查找Kickstart生成的文件,如果找到合適的參數,就采用所找到的參數;如果沒有找到合適的參數,便需要安裝者手工干預了。所以,如果Kickstart文件涵蓋了安裝過程中可能出現的所有需要填寫的參數,那麼安裝者完全可以只告訴安裝程序從何處取ks.cfg文件,然後就去忙自己的事情。等安裝完畢,安裝程序會根據ks.cfg中的設置重啟系統,並結束安裝。

PXE+Kickstart 無人值守安裝操作系統完整過程如下:

1.3 什麼是DHCP

動態主機設置協議(Dynamic Host Configuration Protocol,DHCP)是一個局域網的網絡協議,使用UDP協議工作,主要有兩個用途:

用於內部網絡或網絡服務供應商自動分配IP地址給用戶
用於內部網絡管理員作為對所有電腦作中央管理的手段

DHCP工作原理:

一、DHCP客戶機初始化:
1. 尋找DHCP Server。

當DHCP客戶機第一次登錄網絡的時候(也就是客戶機上沒有任何IP地址數據時),它會通過UDP 67端口向網絡上發出一個DHCPDISCOVER數據包(包中包含客戶機的MAC地址和計算機名等信息)。因為客戶機還不知道自己屬於哪一個網絡,所以封包的源地址為0.0.0.0,目標地址為255.255.255.255,然後再附上DHCP discover的信息,向網絡進行廣播。DHCP discover的等待時間預設為1秒,也就是當客戶機將第一個DHCP discover封包送出去之後,在1秒之內沒有得到回應的話,就會進行第二次DHCP discover廣播。若一直沒有得到回應,客戶機會將這一廣播包重新發送四次(以2,4,8,16秒為間隔,加上1-1000毫秒之間隨機長度的時間)。如果都沒有得到DHCP Server的回應,客戶機會從169.254.0.0/16這個自動保留的私有IP地址中選用一個IP地址。並且每隔5分鐘重新廣播一次,如果收到某個服務器的響應,則繼續IP租用過程。

2. 提供IP地址租用

當DHCP Server監聽到客戶機發出的DHCP discover廣播後,它會從那些還沒有租出去的地址中,選擇最前面的空置IP,連同其它TCP/IP設定,通過UDP 68端口響應給客戶機一個DHCP OFFER數據包(包中包含IP地址、子網掩碼、地址租期等信息)。此時還是使用廣播進行通訊,源IP地址為DHCP Server的IP地址,目標地址255.255.255.255。同時,DHCP Server為此客戶保留它提供的IP地址,從而不會為其他DHCP客戶分配此IP地址。由於客戶機在開始的時候還沒有IP地址,所以在其DHCP discover封包內會帶有其MAC地址信息,並且有一個XID編號來辨別該封包,DHCP Server響應的DHCP OFFER封包則會根據這些資料傳遞給要求租約的客戶。

3. 接受IP租約

如果客戶機收到網絡上多台DHCP服務器的響應,只會挑選其中一個DHCP OFFER(一般是最先到達的那個),並且會向網絡發送一個DHCP REQUEST廣播數據包(包中包含客戶端的MAC地址、接受的租約中的IP地址、提供此租約的DHCP服務器地址等),告訴所有DHCP Server它將接受哪一台服務器提供的IP地址,所有其他的DHCP服務器撤銷它們的提供以便將IP地址提供給下一次IP租用請求。此時,由於還沒有得到DHCP Server的最後確認,客戶端仍然使用0.0.0.0為源IP地址255.255.255.255為目標地址進行廣播。事實上,並不是所有DHCP客戶機都會無條件接受DHCP Server的OFFER,特別是如果這些主機上安裝有其它TCP/IP相關的客戶機軟件。客戶機也可以用DHCP REQUEST向服務器提出DHCP選擇,這些選擇會以不同的號碼填寫在DHCP Option Field裡面。客戶機可以保留自己的一些TCP/IP設定。

4. 租約確認

當DHCP Server接收到客戶機的DHCP REQUEST之後,會廣播返回給客戶機一個DHCP ACK消息包,表已經接受客戶機的選擇,並將這一IP地址的合法租用以及其他的配置信息都放入該廣播包發給客戶機。客戶機在接收到DHCP ACK廣播後,會向網絡發送三個針對此IP地址的ARP解析請求以執行沖突檢測,查詢網絡上有沒有其它機器使用該IP地址;如果發現該IP地址已經被使用,客戶機會發出一個DHCP DECLINE數據包給DHCP Server,拒絕此IP地址租約,並重新發送DHCP discover信息。此時,在DHCP服務器管理控制台中,會顯示此IP地址為BAD_ADDRESS。如果網絡上沒有其它主機使用此IP地址,則客戶機TCP/IP使用租約中提供的IP地址完成初始化,從而可以和其他網絡中的主機進行通訊。

二、DHCP客戶機租期續約:

客戶機會在租期過去50%的時候,直接向為其提供IP地址的DHCP Server發送DHCP REQUEST消息包。如果客戶機接收到該服務器回應的DHCP ACK消息包,客戶機就根據包中所提供的新的租期以及其它已經更新的TCP/IP參數,更新自己的配置,IP租用更新完成。如果沒有收到該服務器的回復,則客戶機繼續使用現有的IP地址,因為當前租期還有50%。如果在租期過去50%的時候沒有更新,則客戶機將在租期過去87.5%的時候再次向為其提供IP地址的DHCP聯系。如果還不成功,到租約的100%時候,客戶機必須放棄這個IP地址,重新申請。如果此時無DHCP可用,客戶機會使用169.254.0.0/16中隨機的一個地址,並且每隔5分鐘再進行嘗試。

Schema of a typical DHCP session:

1.4 什麼是TFTP

目的:

TFTP是一個傳輸文件的簡單協議,通常使用UDP(監聽在UDP/69端口)協議而實現,但tftp並沒有要求實現的具體協議,在特殊需求的場合可以同tcp實現。此協議設計的時候是進行小文件傳輸的。因此它不具備通常的FTP的許多功能,它只能從文件服務器上獲得或寫入文件,不能列出目錄,不進行認證,它傳輸8位數據。傳輸中有三種模式:netascii,這是8位的ASCII碼形式,另一種是octet,這是8位源數據類型;最後一種mail已經不再支持,它將返回的數據直接返回給用戶而不是保存為文件。

概況:

任何傳輸起自一個讀取或寫入文件的請求,這個請求也是連接請求。如果服務器批准此請求,則服務器打開連接,數據以定長512字節傳輸。每個數據包包括一塊數據,服務器發出下一個數據包以前必須得到客戶對上一個數據包的確認。如果一個數據包的大小小於512字節,則表示傳輸結構。如果數據包在傳輸過程中丟失,發出方會在超時後重新傳輸最後一個未被確認的數據包。通信的雙方都是數據的發出者與接收者,一方傳輸數據接收應答,另一方發出應答接收數據。大部分的錯誤會導致連接中斷,錯誤由一個錯誤的數據包引起。這個包不會被確認,也不會被重新發送,因此另一方無法接收到。如果錯誤包丟失,則使用超時機制。錯誤主要是由下面三種情況引起的:不能滿足請求,收到的數據包內容錯誤,而這種錯誤不能由延時或重發解釋,對需要資源的訪問丟失(如硬盤滿)。TFTP只在一種情況下不中斷連接,這種情況是源端口不正確,在這種情況下,指示錯誤的包會被發送到源機。這個協議限制很多,這是都是為了實現起來比較方便而進行的。通過下邊的圖片來了解tftp協議的通信流程:

二、系統環境

實驗環境:VMware Workstation 12

系統平台:CentOS 7.2 1511 (帶KDE與開發環境)

網絡模式:橋接模式(橋接主機無線網卡)

DHCP / TFTP IP:192.168.1.2

HTTP / FTP / NFS IP:192.168.1.2

防火牆已關閉/iptables: Firewall is not running.

SELINUX=disabled

三、准備工作

生成ks.cfg 文件需要system-config-kickstart 工具,而此工具依賴於X Windows,所以我們需要安裝X Windows 和Desktop 並重啟系統,操作如下:

[root@young ~]# yum groupinstall "X window System"

[root@young ~]# yum groupinstall Desktop

[root@young ~]# reboot

四、安裝並配置DHCP

[root@young ~]# yum -y install dhcp

[root@young ~]# cp /usr/share/doc/dhcp-4.2.5/dhcpd.conf.example /etc/dhcp/dhcpd.conf 

[root@young ~]# vim /etc/dhcp/dhcpd.conf

  ....
  option domain-name "young.com";
  option domain-name-servers 8.8.8.8;

  default-lease-time 43200;
  max-lease-time 86400;

  log-facility local7;

  subnet 192.168.1.0 netmask 255.255.255.0 {
      range 192.168.1.230 192.168.1.240;
      filename "pxelinux.0";
      next-server 192.168.1.2;
      option routers 192.168.1.1;
      option broadcast-address 192.168.1.255;
  }
  ...

[root@young ~]# systemctl start dhcpd.service

[root@young ~]# ss -unl

...
UNCONN      0      0                          *:67                                     *:*
...

dhcp程序環境說明:

dhcp server:

            dhcp主程序:
                /usr/sbin/dhcpd

                IPV4網絡:
                    /etc/dhcp/dhcpd.conf
                    /usr/lib/systemd/system/dhcpd.service

                IPV6網絡:
                    /etc/dhcp/dhcpd6.conf
                    /usr/lib/systemd/system/dhcpd6.service
            dhcrelay:
                /usr/sbin/dhcrelay
                /usr/lib/systemd/system/dhcrelay.service

        監聽的地址和端口:
            Server: 67/udp
            Client: 68/udp

        配置文件:/etc/dhcp/dhcpd.conf
            配置指令:
                option選項:配置給客戶端的相信息
                指令:定義dhcp server的工作特性

            配置有級別之分:
                全局配置
                子網配置
                主機配置

            常用的配置:
                default-lease-time 600;
                max-lease-time 7200;

                option domain-name "search_domain.tld";
                option domain-name-servers DNS_SERVER1, DNS_SERVER2, DNS_SERVER3;
                option routers GW1, GW2, ...;
                option broadcast-address BROADCAST_ADDRESS;

                subnet NETWORK  netmask MASK {
                    range START_IP END_IP;
                }  定義網絡作用域,即一個子網,主要用於指明地址池;

                host passacaglia {
                    hardware ethernet 0:0:c0:5d:bd:95;
                    fixed-address IP_ADDR;
                }

            其它指令:
                filename:指明引導文件名稱;
                next-server:指明引導文件所在的服務器的主機IP;

                filename “pxelinux.0";
                next-server 192.168.1.2; #tftp server

五、安裝並配置FTP

[root@young ~]# yum -y install vsftpd   #安裝服務

[root@young ~]# mkdir -pv /var/ftp/pub/centos/7/x86_64/ #創建目錄

[root@young ~]# mount -r /dev/sr0 /mnt #掛在系統光盤

[root@young ~]# cp -r /mnt/* /var/ftp/pub/centos/7/x86_64/ #復制光盤倉庫,要全部復制會用到其他文件

[root@young ~]# systemctl start vsftpd.service

[root@young ~]# ss -tnl

...
LISTEN      0      32                        :::21                                    :::* 
...

[root@young ~]# lftp 192.168.1.2  #查看ftp工作狀態是否正常
lftp 192.168.1.2:~> exit            

[root@young ~]# lftp 192.168.1.2/pub
cd ok, cwd=/pub                     
lftp 192.168.1.2:/pub> cd centos/7/x86_64/
lftp 192.168.1.2:/pub/centos/7/x86_64> ls
drwxr-xr-x    2 0        0          200704 Dec 24 11:02 Packages
dr-xr-xr-x    2 0        0            4096 Dec 24 10:58 repodata

注:dhclient -d 可以查看dhcp服務器的詳細輸出

六、配置TFTP

[root@young ~]# yum -y install tftp-server tftp #安裝tftp服務端與客戶端

CentOS 7:
[root@young ~]# systemctl enable tftp.socket  #設為開機啟動

[root@young ~]# systemctl start tftp.socket #啟動服務

CentOS 6:
[root@young ~]# chkconfig tftp on

[root@young ~]# service xinetd restart

[root@young ~]# ss -unl #監聽在UDP/69端口
...
UNCONN      0      0                         :::69                                    :::*    
...

七、安裝syslinux

[root@young ~]# yum -y install syslinux

說明:syslinux是一個功能強大���引導加載程序,而且兼容各種介質。更加確切地說:SYSLINUX是一個小型的Linux操作系統,它的目的是簡化首次安裝Linux的時間,並建立修護或其它特殊用途的啟動盤。

八、配置支持PXE的啟動程序

centos 7:

[root@young ~]# cp /usr/share/syslinux/{pxelinux.0,mboot.c32,memdisk,menu.c32,chain.c32} /var/lib/tftpboot/   #復制啟動所需的引導文件

[root@young ~]# cp /mnt/images/pxeboot/{initrd.img,vmlinuz} /var/lib/tftpboot/   #復制系統光盤中虛擬文件系統以及內核文件至tftp服務器

[root@young ~]# mkdir /var/lib/tftpboot/pxelinux.cfg   #創建配置文件夾

[root@young ~]# vim /var/lib/tftpboot/pxelinux.cfg/default   #創建啟動配置文件

default menu.c32
    #prompt 5   #顯示 'boot: ' 提示符。為 '0' 時則不提示,將會直接啟動 'default' 參數中指定的內容。
    timeout 60 #在用戶輸入之前的超時時間,單位為 1/10 秒。
    MENU TITLE CentOS 7 PXE Menu

    LABEL linux   #'label' 指定你在 'boot:' 提示符下輸入的關鍵字,比如boot: linux[ENTER],這個會啟動'label linux' 下標記的kernel 和initrd.img 文件。
    MENU LABEL Install CentOS 7 x86_64
    KERNEL vmlinuz   #kernel 參數指定要啟動的內核。
    APPEND initrd=initrd.img inst.repo=ftp://192.168.1.2/pub/centos/7/x86_64       #append 指定追加給內核的參數,能夠在grub 裡使用的追加給內核的參數,在這裡也都可以使用。
    LABEL linux_autoinst
    MENU LABEL Install CentOS 7 x86_64 auto
    KERNEL vmlinuz
    APPEND initrd=initrd.img inst.repo=ftp://192.168.1.2/pub/centos/7/x86_64 ks=ftp://192.168.1.2/pub/kickstarts/centos7.cfg    #告訴系統,yum倉庫在哪裡,從哪裡獲取ks.cfg文件

CentOS 6:

[root@young ~]#yum  -y install syslinux

[root@young ~]#cp /usr/share/syslinux/pxelinux.0  /var/lib/tftpboot/

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

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

[root@young ~]#mkdir /var/lib/tftpboot/pxelinux.cfg/        

[root@young ~]#cp  /media/cdrom/isolinux/isolinux.cfg  /var/lib/tftpboot/pxelinux.cfg/default

[root@young ~]# vim /var/lib/tftp/pxelinux.cfg/default  #修改如下
default vesamenu.c32
    #prompt 1
    timeout 600

display boot.msg

    menu background splash.jpg
    menu title Welcome to CentOS 6.8 young!
    menu color border 0 #ffffffff #00000000
    menu color sel 7 #ffffffff #ff000000
    menu color title 0 #ffffffff #00000000
    menu color tabmsg 0 #ffffffff #00000000
    menu color unsel 0 #ffffffff #00000000
    menu color hotsel 0 #ff000000 #ffffffff
    menu color hotkey 7 #ffffffff #ff000000
    menu color scrollbar 0 #ffffffff #00000000

    label autoinst
    menu label ^Auto Install CentOS
    menu default
    kernel vmlinuz
    append initrd=initrd.img ks=ftp://192.168.1.2/pub/centos6.cfg
    label linux
    menu label ^Install or upgrade an existing system
    kernel vmlinuz
    append initrd=initrd.img
    label vesa
    menu label Install system with ^basic video driver
    kernel vmlinuz
    append initrd=initrd.img nomodeset
    label rescue
    menu label ^Rescue installed system
    kernel vmlinuz
    append initrd=initrd.img rescue
    label local
    menu label Boot from ^local drive
    localboot 0xffff
    label memtest86
    menu label ^Memory test
    kernel memtest
    append -
Copyright © Linux教程網 All Rights Reserved