本文轉自http://blog.51cto.com/itwish/2154820
工作環境中,想要安裝Linux但是計算機沒有光驅,或者是有大批量的計算機需要同時安裝Linux,就需要通過部署環境PXE+DHCP+TFTP+HTTP+kickstart 方式來實現了 。
PXE協議詳解:
PXE,預啟動執行環境(Preboot eXecution Environment,PXE,也被稱為預執行環境)提供了一種使用網絡接口(Network Interface)啟動計算機的機制。這種機制讓計算機的啟動可以不依賴本地數據存儲設備(如硬盤)或本地已安裝的操作系統。
PXE(Pre-boot Execution Environment)是由Intel設計的協議,它可以使計算機通過網絡啟動。協議分為client和server兩端,支持工作站通過網絡從遠端服務器下載映像,並由此支持來自網絡的操作系統的啟動過程,其啟動過程中,終端要求服務器分配IP地址,再用TFTP(trivial file transfer protocol)或MTFTP(multicast trivial file transfer protocol)協議下載一個啟動軟件包到本機內存中並執行,由這個啟動軟件包完成終端基本軟件設置,從而引導預先安裝在服務器中的終端操作系統。
PXE工作原理:
1.PXE client從自己的PXE網卡啟動,向本網絡中的DHCP服務器請求ip地址
2.DHCP服務器收到dhcp請求后,分配dhcp地址池中ip給PXE client
3.PXE client向本網絡中的TFTP服務器索取bootstarp文件
4.PXE client取得bootstarp文件后之執行pxelinux.0文件引導,使用pxelinux環境來引導os安裝程序。
5.PXE client然后讀取pxelinux.cfg文件夾中的default(isolinux.cfg)引導文件,通過TFTP服務器加載內核vmlinuz和根文件系統(boot.msg,vesamenu.c32,initrd.img,splash.jpg),通過http服務器加載ks.cfg引導文件。
6.啟動linux內核完成安裝
在上圖中,PXE client是需要安裝Linux的計算機,TFTP Server和DHCP Server運行部署在在PXE Server端。Bootstrap文件、配置文件、Linux內核以及Linux根文件系統都放置在Linux Server上TFTP服務器的根目錄下。
PXE必要條件:
1、pxe client必須支持pxe用戶端功能,並且開機時選擇網絡啟動,這樣系統才能以網絡的方式進入pxe啟動程序
2、pxe服務器必須至少提供DHCP及TFTP的服務才行,且其中
DHCP服務器必須能夠除未pxe client分配ip地址外,還需告知tftp所在的位置(即pxelinux.0的文件位置)
TFTP服務器則為pxe client 提供bootloader 及 kernel 等重要文件下載服務
3、使用NFS/HTTP/FTP之一的服務器提供pxe client所需程序及軟件來源等通訊協議
PXE工作流程圖:
PXE安裝DHCP
動態主機設置協議(Dynamic Host Configuration Protocol,DHCP)是一種使網絡管理員能夠集中管理和自動分配IP網絡地址的通信協議,使用UDP協議工作,DHCP使用統一端口作為BOOTP:服務器端使用67/udp,客戶端使用68/udp。主要有兩個用途:用於內部網絡或網絡服務供應商自動分配IP地址給用戶;用於內部網絡管理員作為對所有電腦作中央管理的手段。
DHCP協議的工作流程:
客戶端在局域網廣播DHCPDISCOVER報文,請求獲得ip地址、網關、dns地址 等信息;DHCP服務器收到DHCPDISCOVER報文后 ,發送DHCPOFFER 報文進行響應 ;客戶端收到DHCPOFFER報文后,發送DHCPREQUEST 報文進行請求 ;最終DHCP 服務器發送 DHCPACK報文進行確認 。
DHCP配置文件dhcp.conf 分為4段:
1、DHCP屬性段: log-facility 定義日志等級
2、全局屬性段: 使用option 關鍵字定義
3、子網分配段: 使用subnet 來定義
4、主機配置段: 使用host來定義
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
[root@PXE pxelinux.cfg]
# vi /etc/dhcp/dhcpd.conf
# dhcpd.conf
#
# Sample configuration file for ISC dhcpd
#
# option definitions common to all supported networks...
option domain-name
"itwish.cn"
;
# 全局定義域名
option domain-name-servers 192.168.4.150 ;
# 全局定義dns 地址
default
-lease-time 600;
# 全局定義默認租約期限
max-lease-time 7200;
# 全局定義最長租約期限
log-facility local7;
# 文件屬性
subnet NETWORK_ADDR netmask NETMASK {
# 定義子網
range 10.254.239.10 10.254.239.20;
# 分配地址池
option routers dns1;
option domain-name-servers ns.itwish.cn;
option domain-name
"internal.example.org"
;
default
-lease-time 600;
max-lease-time 7200;
range dynamic-bootp 10.254.239.40 10.254.239.60;
# 定義bootp
option broadcast-address 10.254.239.31;
# 廣播地址
next-server 192.168.4.100;
# tftp服務器地址
filename
"pxelinux.0"
;
# 告訴TFTP目錄下的bootstarp文件
}
host passacaglia {
# 主機定義
hardware ethernet 0:0:c0:5d:bd:95;
# 物理地址
filename
"vmunix.passacaglia"
;
server-name
"toccata.fugue.com"
;
fixed-address ip;
# 固定地址
}
|
-
安裝DHCP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
[root@PXE ~]
# yum install dhcp # 安裝dhcp server
[root@PXE ~]
# rpm -ql dhcp
/etc/dhcp
/etc/dhcp/dhcpd.conf
# dhcpd配置文件
/etc/rc.d/init.d/dhcpd
# dhcpd啟動文件
/usr/sbin/dhcpd
# 啟動腳本配置文件
[root@PXE pxelinux.cfg]
# vi /etc/dhcp/dhcpd.conf # 調整配置文件
# dhcpd.conf
#
option domain-name
"itwish.cn"
;
option domain-name-servers 192.168.4.150 ;
default
-lease-time 600;
max-lease-time 7200;
log-facility local7;
subnet 192.168.4.0 netmask 255.255.255.0 {
# 定義子網
range 192.168.4.10 192.168.4.100;
option routers 192.168.4.1;
next-server 192.168.4.150;
# 注:添加 tftp服務器地址
filename=
"pxelinux.0"
;
#注:告訴TFTP目錄下的bootstarp文件
}
#注:配置文件中以";" 號結尾 ,且需添加next-server 和filename 項
|
-
啟動dhcp並驗證dhcpd進程是否處於監聽狀態:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
[root@PXE ~]
# chkconfig --add dhcpd
[root@PXE ~]
# chkconfig dhcpd on
[root@PXE ~]
# service dhcpd start
Starting dhcpd: [ OK ]
[root@PXE ~]
# ps aux | grep dhcpd # 驗證dhcpd 啟動
dhcpd 14087 0.0 0.1 48324 3572 ? Ss 03:13 0:00 /usr/sbin/dhcpd -user dhcpd -group dhcpd
root 14108 0.0 0.0 103272 840 pts/0 S+ 03:14 0:00 grep dhcpd
[root@PXE ~]
# ss -tunl | grep 67
udp UNCONN 0 0 *:67 *:*
|
PXE 安裝 TFTP
簡單文件傳輸協議也稱小型文件傳輸協議(Trivial File Transfer Protocol, TFTP),工作在UDP/69 端口,是一種於1981年在RFC 783中定義的簡化的文件傳輸協議(FTP)。
瞬時(非獨立)守護進程:他們無需定義在運行級別下,只需要一次性的定義xinetd的運行級別
xinetd——為那些極少接受用戶請求的服務,專門提供監聽功能,如 監聽tftpd進程
獨立(standlone)守護進程 :能自我管理,無須xinet 提供監聽服務的進程
-
安裝TFTP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
[root@PXE ~]
# yum install xinetd tftp-server
[root@PXE ~]
# rpm -ql tftp-server
/etc/xinetd.d/tftp
# 配置文件路徑
/
var
/lib/tftpboot
# 默認tftp存儲目錄
[root@PXE ~]
# vi /etc/xinetd.d/tftp
# default: off
service tftp
{
disable = no
# no 表明tftp處於啟用狀態 ,yes 表示tftp處於禁用狀態
socket_type = dgram
protocol = udp
wait = yes
user = root
server = /usr/sbin/
in
.tftpd
server_args = -s /
var
/lib/tftpboot
# 默認tftp存儲目錄
per_source = 11
cps = 100 2
flags = IPv4
}
[root@PXE ~]
# chkconfig xinetd on
[root@PXE ~]
# chkconfig tftp on
[root@PXE ~]
# service xinetd start
Starting xinetd:
[root@PXE ~]
# ss -tunl | grep 69
udp UNCONN 0 0 *:69 *:*
|
-
使用 syslinux 提供的bootstart :
1
2
3
4
5
6
7
8
9
10
|
[root@PXE ~]
# yum install syslinux
[root@PXE ~]
# rpm -ql syslinux
/usr/share/syslinux
# pxelinux.0 文件存儲目錄
[root@PXE ~]
# cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/
# 復制pxelinux.0到 /var/lib/tftpboot 目錄
[root@PXE boot]
# mount /dev/cdrom /media/ # 掛載光盤
mount: block device /dev/sr0 is write-protected, mounting read-only
|
-
配置pxelinux.cfg 文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
[root@PXE ~]
# mkdir /var/lib/tftpboot/pxelinux.cfg # 創建pxelinux.cfg 文件夾
[root@PXE ~]
# cp isolinux/isolinux.cfg /var/lib/tftpboot/pxelinux.cfg/default
# 把isolinux.cfg引導文件拷貝到tftpd存儲目錄下的pxelinux.cfg文件中,並命名為default
[root@PXE ~]
# vi /var/lib/tftpboot/pxelinux.cfg/default # 修改linux內核引導文件
default
vesamenu.c32
# 默認啟動界面,該文件需要拷貝到tftp存儲目錄中。
#prompt 1
timeout 600
# 倒計時 600就是60 秒,改數字為秒數的10倍
display boot.msg
# 將額外信息寫入到boot.msg文件中,該文件需要拷貝到tftp存儲目錄中。
menu background splash.jpg
# 菜單背景圖,該文件需要拷貝到tftp存儲目錄中。
menu title Welcome to CentOS 6.6!
# 菜單主標題
label linux
menu label ^Install or upgrade an PXE system
#菜單項目
menu
default
# 預設項目
kernel vmlinuz
# 內核 vmlinuz,該文件需要拷貝到tftp存儲目錄中。
append initrd=initrd.img ks=http:
//192.168.4.150/ks.cfg
# 核心參數,指定initrd 核心文件,該文件需要拷貝到tftp存儲目錄中。另指定ks文件目錄,這兒使用的http協議
|
-
把內核及根文件拷貝到tftpd存儲目錄 :參照上菜單配置信息,包括 vesamenu.c32,boot.msg,splash.jpg,vmlinuz,initrd.img 文件做拷貝
1
2
3
|
[root@PXE ~]
# cp /media/images/pxeboot/{initrd.img,vmlinuz} /var/lib/tftpboot/
[root@PXE ~]
# cp /media/isolinux/{boot.msg,vesamenu.c32,splash.jpg} /var/lib/tftpboot/
|
linux PXE環境HTTPD部署
創建kickstart文件方式:
1、復制模板 /root/anaconda-ks.cfg ,而后使用vim編輯配置
2、使用system-config-kickstart 來生成,建議也使用/root/anaconda-ks.cfg 作為模板來進行
# ksvalidator 查看ks文件語法是否正確
kickstat文件的組成部分 :
1、命令段: 用於配置系統 ,如:install ,firewall, part,lv 等
2、軟件包段%packages;指定要安裝的程序包組(@組包名)及程序包(程序包名),每行一個 ;在程序包之前加 “-”號,表示不希望安裝
3、%pre %post腳本段:安裝過程開始之前、后執行的安裝預備式腳本
-
httpd安裝:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
[root@PXE ~]
# yum install httpd
[root@PXE ~]
# rpm -ql httpd
/etc/httpd
/etc/httpd/conf/httpd.conf
# httpd 配置文件
/
var
/www/html
# httpd 默認存儲目錄
[root@PXE ~]
# chkconfig httpd on
[root@PXE ~]
# service httpd start
Starting httpd:
[root@PXE ~]
# ss -tunl |grep 80
tcp LISTEN 0 128 :::80 :::*
[root@PXE ~]
# ps aux | grep httpd
root 1877 0.0 3.3 479948 20284 ? Ss 08:20 0:01 /usr/sbin/httpd
apache 2184 0.0 1.6 480084 9908 ? S 09:07 0:00 /usr/sbin/httpd
apache 2185 0.0 1.6 480084 9884 ? S 09:07 0:00 /usr/sbin/httpd
apache 2188 0.0 1.6 480084 9884 ? S 09:07 0:00 /usr/sbin/httpd
apache 2189 0.0 1.6 480084 9884 ? S 09:07 0:00 /usr/sbin/httpd
apache 2190 0.0 1.6 480084 9884 ? S 09:07 0:00 /usr/sbin/httpd
apache 2191 0.0 1.6 480084 9884 ? S 09:07 0:00 /usr/sbin/httpd
apache 2192 0.0 1.6 480084 9884 ? S 09:07 0:00 /usr/sbin/httpd
apache 2193 0.0 1.6 480084 9884 ? S 09:07 0:00 /usr/sbin/httpd
root 3116 0.0 0.1 103324 844 pts/0 S+ 19:48 0:00 grep httpd
[root@PXE ~]
# cp /root/anaconda-ks.cfg /var/www/html/ks.cfg # 拷貝模板到/var/www/html 目錄,並重命名為ks.cfg
[root@PXE ~]
# chmod o+r /var/www/html/ks.cfg # 分配權限,為pxe client引導安裝使用
[root@PXE isolinux]
# cp /media/* /var/www/html/centos/os/ # 拷貝安裝系統
[root@PXE os]
# grub-crypt # 密碼加密,使用grub-crypt 默認512位加密方式
Password:
Retype password:
$6$DnceMH60Kiu8TaME$ySd/QOpPtEcLnnoW36bDjb59xr1eJHGUwTTV/4MHoojT.RoXXdsLHMWJXcLCETQNRF2xITSqKHAAUNZq6df0i/
|
-
以/root/anaconda.cfg 為模板,配置ks.cfg文件 ,配置repo url 和 ks.cfg 。
ks引用格式如下圖
針對集群的計算節點設置的,比如設置用戶信息、關閉防火牆等,請根據自己需要定制,kickstart文件說明參見:https://access.redhat.com/documentation/zh-cn/red_hat_enterprise_linux/6/html/installation_guide/s1-kickstart2-options
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
[root@PXE ~]
# vi /var/www/html/ks.cfg # 調整配置文件
# Kickstart file automatically generated by anaconda.
#version=DEVEL
install
# 命令段 ,安裝
url --url=http:
//192.168.4.150/centos/os/ # 指定網絡url安裝目錄
lang en_US.UTF-8
# 默認字體
keyboard us
# 鍵盤類型
network --onboot yes --device eth0 --bootproto dhcp --noipv6
# 指定開機自啟,網絡接口eth0 ,dhcp獲取網絡地址,ipv6 禁用
rootpw --iscrypted $6$ZOGP2tA0PI/6SI/X$MlC5bJyXfP9TBN5/0vwoc6dqAqIijOQthEbAZUnIXft85Tj9n4sKWB2PfxrsVfkZ2ibqX63apu8ElmdEvBo9o/
# root 加密密碼,使用grub-crypt 生成的字符串替代
reboot
# 配置完畢后,重啟內核
firewall --disabled
# 防火牆禁用
authconfig --enableshadow --passalgo=sha512
# 登錄身份使用 sha1 的 512bits 加密算法
selinux --disabled
# selinux 功能禁用
timezone Asia/Shanghai
# 定義上海時區
bootloader --location=mbr --driveorder=sda --append=
"crashkernel=auto rhgb quiet"
# 定義bootloader,grub安裝mbr ,安裝在sda磁盤
# The following is the partition information you requested
# Note that any partitions you deleted are not expressed
# here so unless you clear all partitions first, this is
# not guaranteed to work
clearpart --all
# 清除磁盤分區表
text
# 純文本格式安裝顯示
zerombr
# 對磁盤進行初始化
part /boot --fstype=ext4 --asprimary --size=2000
# 分區信息 ,定義boot分區 ,格式為ext4 ,大小為2G
part swap --size=4096
# 分區信息 ,定義swap分區 ,大小為4G
part pv.008003 --size=80000
# 分區信息 ,定義lv分區 pv.008003,大小為80G
volgroup vg0 --pesize=8192 pv.008003
# 分區信息 ,在lv分區pv.008003定義vg0卷組 ,pe大小為8M
logvol / --fstype=ext4 --name=root --vgname=vg0 --size=15000
logvol /usr --fstype=ext4 --name=/usr --vgname=vg0 --size=30000
logvol /
var
--fstype=ext4 --name=/
var
--vgname=vg0 --size=20000
logvol /home --fstype=ext4 --name=/home --vgname=vg0 --size=12000
repo --name=
"CentOS-6.6"
--baseurl=http:
//192.168.4.150/centos/os/ --cost=100
# 定義yum倉庫 ,類別為bashurl ,名稱為CentOS-6.6
%packages
# 包組段,安裝包組及程序包
@core
@server-policy
@workstation-policy
%end
[root@PXE ~]
# yum -y install pykickstart #安裝ksvalidator 軟件
[root@PXE ~]
# ksvalidator /var/www/html/ks.cfg # ksvalidator驗證ks.cfg語法是否正確
|
-
ks.cfg及repo驗證:
注:ks.cfg若不能正常打開,確認是否有讀權限
注: 若不能顯示以上連接方式,確認httpd配置文件中,是否開啟相關選項。
至此,PXE服務器環境部署完成,出現問題時,一般需要查看系統日志,如:/var/log/messages, 通過日志報錯信息進行解決 。
centos PXE環境測試,安裝,啟動
部署環境:vmware 虛擬機
PXE服務器: PXE, ip :192.168.4.150
PXE client : vm
實驗:
一、配置PXE client 客戶端 ,網絡需與PXE服務器處於同一網段 192.168.4.150 /24
二、選擇開機啟動順序,選擇"Network boot from Intel E1000"
三、pxe client獲取dhcp地址后 ,獲取pxelinux.cfg中配置文件
四、加載內核和根文件系統
五、安裝networkmanager ,創建磁盤分區
六、檢查包依賴關系,並安裝程序。
七、完成安裝,重啟 ,進入登錄界面
至此,pxe 服務器端 部署完成 ,並成功自動化安裝pxeclient 端 。