生產大規模部署之PXE自動安裝linux系統
1. PXE安裝原理和流程介紹
在安裝RedHat Linux的過程中,允許通過NFS、HTTP或FTP協議來進行網路安裝。但是在一般情況下我們需要有一個安裝引導介質(引導光碟、引導軟盤、U盤等),有沒有一種方法不通過引導光碟方式來安裝呢,而直接通過網路來進行安裝?答案是有,即通過kickstart + pxe技術來實現。
1.1 什麼是Kickstart
KickStart是一種無人職守安裝方式。KickStart的工作原理是通過記錄典型的安裝過程中所需人工干預填寫的各種引數,並生成一個名為ks.cfg的檔案;在其後的安裝過程中(不只侷限於生成KickStart安裝檔案的機器)當出現要求填寫引數的情況時,安裝程式會首先去查詢KickStart生成的檔案,當找到合適的引數時,就採用找到的引數,當沒有找到合適的引數時,才需要安裝者手工干預。這樣,如果KickStart檔案涵蓋了安裝過程中出現的所有需要填寫的引數時,安裝者完全可以只告訴安裝程式從何處取ks.cfg檔案,然後去忙自己的事情。等安裝完畢,安裝程式會根據ks.cfg中設定的重啟選項來重啟系統,並結束安裝。
1
1.1
1.2 什麼是PXE
嚴格來說,PXE 並不是一種安裝方式,而是一種引導的方式。進行 PXE 安裝的必要條件是要安裝的計算機中包含一個 PXE 支援的網絡卡(NIC),即網絡卡中必須要有 PXE Client。PXE (Pre-boot Execution Environment)協議使計算機可以通過網路啟動。協議分為 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。PXE Client 通過 TFTP 協議到 TFTP Server 上下載所需的檔案。
1.3 kickstart+pxe網路安裝OS流程
第一步:PXE Client向DHCP傳送請求
首先,將支援PXE的網路介面卡(NIC)的客戶端的BIOS設定成為網路啟動,通過PXE BootROM(自啟動晶片)會以UDP(簡單使用者資料報協議)傳送一個廣播請求,向網路中的DHCP伺服器索取IP地址等資訊。
第二步:DHCP伺服器提供資訊
DHCP伺服器收到客戶端的請求,驗證是否來至合法的PXE Client的請求,驗證通過它將給客戶端一個“提供”響應,這個“提供”響應中包含了為客戶端分配的IP地址、pxelinux啟動程式(TFTP)位置,以及配置檔案所在位置。
第三步:PXE客戶端請求下載啟動檔案
客戶端收到伺服器的“迴應”後,會迴應一個幀,以請求傳送啟動所需檔案。這些啟動檔案包括:pxelinux.0、pxelinux.cfg/default、vmlinuz、initrd.img等檔案。
第四步:Boot Server響應客戶端請求並傳送檔案
當伺服器收到客戶端的請求後,他們之間之後將有更多的資訊在客戶端與伺服器之間作應答, 用以決定啟動引數。BootROM 由 TFTP 通訊協議從Boot Server下載啟動安裝程式所必須的檔案(pxelinux.0、pxelinux.cfg/default)。default檔案下載完成後,會根據該檔案中定義的引導順序,啟動Linux安裝程式的引導核心。
第五步:請求下載自動應答檔案
客戶端通過pxelinux.cfg/default檔案成功的引導Linux安裝核心後,安裝程式首先必須確定你通過什麼安裝介質來安裝linux,如果是通過網路安裝(NFS, FTP, HTTP),則會在這個時候初始化網路,並定位安裝源位置。或許你會說,剛才PXE不是已經獲取過IP地址了嗎?為什麼現在還需要一次?這是由於PXE獲取的是安裝用的核心以及安裝程式等,而安裝程式要獲取的是安裝系統所需的二進位制包以及配置檔案。由於它們需要的內容不同造成PXE模組和安裝程式是相對獨立的,PXE的網路配置並不能傳遞給安裝程式。從而進行兩次獲取IP地址過程。
接著會讀取該檔案中指定的自動應答檔案ks.cfg所在位置,根據該位置請求下載該檔案。
第六步:客戶端安裝作業系統
將ks.cfg檔案下載回來後,通過該檔案找到OS Server,並按照該檔案的配置請求下載安裝過程需要的軟體包。
OS Server和客戶端建立連線後,將開始傳輸軟體包,客戶端將開始安裝作業系統。安裝完成後,將提示重新引導計算機。這個時候注意,在重新引導的過程中一定要將BIOS修改回從硬碟啟動,不然的話又會重複的自動安裝作業系統。
在上面介紹中PXE client是需要安裝Linux的計算機,TFTP Server、DHCP Server和NFS Server執行在另外一臺Linux Server上。Bootstrap檔案、配置檔案、Linux核心都放置在Linux Server上TFTP伺服器的根目錄下。而Linux根檔案系統存放於NFS Server的共享目錄中。
PXE client在工作過程中,需要三個二進位制檔案:bootstrap、Linux 核心和Linux根檔案系統。Bootstrap檔案是可執行程式,它向用戶提供簡單的控制介面,並根據使用者的選擇,下載合適的Linux核心以及Linux根檔案系統。
1.4 kickstart優勢
l 標準化自動化的安裝
l 快速大量的裸機部署
l 強制建立的一致性(軟體包,分割槽,配置,監控,安全性)
l 減少人為的部署失誤
2. 安裝要求l 網路安裝伺服器:需關閉iptables 和Selinux
l 網路安裝伺服器:需安裝Dhcp TFTPNFS VSFTPD服務
l 客戶機:網絡卡需要有pxe功能,現在pc server都會有這個功能
3. 配置過程 配置PXE安裝,要進行如下步驟:
l 配置DHCP,用於給客戶端提供IP地址及其它資訊
l 配置TFTP伺服器,用於提供客戶端PXE引導所必須的檔案
l 配置NFS伺服器,用於存放安裝樹
l 配置VSFTPD伺服器,用於存放kickstart檔案(使用NFS的話此步可跳過)
l 配置Kickstart,用於自動應答安裝
l 使用PXE功能引導客戶機
2
3
3.1 DHCP和TFTP的安裝與配置
在PXE引導安裝過程中,PXE客戶端通過DHCP獲取PXE伺服器地址,PXE引導檔名稱;然後客戶機在使用TFTP協議從TFTP伺服器下載引導檔案並執行,從而啟動計算機安裝程式。引導檔案執行後,接著下載安裝程式啟動安裝。
安裝DHCP軟體包
[[email protected] PXE-TEST Packages]# rpm -ivh dhcp-4.1.1-38.P1.el6.x86_64.rpm
Preparing... ########################################### [100%]
1:dhcp ########################################### [100%]
配置DHCP
接下來我們需要配置相關資訊。為了滿足我們的安裝需求,假設PXE伺服器、DHCP伺服器、TFTP伺服器全部安裝在一臺為192.168.6.1的計算機上。我們需要進行如下操作:
(1)修改/etc/dhcpd/dhcpd.conf'檔案,指定 IP 地址等資訊。
(2)在 '''/etc/dhcpd/dhcpd.conf''' 中增加 tftp-server 需要推送給客戶端的啟動檔案(bootstrap):filename "pxelinux.0";因為 tftp 的預設目錄是 /tftpboot,所以檔案的絕對路徑就是: /tftpboot/pxelinux.0";當然也可以指定為其它的路徑。
(3)range dynamic-bootp指定客戶端自動獲取ip的範圍
(4)另外需要指定 next-server 引數,告訴客戶端在獲取到 pxelinux.0 檔案之後去哪裡獲取其餘的啟動檔案: next-server 192.168.6.1;
最終的配置檔案結果如下所示:
ddns-update-style interim;
#dhcpd服務的全域性設定,缺少此項服務無法啟動。
ignore client-updates;
# ignore client-updates為忽略客戶端更新
subnet 192.168.6.0 netmask 255.255.255.0 {
range dynamic-bootp 192.168.6.180 192.168.6.195;
default-lease-time 21600;
max-lease-time 43200;
filename "pxelinux.0";
next-server 192.168.6.1;
}
#subnet宣告一個dhcp地址範圍,ip為網路地址,子網掩碼必須寫成255.255.255.0
#range dynamic-bootp 設定客戶機獲取IP地址的範圍
#default-lease-time為客戶機獲取網路引數的預設租約時間
#max-lease-time 為客戶機獲取網路引數之後的最大租約時
#filename需要推送給客戶端的啟動檔案pxelinux.0
#next-server 引數,告訴客戶端在獲取到 pxelinux.0 檔案之後去哪裡獲取其餘的啟動檔案
配置完成後,重啟DHCP服務,並將它設為開機自啟動。
[[email protected] PXE-TEST Packages]# /etc/init.d/dhcpd start
啟動 dhcpd: [確定]
[[email protected] PXE-TEST Packages]# chkconfig --level 35 dhcpd on
3.2 安裝配置TFTP伺服器
在PXE安裝過程中,客戶機在使用TFTP協議從TFTP伺服器下載引導檔案並執行。我們主要通過配置TFTP伺服器和PXE的引導配置完成這個過程。
(1)安裝配置TFTP伺服器
首先,安裝TFTP伺服器軟體包:
[[email protected] PXE-TEST Packages]# rpm -ivh tftp-server-0.49-7.el6.x86_64.rpm
Preparing... ########################################### [100%]
1:tftp-server ########################################### [100%]
(2)配置tftp服務
tftp 服務由xinetd服務管理。編輯 '''/etc/xinetd.d/tftp''' 檔案,將 '''disable = yes''' 改為:disable = no,server_args改為相應的目錄。
[[email protected] PXE-TEST Packages]# vi /etc/xinetd.d/tftp
# default: off
# description: The tftp server serves files using the trivial file transfer \
# protocol. The tftp protocol is often used to boot diskless \
# workstations, download configuration files to network-aware printers, \
# and to start the installation process for some operating systems.
service tftp
{
socket_type = dgram
protocol = udp
wait = yes
user = root
server = /usr/sbin/in.tftpd
server_args = -s /tftpboot
disable = no
per_source = 11
cps = 100 2
flags = IPv4
}
從這裡看出,預設選擇/tftpboot為TFTP伺服器的根目錄位置,配置完成後重啟xinetd服務,使TFTP伺服器生效。
[[email protected] PXE-TEST Packages]# /etc/init.d/xinetd restart
可以通過下面命名檢視tftp埠是否開啟:
[root()@PXE-TEST ftp]# lsof -i:69
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
xinetd 3139 root 5u IPv4 30170 0t0 UDP *:tftp
3.3 PXE引導配置(bootstrap)
PXE啟動映像檔案由syslinux軟體包提供,RedHat Enterprise Linux光碟中已提供。
syslinux是一個功能強大的引導載入程式,而且相容各種介質。更加確切地說:SYSLINUX是一個小型的Linux作業系統,它的目的是簡化首次安裝Linux的時間,並建立修護或其它特殊用途的啟動盤。我們只要安裝了syslinux,就會生成一個pxelinux.0,將 pxelinux.0 這個檔案複製到 '''/tftpboot''' 目錄即可:
[[email protected] PXE-TEST Packages]# rpm -ql syslinux |grep "pxelinux.0"
/usr/lib/syslinux/pxelinux.0
[[email protected] PXE-TEST Packages]# cp /usr/lib/syslinux/pxelinux.0 /tftpboot/
如果沒有安裝syslinux,掛載光碟映象也可以從isolinux目錄中找到該檔案。
3.4 用於網路啟動的核心檔案
將 RedHat 安裝光碟目錄中的 '''images/pxeboot/{vmlinuz,initrd.img}''' 啟動檔案複製到某個安裝目錄/tftpboot。如果使用圖形介面引導安裝(目前使用此種辦法),還需要將splash.jpg和vesamenu.c32也一起復制到/tftpboot/。
由於多個客戶端可以從一個PXE伺服器引導,PXE引導映像使用了一個複雜的配置檔案搜尋方式來查詢針對客戶機的配置檔案。如果客戶機的網絡卡的MAC地址為'''88:99:AA:BB:CC:DD''',對應的IP地址為192.168.1.195,那麼客戶機首先嚐試以MAC地址為檔名匹配的配置檔案,如果不存在就以IP地址來查詢。根據上述環境針對這臺主機要查詢的以一個配置檔案就是 /tftpboot/pxelinux.cfg/01-88-99-aa-bb-cc-dd。如果該檔案不存在,就會根據IP地址來查詢配置檔案了,這個演算法更復雜些,PXE映像查詢會根據IP地址16進制命名的客戶機配置檔案。例如:192.168.1.195對應的16進位制的形式為C0A801C3。(可以通過syslinux軟體包提供的gethostip命令將10進位制的IP轉換為16進位制)
如果C0A801C3檔案不存在,就嘗試查詢C0A801C檔案,如果C0A801C也不存在,那麼就嘗試C0A801檔案,依次類推,直到查詢C檔案,如果C也不存在的話,那麼最後嘗試default檔案。
總體來說,pxelinux 搜尋的檔案的順序是:
/tftpboot/pxelinux.cfg/01-88-99-aa-bb-cc-dd
/tftpboot/pxelinux.cfg/ C0A801C3
/tftpboot/pxelinux.cfg/ C0A801C
/tftpboot/pxelinux.cfg/ C0A801
/tftpboot/pxelinux.cfg/ C0A80
/tftpboot/pxelinux.cfg/ C0A8
/tftpboot/pxelinux.cfg/ C0A
/tftpboot/pxelinux.cfg/ C0
/tftpboot/pxelinux.cfg/C
/tftpboot/pxelinux.cfg/default
對於一臺需要支援很多安裝機器的安裝伺服器來說,將配置寫在與IP地址對應的檔案裡很不靈活。把所有配置都集中在default檔案中是個不錯的主意,可以減輕配置檔案維護負擔。接下來建立/tftpboot/pxelinux.cfg/ 目錄,該目錄用於存放客戶端的配置檔案。
[[email protected] PXE-TEST Packages]# mkdir /tftpboot/pxelinux.cfg
將光碟中的isolinux/isolinux.cfg檔案複製為/tftpboot/pxelinux.cfg/default
[[email protected] PXE-TEST Packages]# cp /media/isolinux/isolinux.cfg /tftpboot/pxelinux.cfg/default
檢視default檔案內容:
以下內容根據原檔案略加修改並做了註釋(注:該檔案中的空行和以 '''#''' 開頭的行都將被忽略)
#設定所要載入的選單模組default vesamenu.c32
default vesamenu.c32
# 顯示 'boot: ' 提示符。為 '0' 時則不提示,將會直接啟動 'default' 引數中指定的內容。
prompt 1
# 在使用者輸入之前的超時時間,單位為 1/10 秒。
timeout 60
#顯示某個檔案的內容,注意檔案的路徑。預設是在 /tftpboot 目錄下。也可以指定路徑+檔名。
display boot.msg
#menu可以設定背景、標題、歡迎畫面等
# 'label' 指定你在 'boot:' 提示符下輸入的關鍵字。
# 比如:
# boot: linux[ENTER]
# 這個會啟動 'label linux' 下標記的 kernel 和 initrd.img 檔案。
# 這裡還定義了其它幾個關鍵字:
# boot: text
# boot: ks
# kernel 引數指定要啟動的核心。同樣要注意路徑,預設是 /tftpboot 目錄。
# append 指定追加給核心的引數,能夠在 gurb 裡使用的追加給核心的引數,在這裡也都可以使用。
# 使用 kickstart 安裝:可以在 ks 引數後直接指定 kickstart 檔案的位置。
下面是具體的配置範例,指定了多個label可供選擇,如果有多個版本或者多個定製化的ks指令碼,可以按需配置。
default vesamenu.c32
#prompt 1
timeout 6000
display boot.msg
menu background splash.jpg
menu title Welcome to redhat6.5 !
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 redhat6.5 for Oracle
menu label ^Redhat6.5 for Oracle
menu default
kernel vmlinuz
append initrd=initrd.img ksdevice=em1 ks=ftp://192.168.6.1/redhat6_5.cfg
#此處ksdevice指定從哪個網絡卡獲取配置檔案進行安裝,由於伺服器一般是兩個以上的網絡卡,#不配置此項會在安裝時讓你指定網絡卡,不夠自動化。
#ks檔案此處我使用FTP方式獲取,也可以使用nfs
label VMWARE redhat6.5 for Oracle
menu label ^VMWARE Redhat6.5 for Oracle
menu default
kernel vmlinuz
append initrd=initrd.img ksdevice=eth0 ks=ftp://192.168.6.1/redhat6_5_VM.cfg
label vesa
menu label Install system with ^basic video driver
kernel vmlinuz
append initrd=initrd.img xdriver=vesa 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 –
3.5 安裝配置NFS伺服器
安裝介質儲存在伺服器上的一個目錄中,可以使用各種網路協議訪問它,比如 HTTP,FTP,和NFS。也就是我們前面提到的OS Server。這裡使用 NFS 服務來提供安裝介質,只需要將系統光碟內容拷貝放到共享目錄下即可。
建立共享目錄,並將光碟內容拷貝到共享目錄中:
[[email protected] PXE-TEST Packages]#mkdir /home/redhat6.5
[[email protected] PXE-TEST Packages]#cp–a /media/* /home/redhat6.5
安裝NFS並將共享目錄釋出出去
[[email protected] PXE-TEST Packages]# vi /etc/exports
/home/redhat6.5 *(ro,sync)
重啟服務使配置生效。
[[email protected] PXE-TEST Packages]# service portmap restart
停止 portmap: [確定]
啟動 portmap: [確定]
[[email protected] PXE-TEST Packages]# service nfs start
啟動 NFS 服務: [確定]
關掉 NFS 配額: [確定]
啟動 NFS 守護程序: [確定]
啟動 NFS mountd: [確定]
檢查是否被正確共享:
[[email protected] PXE-TEST Packages]# shoumount –e locahost
Export list for localhost:
/home/redhat6.5 *
[[email protected] PXE-TEST Packages]# chkconfig --level 35 nfs on
3.6 配置VSFTPD
(1) 安裝VSFTPD軟體包
[[email protected] PXE-TEST Packages]# rpm -ivh vsftpd-2.2.2-11.el6_4.1.x86_64.rpm
Preparing... ########################################### [100%]
1:vsftpd ########################################### [100%]
(2) 配置VSFTPD服務
需要將/etc/vsftpd/user_list和/etc/vsftpd/ftpusers檔案中的root的註釋掉,即允許root使用ftp服務:
cat >> /etc/vsftpd/user_list << END
#root
bin
daemon
adm
lp
sync
shutdown
halt
news
uucp
operator
games
nobody
END
cat >> /etc/vsftpd/ftpusers << END
#root
bin
daemon
adm
lp
sync
shutdown
halt
news
uucp
operator
games
nobody
END
重啟服務使配置生效。
service vsftpd restart
3.7 配置Kickstart安裝
通常,我們在安裝作業系統的過程需要大量的人機互動過程,減少互動過程,為了提高安裝效率Red Hat Linux 開始支援一個稱為 kickstart 的功能。使用這種方法,只需事先定義好一個Kickstart自動應答配置檔案(通常存放在安裝伺服器上),並讓安裝程式知道該配置檔案的位置,在安裝過程中安裝程式就可以自己從該檔案中讀取安裝配置,這樣就避免了繁瑣的人機互動,實現無人值守的自動化安裝。
建立kickstart配置檔案有兩種方式:
(一) 文字編輯器編輯生成
(二) 用圖形化介面配置:system-config-kickstat(需要安裝相應的rpm包)
無論使用哪種方法無非就是建立一個應答檔案,當你安裝好一臺Red Hat Linux機器,Red Hat Linux 安裝程式都會建立一個 kickstart 配置檔案,記錄你的真實安裝配置。如果你希望實現和某系統類似的安裝,可以基於該系統的kickstart配置檔案來生成你自己的kickstart配置檔案。該檔案位於/root/anaconda-ks.cfg。
這裡我直接使用該檔案,拷貝本檔案到/mnt/install下。
[[email protected] PXE-TEST Packages]# cp /root/anaconda-ks.cfg /var/ftp/redhat6_5.cfg
下面以配置檔案為例,
# Kickstart file automatically generated by anaconda.
#version=DEVEL
install
nfs --server=192.168.6.1 --dir=/home/redhat6.5
#配置安裝方式,這裡是使用nfs,目錄是之前在nfs配置的共享
lang en_US.UTF-8
keyboard us
#選擇安裝時的語言和鍵盤語言
network --onboot yes --device em1 --mtu=1500 --bootproto dhcp
network --onboot no --device em2 --noipv4 --noipv6
#network --onboot no --device eth2 --noipv4 --noipv6
#network --onboot no --device eth3 --noipv4 --noipv6
#設定網絡卡的引數,目前只將前兩個網口設定為開機啟動
rootpw --iscrypted $6$8jLMp4aLQTmSrt9.$CWm0edJcHknIboEz2mjNJr6397zsZ4CCzqDJVH3JIwQJvjHsPNo8cvFEr76X6ah2Zx1xT1l01D1470rQ58gp7.
#設定root密碼,這個是加密過的,明文為111111
# Reboot after installation
reboot
#安裝完自動重啟
firewall –disabled
#關閉防火牆
authconfig --useshadow --passalgo=sha512
#設定密碼認證的加密方式
selinux –disabled
#關閉selinux
timezone Asia/Shanghai
#選擇時區
bootloader --location=mbr --driveorder=sda --append=" rhgb crashkernel=auto quiet"
#選擇bootloader程式的存放位置
zerombr yes
#清除mbr
# 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 –initlabel
#清除所有分割槽
part /boot --fstype=ext4 --size=103
part / --fstype=ext4 --size=30000
part /u01 --fstype=ext4 --size=30000
part swap --size=20000
part /home --fstype=ext4 --size=10000
part /u02 --fstype=ext4 --grow --size=1
#分割槽方式寫死,boot 103M,根分割槽30G,u01 30G,swap 16G,home 10G,u02使用剩#餘#空間
repo --name="Red Hat Enterprise Linux" --baseurl=nfs:192.168.6.1:/home/redhat6.5 --cost=100
#設定軟體包安裝源
%packages
@additional-devel
@base
@client-mgmt-tools
@compat-libraries
@console-internet
@core
@debugging
@basic-desktop
@desktop-platform-devel
@development
@hardware-monitoring
@large-systems
@legacy-x
@network-file-system-client
@network-tools
@performance
@perl-runtime
@server-policy
@system-admin-tools
@x11
httpd-devel
pcre-devel
libcap-devel
libXinerama-devel
openmotif-devel
net-snmp-devel
libgudev1-devel
kdelibs-apidocs
xz-devel
libtopology-devel
freeglut-devel
kdegraphics-devel
libibverbs-devel
libuuid-devel
kdepimlibs-devel
libblkid-devel
papi-devel
libXmu-devel
unique-devel
xorg-x11-proto-devel
gmp-devel
kdepim-devel
sane-backends-devel
perl-Test-Pod
kdemultimedia-devel
startup-notification-devel
libudev-devel
cups-devel
gstreamer-plugins-base-devel
unixODBC-devel
tcl-devel
numactl-devel
libgnomeui-devel
libbonobo-devel
perl-Test-Pod-Coverage
libtiff-devel
junit
SDL-devel
libXau-devel
tcp_wrappers-devel
PyQt4-devel
kdenetwork-devel
kdelibs-devel
libgcrypt-devel
popt-devel
gnome-python2-desktop
hunspell-devel
iptables-devel
libdrm-devel
libXrandr-devel
snappy-devel
libxslt-devel
kdebase-devel
tk-devel
libnl-devel
libXpm-devel
mpfr-devel
expat-devel
e2fsprogs-devel
kdebase-workspace-devel
libglade2-devel
libaio-devel
libusb-devel
gnutls-devel
kdesdk-devel
fuse-devel
libXaw-devel
libhugetlbfs-devel
mtools
pax
python-dmidecode
sgpio
device-mapper-persistent-data
systemtap-client
tigervnc-server
desktop-file-utils
systemtap-sdt-devel
dejagnu
ElectricFence
ant
libstdc++-docs
gcc-gnat
expect
mod_dav_svn
perltidy
cmake
imake
babel
ksc
kdewebdev
rpmdevtools
compat-gcc-34
systemtap-server
cvs-inetd
gcc-java
compat-gcc-34-g77
jpackage-utils
bzr
mercurial
chrpath
gcc-objc
rpmlint
gcc-objc++
compat-gcc-34-c++
python-docs
nasm
xorg-x11-twm
openmotif
xorg-x11-fonts-ISO8859-1-75dpi
xterm
xorg-x11-fonts-cyrillic
xorg-x11-xdm
xorg-x11-fonts-ISO8859-9-100dpi
xorg-x11-fonts-ISO8859-14-100dpi
xorg-x11-fonts-75dpi
xorg-x11-fonts-ISO8859-9-75dpi
libXmu
xorg-x11-fonts-ISO8859-15-75dpi
libXp
openmotif22
xorg-x11-fonts-ISO8859-14-75dpi
xorg-x11-fonts-ISO8859-2-75dpi
xorg-x11-fonts-ethiopic
xorg-x11-fonts-ISO8859-2-100dpi
iptraf
papi
perl-DBD-SQLite
screen
expect
lsscsi
-mcelog
%end
#從%post到%end之間的部分是定製的軟體包
%post --interpreter=/bin/bash
#開始安裝後腳本,使用bash shell
#1.configure network bonding
#首先設定網絡卡bonding
/bin/cat > /etc/sysconfig/network-scripts/ifcfg-bond0 <<EOF
DEVICE=bond0
IPADDR=`ifconfig em1 | sed -e 's/^.*addr:\([^ ]*\).*/\1/p' -e d`
NETMASK=`ifconfig em1|sed -e 's/^.*Mask:\([^ ]*\)$/\1/p' -e d`
GATEWAY=`netstat -rn|grep em1|awk '{print $2}' | grep -v 0.0.0.0`
ONBOOT=yes
BOOTPROTO=none
USERCTL=no
EOF
#Modify the /etc/sysconfig/networ-scripts/ifcfg-em1
/bin/cat > /etc/sysconfig/network-scripts/ifcfg-em1 <<EOF
DEVICE=em1
BOOTPROTO=none
ONBOOT=yes
MASTER=bond0
SLAVE=yes
USERCTL=no
EOF
#Modify the /etc/sysconfig/networ-scripts/ifcfg-em2
/bin/cat > /etc/sysconfig/network-scripts/ifcfg-em2 <<EOF
DEVICE=em2
BOOTPROTO=none
ONBOOT=yes
MASTER=bond0
SLAVE=yes
USERCTL=no
EOF
echo "alias bond0 bonding" > /etc/modprobe.d/bond0.conf
echo "options bond0 miimon=100 mode=1" >> /etc/modprobe.d/bond0.conf
ifconfig bond0 down
ifconfig bond0 up
#2.stop NetWorkManager service
/etc/init.d/NetworkManager stop
chkconfig NetworkManager off
/etc/init.d/network restart
#3.configure DNS
#Modify the /etc/resolv.conf
#修改dns配置
> /etc/resolv.conf
#4.Modify swap config file
#修改swap配置
echo "vm.swappiness=0" >> /etc/sysctl.conf
#5.add ntp params
#配置時間同步引數
> /etc/sysconfig/ntpd
cat >> /etc/sysconfig/ntpd << END
OPTIONS="-x -u ntp:ntp -p /var/run/ntpd.pid"
END
#配置ntpd服務(以橫浜機房為例)
/bin/cat > /etc/ntp.conf <<EOF
restrict default nomodify notrap noquery
restrict 127.0.0.1
server ntp-hb1.99bill.com iburst prefer
server ntp-hb2.99bill.com iburst
server ntp-idx1.99bill.com iburst
server ntp-idx2.99bill.com iburst
server 127.127.1.0 # local clock
fudge 127.127.1.0 stratum 10
driftfile /var/lib/ntp/drift
broadcastdelay 0.008
keys /etc/ntp/keys
logconfig =all
EOF
#增加開機自動同步時間(以橫浜機房為例)
/bin/cat >> /etc/rc.local <<EOF
ntpdate 172.16.50.181
EOF
#6.enable sar for per minutes record
#sar記錄頻率設定為分鐘級
> /etc/cron.d/sysstat
cat >> /etc/cron.d/sysstat << END
# run system activity accounting tool every 10 minutes
*/1 * * * * root /usr/lib64/sa/sa1 1 1
# generate a daily summary of process accounting at 23:53
53 23 * * * root /usr/lib64/sa/sa2 -A
END
#將sar記錄保留時間修改為1個月
#keep sar record for 1 month
sed -i 's/HISTORY=7/HISTORY=30/g' /etc/sysconfig/sysstat
#7.create oracle users and groups
#建立oracle使用者及相關組
groupadd oinstall
groupadd dba
groupadd oper
groupadd asmadmin
useradd -g oinstall -G dba,oper,asmadmin oracle
passwd oracle << EOF
oracle
oracle
EOF
#8.configure oracle entervironment
#修改oracle安裝的核心限制
#--8.1 modify sysctl.conf
cat >> /etc/sysctl.conf << END
kernel.shmmni = 4096
kernel.sem = 2048 65536 1024 256
fs.file-max = 6815744
fs.aio-max-nr = 1048576
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576
END
sysctl -p
#--8.2 modify linux shell limit
#修改shell限制
>/etc/security/limits.conf
cat >> /etc/security/limits.conf << END
oracle soft nproc 65536
oracle hard nproc 65536
oracle soft nofile 65536
oracle hard nofile 65536
oracle - memlock unlimited
END
#--8.3 modify login pam
#增加pam模組
cat >> /etc/pam.d/login << END
session required pam_limits.so
END
#--8.4 create soft directory
#建立軟體安裝目錄
mkdir -p /u01/app/oracle
mkdir -p /u01/tmp
mkdir -p /u02/archive
mkdir -p /u02/oradata
mkdir -p /u01/app/oracle/product/11.2.0/db
mkdir -p /u01/app/11.2.0/grid
mkdir -p /home/oracle/sqlpath
chown -R oracle:oinstall /u01 /u02 /home/oracle/sqlpath
#--8.5
#建立環境變數,sid需要另行設定
cat >> /home/oracle/.bash_profile << END
export ORACLE_BASE=/u01/app/oracle
#export GG_HOME=/u02/ogg/ggs
export ORACLE_HOME=\$ORACLE_BASE/product/11.2.0/db
export PATH=\$PATH:\$HOME/bin:\$ORACLE_HOME/bin
export TMP=/u01/tmp
export TMPDIR=/u01/tmp
export LD_LIBRARY_PATH=\$ORACLE_BASE/product/11.2.0/db/lib:/usr/lib
export LC_TYPE=en_US.UTF-8
export NLS_LANG=AMERICAN_AMERICA.UTF8
export SQLPATH=/home/oracle/sqlpath
#alias jdb='export ORACLE_HOME=\$ORACLE_BASE/product/11.2.0/db;export ORACLE_SID=storedb1'
#alias jgrid='export ORACLE_HOME=/u01/app/11.2.0/grid;export ORACLE_SID=+ASM1'
alias sql='sqlplus / as sysdba'
alias dbs='cd /u01/app/oracle/product/11.2.0/db'
#alias jggsci='OLD_PWD=\$pwd;cd \$GG_HOME;./ggsci;cd \$OLD_PWD'
alias jlsnrctl='ORACLE_OLD=\$ORACLE_HOME; export ORACLE_HOME=/u01/app/11.2.0/grid;lsnrctl status;ORACLE_HOME=\$ORACLE_OLD;ORACLE_OLD='
END
#--8.6 configure sqlplus hint
#配置sqlplus環境
cat > /home/oracle/sqlpath/login.sql << END
set TERM OFF
define loginname=idle
column global_name new_value loginname
||substr(global_name,1,decode(dot,0,length(global_name),dot-1))) global_name
from
(select global_name, instr(global_name,'.') dot
from global_name);
set sqlprompt '&loginname> '
alter session set nls_date_format = 'yyyy-mm-dd hh24:mi:ss';
SET TIMING ON
SET TIME ON
SET SERVEROUTPUT ON
SET LINESIZE 130
SET TERM ON
SET NUMWIDTH 13
SET PAGESIZE 1000
SET ECHO ON
END
#9.modify snmp params
#修改snmp引數
sed -e 's/\(^com2sec.*\)public/\199billsnmp/' \
-e 's/\(^access.*\)systemview\([^ ]*\)/\1all\2/' \
-e 's/^#\(view all.*\)/\1/' \
-e 's/^#\(view mib2.*\)/\1/' /etc/snmp/snmpd.conf > ./snmpdtmp && mv -f ./snmpdtmp /etc/snmp/snmpd.conf
service snmpd start
chkconfig --level 12345 snmpd on
#10.modify root profile
#配置登入提示符
echo "export PS1='[\t \u(\${ORACLE_HOME##*/})@\h \W]\\$ '" >> /etc/profile
#modify init level
#修改啟動的level級別
sed -i 's/id:5/id:3/g' /etc/inittab
%end
4. 網路安裝測試要求客戶端伺服器和pxe伺服器在同一個網段,插上網線加電後,會出現下面的介面:
選擇合適的版本回車後既可以實現自動化安裝。