天天看點

通過PXE自動化安裝自定義OS

黑石實體機的官方标配的作業系統無法滿足部分黑石客戶的需求,是以黑石專門針對該需求設計并驗證了基于PXE來實作伺服器自動化安裝使用者自定義的作業系統。

DHCP結合TFTP提供的PXE服務, 提供PXE引導Linux核心和啟動鏡像,通過kickstart腳本工具來實作作業系統的自動安裝和配置。其中,tftp-server提供TFTP服務,為PXE用戶端提供啟動檔案;dhcp提供DHCP服務,為PXE用戶端提供IP位址;syslinux可以提供必須的pxelinux.0檔案;FTP為PXE提供OS鏡像檔案的存儲和下載下傳;kickstart實作了自動化安裝。

目前伺服器存在兩種啟動方式:Legacy和UEFI。Legacy用于計算機開機時執行系統各部分的自檢,并啟動引導程式或裝載在記憶體的作業系統。而UEFI是一種較長的描述類型接口的标準,其用于作業系統自動從預啟動操作環境,加載到一種作業系統上。兩種啟動方式的PXE環境配置相差很大。

是以,本文檔指導兩種啟動方式下的PXE配置,首先較長的描述Legacy啟動模式下的CentOS自動化安裝的配置流程,然後對UEFI啟動模式下的配置流程相對與Legacy的差别之處做出說明。另外,也對安裝Ubuntu和VMware ESXI的注意事項做了說明。

基于PXE的網絡安裝作業系統如下圖。

通過PXE自動化安裝自定義OS

Legacy模式安裝CentOS

安裝軟體

yum install -y dhcp
           

編輯配置檔案

nano /etc/dhcp/dhcpd.conf
           
ddns-update-style none;
default-lease-time 21600;
max-lease-time 43200;
option domain-name "linuxde.net";
option domain-name-servers 10.61.201.2;

subnet 10.61.200.0 netmask 255.255.255.0 {
 range 10.61.200.1 10.61.200.5; #子網一待配置設定的位址池
 option subnet-mask 255.255.255.0;
 option routers 10.61.201.1;
 next-server 10.61.201.2; #TFTP伺服器的IP位址
 filename "pxelinux.0";#如果不在TFTP的根目錄下,要寫上絕對路徑
}
subnet 10.61.100.0 netmask 255.255.255.0 {
 range 10.61.100.100 10.61.100.200; #子網二待配置設定的位址池
 option subnet-mask 255.255.255.0;
 option routers 10.61.100.1;
 next-server 10.61.201.2; #TFTP伺服器的IP位址
 filename "pxelinux.0";#如果不在TFTP的根目錄下,要寫上絕對路徑
}

subnet 10.61.201.0 netmask 255.255.255.192 {}
subnet 100.111.17.0 netmask 255.255.255.192 {}
#上海黑石需要添加配置option82
option agent.link-selection   code 5 = string;
class "10.61.200.0" {
     match if ((binary-to-ascii(10,8,"",substring(option agent.link-selection,0,1)) = "10") and (binary-to-ascii(10,8,"",substring(option agent.link-selection,1,1)) = "61") and ((binary-to-ascii(10,8,"",substring(option agent.link-selection,2,1)) = "204") or (binary-to-ascii(10,8,"",substring(option agent.link-selection,2,1)) = "205") or (binary-to-ascii(10,8,"",substring(option agent.link-selection,2,1)) = "206") or (binary-to-ascii(10,8,"",substring(option agent.link-selection,2,1)) = "200")));
}
           

注:DHCP server是支援多位址池的IP配置設定,例如存在兩個子網的客戶機通過一台DHCP server來獲得IP,則可以在dhcpd.conf分别配置兩個子網對用的IP池,該處是解決同一個VPC下的不同子網下實體機自動化安裝作業系統的方法。上海黑石需要dhcp server配置option82. 配置檔案的各參數下,class後面的參數為配置的待配置設定IP的網段

配置完成後重新開機dhcpd

service dhcpd restart
           

安裝TFTP server并配置

yum install -y tftp-server syslinux
           
service tftp 
{ 
      socket_type          = dgram 
      protocol             = udp 
      wait                 = yes 
      user                 = root 
      server               = /usr/sbin/in.tftpd 
      server_args           = -s /var/lib/tftpboot   //按照實際需求進行修改 
      disable              = no          //将yes改成no
      per_source           = 11 
      cps                  = 100 2 
      flags                = IPv4 
} 
           

準備啟動檔案

