1、理論部分
什麼是PXE
PXE(Pre-boot Execution Environment)是由Intel設計的協議,它可使計算機經過網絡啓動。協議分爲client和server兩端,PXE client在網卡的ROM中,當計算機引導時,BIOS把PXE client調入內存執行,並顯示出命令菜單,經用戶選擇後,PXE client將放置在遠端的操做系統經過網絡下載到本地運行。
PXE協議的成功運行須要解決如下兩個問題:
1. 既然是經過網絡傳輸,那麼計算機在啓動時,它的IP地址由誰來配置;
能夠經過DHCP Server解決,由DHCP server來給PXE client分配一個IP地址,DHCP
Server是用來給DHCP Client動態分配IP地址的協議,不過因爲這裏是給PXE Client
分配IP地址,因此在配置DHCP Server時,須要增長相應的PXE特有配置。
2. 經過什麼協議下載Linux內核和根文件系統
在PXE client所在的ROM中,已經存在了TFTP Client。PXE Client使用TFTP Client,經過
TFTP協議到TFTP Server上下載所需的文件。
PXE協議的工做過程。
在上圖中,PXE client是須要安裝Linux的計算機,TFTP Server和DHCP Server運行在另一臺Linux Server上。Bootstrap文件、配置文件、Linux內核以及Linux根文件系統都放置在Linux Server上TFTP服務器的根目錄下。
PXE client在工做過程當中,須要三個二進制文件:bootstrap、Linux 內核和Linux根文件系統。Bootstrap文件是可執行程序,它向用戶提供簡單的控制界面,並根據用戶的選擇,下載合適的Linux內核以及Linux根文件系統。
2、實施部分
實施方案的拓撲圖以下所示
┌────────┐
│ Boot Server │
│(DHCP TFTP NFS│
└────┬───┘
│
┌────┴───┐
│ Switch │
└────┬───┘
│
┌───────┴───────┐
│ │
┌───┴───┐ ┌───┴───┐
│ Client(PxE)│ │ Client(PxE) │
└───────┘ └───────┘
實施步驟
1.配置啓動服務器
2.配置安裝方案
3.啓動待安裝服務器,進行系統安裝
配置啓動服務器
啓動服務器的目的是幫助待安裝機器上啓動Red Hat Linux安裝程序。啓動服務器上須要搭建一個DHCP 服務器和一個TFTP 服務器,一個nfs用來傳輸網絡鏡像文件。前者是爲了給待安裝機器分配IP地址,後者則是提供了一個讓待安裝機器下載啓動鏡像的途徑。
首先配置DHCP服務
1) 安裝DHCP服務器包(RPM包名:dhcpd)。
2)配置服務器IP地址
3) 編輯DHCP服務器配置文件 /etc/dhcp.conf。
ddns-update-style interim;
ignore client-updates;
allow booting;
allow bootp;
subnet 192.168.18.0 netmask 255.255.255.0 {
option routers 192.168.18.254;
option subnet-mask 255.255.255.0;
option domain-name-servers 210.73.88.240;
range dynamic-bootp 192.168.18.128 192.168.18.254;
default-lease-time 21600;
max-lease-time 43200;
deny unknown-clients;
group pxe {
next-server 192.168.18.9;
filename "/centos/pxelinux.0";
host client { hardware ethernet 00:00:00:00:00:00; fixed-address 192.168.18.100; }
}
}
注:如需給指定的服務器進行安裝的話,就去掉上面的註釋。
簡單說一下文中的註釋,deny unknown-clients;拒絕給爲受權機器分配IP地址
next-server 指定啓動服務器地址,filename指定啓動文件地址。
host client爲mac地址爲00:00:00:00:00:00的client服務器指定IP地址爲:192.168.0.100.
4) 給啓動服務器配置一個IP,這個IP必須在DHCP服務器定義的子網內。
5) 啓動DHCP服務。
service dhcpd start
配置TFTP服務器(如沒有安裝xinetd軟件包,先安裝這個軟件包)
1) 安裝TFTP服務器包(RPM包名:tftp和tftp-server)。
2) 編輯TFTP 服務器的配置文件 /etc/xinetd.d/tftp。配置文件以下:
service tftp
{
socket_type = dgram
protocol = udp
wait = yes
user = root
server = /usr/sbin/in.tftpd
server_args = -s /tftpboot
disable = no
}
這裏選定了/tftpboot爲TFTP 服務器的根目錄位置。
3)啓動TFTP服務
service xinetd start
4)創建存放Linux安裝程序的內核/根文件系統文件的目錄
mkdir /tftpboot/centos
複製Centos光盤的/isolinux目錄下Linux安裝程序內核/根文件系統文件initrd.img 和vmlinuz到
/tftpboot/centos
5)將啓動鏡像文件pxelinux.0複製到TFTP服務器根目錄。
啓動鏡像pxelinux.0能夠在syslinux安裝包裏得到。安裝好syslinux安裝包後,將pxelinux.0複製到/tftpboot/centos
cp /usr/lib/syslinux/pxelinux.0 /tftpboot/centos
啓動鏡像pxelinux.0文件在執行過程當中,會讀取配置文件以肯定它應該載入什麼Linux內核文件來運行。全部的配置文件都放在啓動服務器的/tftpboot/centos/pxelinux.cfg/目錄下。
創建啓動配置文件存放文件夾mkdir /tftpboot/centos/pxelinux.cfg
6)創建啓動配置文件default
default centos5
label centos5
kernel vmlinuz
append load initrd=initrd.img ksdevice=eth0 ks=nfs:192.168.18.9:/home/centos/ks.cfg devfs=nomount
配置nfs
配置nfs共享目錄,nfs的配置文件爲/etc/exports
/home/centos *(ro,no_root_squash)
啓動nfs相關服務
service portmap start
service nfs start
確認共享目錄成功了
showmount -e localhost
若獲得結果包含/home/centos * ,說明成功配置好nfs
配置安裝方案
配置文件爲/home/centos/ks.cfg
text
install
repo --name=epel --baseurl=http://download.fedora.redhat.com/pub/epel/5/x86_64/
nfs --server=192.168.18.9 --dir=/home/centos/
keyboard us
lang en_US
key --skip
xconfig --defaultdesktop=GNOME --depth=8 --resolution=640x480
network --bootproto=dhcp --device=eth0 --onboot=on
#network --bootproto=dhcp --device=eth1 --onboot=on
rootpw --iscrypted $1$Sl6MDA1O$Z2HRda3FpCmaSRqrmD.gD0
user --name test --homedir /home/test --iscrypted --password=$1$IXb255iK$wZq/pCb2o70P1F8pXnI6P/ --shell=/bin/bash --groups=test,wheel
firewall --disabled
auth --useshadow --enablemd5
selinux --disabled
timezone --isUtc Asia/Shanghai
bootloader --location=mbr
logging --level=info
clearpart --all --drives=sda
part /boot --bytes-per-inode=4096 --fstype="ext3" --size=150
part swap --bytes-per-inode=4096 --fstype="swap" --size=2048
part pv.01 --size=1 --grow
volgroup lvm pv.01
logvol / --vgname=lvm --size=20480 --name=root
logvol /var --vgname=lvm --size=20480 --name=var
logvol /tmp --vgname=lvm --size=20480 --name=tmp
logvol /data --vgname=lvm --size=1 --grow --name=data
reboot
%packages
@editors
@development-libs
@base
@development-tools
-firstboot-tui
ntp
net-snmp-utils
net-snmp-libs
net-snmp
openssl-devel
nrpe
nagios-plugins
nagios-plugins-all
%post --log=/mnt/sysp_w_picpath/root/anaconda-post.log --erroronfail
/bin/cat << EOF >/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=none
HWADDR=`ifconfig eth0 |grep HWaddr |awk '{print $5}'`
ONBOOT=yes
NETMASK=`ifconfig eth0|sed -e 's/^.*Mask:\([^ ]*\)$/\1/p' -e d`
IPADDR=`ifconfig eth0|sed -e 's/^.*inet addr:\([^ ]*\).*$/\1/p' -e d`
GATEWAY=`netstat -rn|grep eth0|awk '{print $2}' | grep -v 0.0.0.0`
TYPE=Ethernet
EOF
echo "nameserver 192.168.0.1" > /etc/resolv.conf
#disable ipv6
sed -i '/NETWORKING_IPV6=/s/yes/no/' /etc/sysconfig/network
echo "alias net-pf-10 off" >> /etc/modprobe.conf
echo "alias ipv6 off" >> /etc/modprobe.conf
/sbin/chkconfig --level 35 ip6tables off
### Setting to ssh
/usr/bin/patch /etc/ssh/sshd_config << EOF
13c13
< #Port 22
---
> Port 30000
39a40
> PermitRootLogin no
60c61
< PasswordAuthentication yes
---
> PasswordAuthentication no
110c111
< #UseDNS yes
---
> UseDNS no
EOF
/sbin/restorecon /etc/ssh/sshd_config
/bin/mkdir ~test/.ssh
/bin/chmod 700 ~test/.ssh
/bin/cat << EOF > ~test/.ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA3NhtQhIrjeJy5WIlohdTn9SooaTsxpSiBljhx189b08DyC3xALH6R87RvX7+6jwJF/TqzwhZ495HTDfl7en98Dp97Xi8tYibPm9E3QBil9PGG+952flgVxTZZvS+D/rJ/7vuIp8iAiO9u3JUsZWP7X0dIaNhrnVfL31juk8I/EippzzMkjzUeRg62UizCxVD7AynwnqAsPdr6kcv9MGAZOvg7lDMv2Orbgsl0nakwtt+jmtQPGziLW+nQFVlHXTekmiJ2bDfURlRDWaegOftD+qGN3pIjO1TFCxgZccagYAVg1Jm+mFHIMIlmwpTcmBXO9DjjAhj6BXVbBNArqU5lQ== test@test.com
EOF
/bin/chmod 644 ~test/.ssh/authorized_keys
/bin/chown -R test:test ~test/.ssh/
### disable not wheel group user use su chang to root
sed -i '6s/^#auth/auth/g' /etc/pam.d/su
### Setting SNMP
/bin/cat << EOF > /etc/snmp/snmpd.conf
com2sec localhost localhost COMMUNITY_STRING
com2sec localnet 192.168.0.0/24 COMMUNITY_STRING
group test v1 localhost
group test v2c localhost
group test v1 localnet
group test v2c localnet
view all included .1 80
access test "" any noauth exact all none none
access test "" any noauth exact all all none
disk / 100000
EOF
/sbin/restorecon /etc/snmp/snmpd.conf
### disable CTRL-ALT-DELETE
/usr/bin/patch /etc/inittab << EOF
32c32,33
< ca::ctrlaltdel:/sbin/shutdown -t3 -r now
---
> #ca::ctrlaltdel:/sbin/shutdown -t3 -r now
> ca::ctrlaltdel:ca::ctrlaltdel:/usr/bin/logger 'CTRL-ALT-DELETE trap is disabled'
EOF
/sbin/restorecon /etc/inittab
### vim
/bin/sed -i "8 s/^/alias vi='vim'/" /root/.bashrc
/bin/echo 'syntax on' > /root/.vimrc
### ntp time set
/bin/echo '15 3 * * * /usr/sbin/ntpdate 192.168.0.4 > /dev/null 2>&1' >> /var/spool/cron/root
###Setting IPtables
cat << EOF > /etc/sysconfig/iptables
*filter
:INPUT DROP [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [1:140]
:ping - [0:0]
-A INPUT -p icmp -m icmp --icmp-type 8 -m state --state NEW -j ping
-A INPUT -i lo -j ACCEPT
-A INPUT -s 192.168.0.0/255.255.255.0.0 -i eth0 -j ACCEPT
-A INPUT -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i eth0 -p icmp -m icmp --icmp-type 0 -j ACCEPT
-A INPUT -i eth0 -p icmp -m icmp --icmp-type 3 -j ACCEPT
-A INPUT -i eth0 -p icmp -m icmp --icmp-type 3/4 -j ACCEPT
-A INPUT -i eth0 -p icmp -m icmp --icmp-type 4 -j ACCEPT
-A INPUT -i eth0 -p icmp -m icmp --icmp-type 11 -j ACCEPT
-A INPUT -i eth0 -p icmp -m icmp --icmp-type 12 -j ACCEPT
-A INPUT -i eth0 -p icmp -m icmp --icmp-type 14 -j ACCEPT
-A INPUT -i eth0 -p icmp -m icmp --icmp-type 16 -j ACCEPT
-A INPUT -i eth0 -p icmp -m icmp --icmp-type 18 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 30000 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,PSH,URG -j DROP
-A INPUT -i eth0 -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,PSH,ACK,URG -j DROP
-A INPUT -i eth0 -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,ACK,URG -j DROP
-A INPUT -i eth0 -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP
-A INPUT -i eth0 -p tcp -m tcp --tcp-flags SYN,RST SYN,RST -j DROP
-A INPUT -i eth0 -p tcp -m tcp --tcp-flags FIN,SYN FIN,SYN -j DROP
-A ping -p icmp -m icmp --icmp-type 8 -m limit --limit 1/sec -j RETURN
-A ping -p icmp -j REJECT --reject-with icmp-port-unreachable
COMMIT
*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT
EOF
###disable serverices
for i in `ls /etc/rc3.d/S*`
do
CURSRV=`echo $i|cut -c 15-`
case $CURSRV in
crond | irqbalance | microcode_ctl | network | random | iptables |sshd | syslog | snmpd | nrpe )
;;
*)
chkconfig --level 235 $CURSRV off
;;
esac
done
說明:上面的腳本比較的長,它不只完成了系統安裝,還完成了一些共通的初始化配置。
下面簡單介紹一下里面的幾個比較重要的參數
repo --name=epel --baseurl=http://download.fedora.redhat.com/pub/epel/5/x86_64/
爲方便安裝時能配置好nagios監控我在安裝時添加了一個額外的安裝源epel,進行安裝安裝nrpe。若是你沒有網絡能夠不設定這個選項。
rootpw --iscrypted $1$Sl6MDA1O$Z2HRda3FpCmaSRqrmD.gD0
設定root的祕密爲:123456
user --name test --homedir /home/test --iscrypted --password=$1$IXb255iK$wZq/pCb2o70P1F8pXnI6P/ --shell=/bin/bash --groups=test,wheel
創建一個普通用戶,用戶名爲test,組爲test和wheel,密碼爲123456。
clearpart --all --drives=sda
清除第一塊磁盤上的全部數據,它下面的參數是分區參數
分區採用普通分區加lvm二者方式混合分區
其中/boot分區爲150M,swap分區爲2G
根分區,var,tmp分區分別爲20G,剩餘的磁盤空間所有給data分區
%packages部分爲要安裝的軟件
其中@開頭的部分爲軟件組,-開頭的爲不要安裝的軟件包,什麼都不加就表明要安裝的單獨軟件包
%post --log=/mnt/sysp_w_picpath/root/anaconda-post.log --erroronfail
這一部分是安裝軟件後的配置,全部配置失敗的部分都進行log記錄,log文件存放在/root/anaconda-post.log
/bin/cat << EOF >/etc/sysconfig/network-scripts/ifcfg-eth0
這一部分爲設置它的網卡,因爲最初設置的爲dhcp方式分配的方式,現實中咱們使用的服務器通常爲固定IP
經過這幾個腳本,自動把dhcp設定的IP地址轉爲固定IP地址
### Setting to ssh
這一部分爲設定ssh,爲安全起見,經過腳本更改ssh的默認端口爲30000,禁止root用戶遠程登陸,同時設定登陸方式爲採用密鑰的方式,最後一部分是爲test用戶設定一個密鑰,這個密鑰咱們平時能夠經過puttygen的工具,生成的密鑰,把公鑰的內容粘貼這就好了。
### disable not wheel group user use su chang to root
禁止非wheel組的用戶經過su命令切換到root用戶
### Setting SNMP
這一部分時創建設定snmp的配置文件,咱們一般會用監控軟件對服務器進行監控,好比說,
經過cacti等相似的軟件對服務器進行流量監控,就須要snmp服務。爲方便我在這也加上了
### disable CTRL-ALT-DELETE
這一部分是禁止按下CTRL-ALT-DELETE組合鍵後服務器重啓
### vim
這一部分是方便用vi的一些參數
### ntp time set
這一部分設定服務器的時間同步,天天3:15分跟時間服務器192.168.0.4進行時間同步
### Setting nagios monitor
這一部分時設定服務器監控,腳本比較的全,包括大部分常見的應用服務。
###Setting IPtables
這一部分是設定防火牆,只對外開放ssh端口,同時加了一些網絡工具參數
### disable serverices
去掉沒必要要的服務,只保留必須的服務。
把centos的鏡像文件放置到啓動服務器的/home/centos目錄下,把待安裝服務器設定從網卡啓動,就能夠完成安裝。