首頁 > 軟體

bootstraping之PXE自動安裝作業系統

2020-06-16 17:22:03

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

  • 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 -

更多詳情見請繼續閱讀下一頁的精彩內容http://www.linuxidc.com/Linux/2017-02/140319p2.htm


IT145.com E-mail:sddin#qq.com