準備啟動檔案的流程如下:

  • 将作業系統的鏡像檔案上傳至PXE伺服器。
  • 将鏡像檔案挂載到某一檔案下。
  • 将所需的啟動檔案拷貝到TFTP的根目錄下。 
    mkdir -p /var/lib/tftpboot
    cd /var/lib/tftpboot
    mkdir pxelinux.cfg
    mount -o loop /data/centos6.5 /mnt
    cd /mnt/centos6.5/isolinux
    cp boot.msg initrd.img splash.jpg vesamenu.c32 vmlinuz /var/lib/tftpboot
    cp isolinux.cfg /var/lib/tftpboot/pxelinux.cfg/default
    cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot
               
    注:initrd.img是一個初始化檔案,即一個最小的系統鏡像;pxelinux.0是legcay模式啟動下的啟動鏡像;pxelinux.cfg檔案下存放的是啟動菜單,需要手動建立;splash.jpg為啟動時的背景圖檔,可以不要;vmlinux為核心檔案;vesamenu.c32為legacy BIOS的引導菜單工具。

配置完成并重新開機TFTP

service xinetd restart
           

安裝配置FTP Server

FTP是專門用來傳輸檔案的協定,在PXE伺服器中,我們利用它來存儲自定義OS以及傳送鏡像檔案至用戶端。

安裝軟體

yum install -y vsftpd
           

上傳OS鏡像檔案至FTP目錄

cd /var/ftp/pub
mkdir centos6
mount -o loop /data/centos6.iso /var/ftp/pub/centos6
mkdir centos7
mount -o loop /data/centos7.iso /var/ftp/pub/centos7
           

安裝完成後重新開機vsftpd服務

service vsftpd restart
           

配置 kickstart

如果不需要自動安裝作業系統,則可以删除配置檔案中的ks部分,即可引導安裝,但是自動化安裝是必須編寫ks.cfg,将配置好的ks.cfg上傳至FTP目錄。在本案例中我們設定Centos的安裝政策如下:

網絡全新安裝CentOS 6.5最新版本;

英語安裝,美國鍵盤,上海時區

LVM分區,500M boot分區、推薦大小的swap, 100G根分區;

UEFI安裝時,設定200MB引導分區;

啟用防火牆,SElinux,本地賬戶授權;

啟用本地軟體倉庫,重置root密碼為3e3ae9d0a;

#platform=CentOS 6 X86_64
firewall --enabled --ssh   # 啟用防火牆,并允許SSH服務
install  # 安裝,而非更新
url --url="ftp://10.61.202.2/pub/centos6   # 通過網絡安裝,
rootpw --iscrypted $1$SCDJzPts$c4VuKhKKUcXfg9aAt0tgu1 # 設定root密碼為centos
auth --useshadow --passalgo=sha512 # 使用本地授權模式
text  # 使用文本安裝
keyboard us  # 使用美國鍵盤
lang en_US # 語言設定為英語
selinux --enforcing  # 啟用SElinux
skipx  # 跳過X window 配置
logging --level=info  #安裝過程日志級别為info
reboot  # 安裝完成後重新開機
timezone --isUtc Asia/Shanghai # 設定時區為亞洲上海,使用UTC時間
network --onboot yes --bootproto dhcp --noipv6 # 啟用DHCP網絡
bootloader --location=mbr  # 安裝bootloader到MBR
zerombr  # 清除MBR
clearpart --all --initlabel # 清楚所有分區,并初始化
part /boot --fstype=ext4 --size=500 # 分區,并啟用LVM
part pv.008002 --grow --size=1
volgroup VolGroup --pesize=4096 pv.008002
logvol / --fstype=ext4 --name=lv_root --vgname=VolGroup --size=102400
logvol swap --fstype=swap --name=lv_swap --vgname=VolGroup --recommended
           

配置Default檔案

在pxelinux.cfg目錄下,建立的預設檔案default可以使用鏡像檔案中的isolinux.cfg檔案來作為模版,該啟動菜單非常重要。

配置參數解釋:

ksdevice:是用來指定使用那塊網卡,因為伺服器可能存在多塊網卡,無人值守會卡在這裡。

repo:是指定安裝鏡像的URL,如果沒有,就會出現選擇界面,必須手工處理。

ip:可以指定網卡自動擷取ip,還是使用固定ip,如果使用固定ip則必須将其寫入到配置檔案中去。

ks: 用來指定ks.cfg檔案的URL.

default vesamenu.c32 
timeout 30 
menu background splash.jpg 
menu title Welcome to PXE CentOS-6.4-x86_64! 
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 linux 
menu label ^ Install or upgrade CentOS 6.5 
menu default
kernel vmlinuz  #如果在TFTP的根目錄下可以直接寫檔案名,否則需要寫絕對路徑。 
append initrd=initrd.img ksdevice=eth1 repo=ftp://10.61.202.2/pub/centos6 ip=dhcp ks=ftp://10.61.202.2/pub/ks.cfg
label linux 
menu label ^ Install CentOS 7.0  
kernel vmlinuz 
append initrd=initrd.img ksdevice=eth1 repo=ftp://10.61.202.2/pub/centos7 ip=dhcp ks=ftp://10.61.202.2/pub/ks.cfg
           

跨VPC的自定義OS的自動化安裝

每一台黑石實體機在傳遞時,均已落入到某一個VPC下的某個子網,如果待安裝作業系統的伺服器與PXE server位于不同的VPC,則需要首先對DHCP server進行網卡和路由的配置。如下圖所示

通過PXE自動化安裝自定義OS

利用黑石雲API在客戶機所在的VPC内建立子網,并且指定子網的vlanId。

from src.QcloudApi.qcloudapi import QcloudApi
module = 'vpc'
action = 'CreateBmSubnet'
config = {
    'Region': 'sh',
    'secretId': '你賬戶的secretId',
    'secretKey': '你賬戶的secretKey',
    'method': 'get'
}
params = {
    "vpcId": "sh_vpc_1026",  #建立的子網所在的VPC的vpcId
    "unVpcId": "vpc-p83g7nv7", #建立的子網所在的VPC的unVpcId
    'subnetSet.0.subnetName': 'VM-test-pxe1', #建立的子網的名稱
    'subnetSet.0.cidrBlock': '10.1.5.0/24',  #建立的子網IP
    'vlanId': 2098 #建立的子網的VlanId
}
service = QcloudApi(module, config)
service.generateUrl(action, params)
print service.call(action, params)
           

注意:如果所建立的子網需要配置設定IP給虛拟機,則需要将VlanId設定在2000-2999之間。

6.2 在建立好的子網中申請黑石實體機vlan網卡待使用的IP。

from src.QcloudApi.qcloudapi import QcloudApi
module = 'vpc'
action = 'ApplyIps'
config = {
    'Region': 'sh',
    'secretId': '你賬戶的secretId',
    'secretKey': '你賬戶的secretkey',
    'method': 'get'
}
params = {
	"vpcId": "sh_vpc_1026", #子網所在的VPC的ID
	"subnetId": "sh_subnet_497", #申請的I平所在的子網ID
	"count": 2, #申請IP個數,預設為1,取值範圍1-20。
	"ipClass": 1 #IP類型,0為實體機IP,1為虛拟機類型IP,2為托管類型IP。預設傳1
	
}
service = QcloudApi(module, config)
service.generateUrl(action, params)
print service.call(action, params)
           

6.3 使用黑石API将黑石實體機加入到提前申請好的子網中。

from src.QcloudApi.qcloudapi import QcloudApi
module = 'vpc'
action = 'CreateBmInterface'
config = {
    'Region': 'sh',
    'secretId': '你賬戶的secretId',
    'secretKey': '你賬戶的secretKey',
    'method': 'get'
}
params = {
	"vpcId": "sh_vpc_1026", 
	"subnetId": 497,    
	"instanceIds.0": "cpm-7m316cuf" 
}
service = QcloudApi(module, config)
service.generateUrl(action, params)
print service.call(action, params)
           

6.4 修改bond1的配置檔案并添加bond1.xxxx虛拟vlan網卡(其中xxxx表示的是vlanId), 配置相應的IP和網關。

nano /etc/sysconfig/network-scripts/ifcfg-bond1

DEVICE=bond1
ONBOOT=yes
BOOTPROTO=none
USERCTL=no
BONDING_OPTS="mode=4 miimon=100"
IPV6INIT=no
TYPE=Unknown
NM_CONTROLLED=no
IPADDR='10.61.202.2'
NETMASK='255.255.255.0'
GATEWAY='10.61.202.1'

nano /etc/sysconfig/network-scripts/ifcfg-bond1.xxxx
DEVICE=bond1.xxxx
ONBOOT=yes
BOOTPROTO=none
USERCTL=no
BONDING_OPTS="mode=4 miimon=100"
IPV6INIT=no
VLAN=yes
TYPE=Unknown
NM_CONTROLLED=no
IPADDR='10.1.5.4'
NETMASK='255.255.255.0'
           

6.5删除幾個多餘的網段路由 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 100.64.0.0/16, 保留一個預設的路由0.0.0.0網關設定為bond1對應的那個VPC的網關。

6.6 新的VPC需要通路的網段,通過明細路由指定,網關為相應的網關,裝置為bond1.xxxx。

nano /etc/sysconfig/network-scripts/ifcfg-bond1.xxxx
10.1.0.0/24 via 10.1.5.5 dev bond1.xxxx
           

6.7 驗證DHCP server是否可與待安裝OS的伺服器ping通。

7. 伺服器網絡配置

伺服器通過PXE安裝好自定義OS之後,需要對其進行重新的網絡配置,包括内網IP配置,雙網卡綁定等。

1. 在進行PXE安裝OS時,DHCP Server會為實體機随機配置設定一個IP位址,是以在安裝完OS後,必須重新配置IP,并與黑石傳遞時的IP相同,唯有此才可以通過公網IP通路該實體機。

2. 建議通過将兩個實體網卡綁定為邏輯網卡,可以實作負載均衡等特性,配置方法如下。

#IP Config for bond1:
DEVICE=bond1 #雙網卡綁定的邏輯端口名
ONBOOT=yes
BOOTPROTO=none
USERCTL=no
BONDING_OPTS="mode=4 miimon=100"
IPV6INIT=no
TYPE=Unknown
NM_CONTROLLED=no
IPADDR='10.61.202.2' #必須是黑石實體機互動時配置設定的内網IP
NETMASK='255.255.255.0'
GATEWAY='10.61.202.1'
#IP Config for eth0:
DEVICE=eth0
BOOTPROTO=none
ONBOOT=yes
HOTPLUG=no
MASTER=bond1
NM_CONTROLLED=no
USERCTL=no
SLAVE=yes
#IP Config for eth1:
DEVICE=eth1
BOOTPROTO=none
ONBOOT=yes
HOTPLUG=no
MASTER=bond1
NM_CONTROLLED=no
USERCTL=no
SLAVE=yes
           

8. 對子網開啟DHCP RELAY

8.1 建立子網時開啟DHCP RELAY

在使用PXE來實作自定義OS自動化安裝時,并需将待安裝作業系統的黑石實體伺服器所在子網開啟DHCP RELAY的功能。首先在建立子網時必須建立好VPC,并且子網綁定VLANID,預設為5.虛拟機子網VLANID取值範圍為2000-2999.

from src.QcloudApi.qcloudapi import QcloudApi 
module = 'vpc' 
action = 'CreateBmSubnet' 
config = { 
'Region': 'sh', 
'secretId': '你賬戶的密鑰id', 
'secretKey': '你賬戶的密鑰Key', 
'method': 'get' 
} 
params = { 
"unVpcId": "vpc-g0knn9rl", ##子網所在的VPC的id 
'vpcId': 'sh_vpc_100011', 
'subnetSet.0.subnetName': 'test-pxe-install', ##所建立的子網的名字 
'subnetSet.0.cidrBlock': '10.61.200.0/24', ##所建立的子網的網段 
'vlanId': 5, 
'dhcpEnable': 1, #該參數為1表示該子網開啟DHCP,為0表示該子網關閉DHCP。 
'dhcpServerIP.0': '10.61.201.2', #該參數表示DHCP server的IP位址 
'ipReserve': 5 #該參數表示該子網預留的可配置設定的IP的個數。 
} 
service = QcloudApi(module, config) 
service.generateUrl(action, params) 
print service.call(action, params) 
           

8.2 對現有子網時開啟DHCP RELAY

如果待安裝作業系統的黑石實體伺服器已經綁定在某個子網中,可以通過騰訊雲API對子網設定,開啟DHCP RELAY。 

from src.QcloudApi.qcloudapi import QcloudApi 
module = 'vpc' 
action = 'ModifySubnetDhcpRelayFlag' 
config = { 
'Region': 'sh', 
'secretId': '你賬戶的密鑰id', 
'secretKey': '你賬戶的密鑰Key', 
'method': 'get' 
} 
params = { 
"vpcId": "sh_vpc_1026", 
"subnetId": 497, 
'dhcpEnable': 1, 
'dhcpServerIP.0': '10.61.201.2', 
'ipReserve': 5 
} 
service = QcloudApi(module, config) 
service.generateUrl(action, params) 
print service.call(action, params)
           

繼續閱讀