如何設定一台 CentOS 6.0 網絡安裝伺服器
引言
擁有一台網絡安裝伺服器可以令安裝多台伺服器的程序更簡便。有了它,每台伺服器可通過網絡開機,而如何安裝伺服器的指令將會所接收自網絡安裝伺服器。一台網絡安裝伺服器包含四個元素:
- DHCP 伺服器為空白的伺服器提供 IP 位址
- PXE 開機伺服器為空白的伺服器提供內核及開機環境
- 發行伺服器為空白的伺服器提供 CentOS 發行版本
- 你的設定告訢空白的伺服器該安裝哪些套件
完成這篇教學文檔後,你只須以鍵盤輸入一個開機指令便能安裝一台空白的伺服器,而該台新伺服器將會功能全備。
這類設定最適合經常須要重新安裝的伺服器,或採用 VMware ESXi 等擬虛系統來設定多台伺服器。
開始之先
建議的伺服器規格
在你可安裝其它伺服器之先,你必須在一台系統上安裝 CentOS。要是你採用 VMware ESXi 作此用途,那麼你可應用以下數據:
- 單核處理器
- 512Mb 記憶體
- 64Gb 碟盤分為不同分割區:
- /boot — 主分割區,256Mb
- / — LVM,6Gb
- /var/log — LVM,4Gb
- swap — LVM,1Gb
- /var/www — LVM,其餘空間
- 分配固定 IP 位址
- 以 "Minimal" ISO 安裝
這台伺服器大致上會是一台只擁有 root 帳戶的獨立伺服器。然而,你也許會想把它連繫至一個中央驗證機制或加入一個系統管理員帳戶。我安裝了 CentOS 6.0 —— 某些元素在較早版本的 CentOS 上也許會須要不同設定。
原位編輯
每當情況許,我都會採用原位編輯以方便進行剪貼。要是你看見 perl -npe 或 cat <<EOF,這便是用來取代 vi 或樣似的編輯器。如果你不介意採用編輯器,你也可選用它。
輸入指令
所有指令應該以 root 權限在網絡安裝伺服器上執行。更多資訊可參考 如何成為 Root 用戶。
在 DNS 上註冊網絡安裝伺服器
該台網絡安裝伺服器必須登記在你的本地 DNS 內,或在每一台客端系統的 /etc/hosts 檔內。
所需套件
以下指令會安裝一切所需的套件:
yum -y install rsync httpd vixie-cron dhcp tftp-server syslinux make perl
取得一份 CentOS 6.0 發行版本
請從 CentOS 的公用鏡像清單選取一個支援 rsync 的鏡像並記下主機和遠端目錄。當你建立你的軟件庫眏射腳本時,便需要這些資料。
cd /etc/cron.weekly
cat <<EOF >update-centos
#!/bin/sh
# 以你的鏡像資料替代這些資料
MIRROR=rsync://REPLACE.WITH.YOUR.MIRRORHOST/PATH/centos/6.0
LOCALDIR=/var/www/html/centos/6.0
for i in os updates; do
rsync -aH $MIRROR/$i $LOCALDIR
done
EOF
chmod 0755 update-centos
mkdir -p /var/www/html/centos/6.0
./update-centos &
請以你選取的鏡像的 rsync 主機名稱及路徑來取代 REPLACE.WITH.YOUR.MIRRORHOST/PATH。
現在,CentOS 發行版本(OS 與及 UPDATES)將會下載自一個中央軟件庫的鏡像。這個步驟需要數小時,並且會在背景執行。你應該定時執行這個指令 —— 如果你把它放入 /etc/cron.weekly,它便會每週執行一次。我發現 CentOS 6.0 不會自動啟動 crond 或安裝一個 /etc/crontab 作此用途。如果你也面對同一問題,以下指令會設定 crond。
cat <<EOF >>/etc/crontab 01 * * * * root run-parts /etc/cron.hourly 02 4 * * * root run-parts /etc/cron.daily 22 4 * * 0 root run-parts /etc/cron.weekly 42 4 1 * * root run-parts /etc/cron.monthly EOF service crond start chkconfig crond on
建立一台 CentOS 6.0 發行伺服器
一台發行伺服器就是一台提供 OS 發行檔的網頁伺服器。以下指令會在網頁伺服器上設定這項功能。
cd /var/www/html/centos ln -s 6.0 6 iptables -I INPUT -m state --state new -m tcp -p tcp --dport 80 -j ACCEPT service iptables save service httpd start chkconfig httpd on
由於你現在已擁有一個本地的 os 及 updates 軟件庫,你應該更改所有系統上的軟件庫定義檔來採用這個新的軟件庫。以下指令會在客端系統上作出這些改動:
cd /etc/yum.repos.d perl -npe '/mirrorlist=.*repo=os/ && s/^/#/' -i CentOS-Base.repo perl -npe '/mirrorlist=.*repo=updates/ && s/^/#/' -i CentOS-Base.repo perl -npe '/#baseurl=.*\/os\// && s/^#//' -i CentOS-Base.repo perl -npe '/#baseurl=.*\/updates\// && s/^#//' -i CentOS-Base.repo perl -npe '/^baseurl=/ && s/mirror.centos.org/NETINSTALL-HOST/' -i CentOS-Base.repo
請在 DNS 或 /etc/hosts 檔內以你的主機名稱替代 NETINSTALL-HOST。
設定 DHCP 伺服器
你必須為你的網絡設定 DHCP 伺服器。我的網絡是 192.168.1.0,而我的 DNS 伺服器是 192.168.1.2 及 192.168.1.3。你的網絡多數有異,因此請對 IP 位址作出適當修改。
cat <<EOF >/etc/dhcp/dhcpd.conf
option domain-name "mydomain.com";
option domain-name-servers 192.168.1.2, 192.168.1.3;
default-lease-time 600;
max-lease-time 7200;
ddns-update-style none;
authoritative;
log-facility local7;
subnet 192.168.1.0 netmask 255.255.255.0 {
option routers 192.168.1.1;
}
EOF
chkconfig dhcpd on
service dhcpd start
iptables -I INPUT -i eth0 -p udp --dport 67 --sport 68 -j ACCEPT
service iptables save
每次我們安排新一台主機以網絡開機,便需要修改 /etc/dhcp/dhcpd.conf 檔,因此我們稍後再處理它。請注意你必須把你的網絡上現有的 DHCP 伺服器關掉。很多家用的路由器都有內置的 DHCP 伺服器。如果你的客端派不到你期待的位址,很大機會網絡上有另一個 DHCP 伺服器正在答覆請求。
設定 PXE 開機伺服器
當空白的系統透過 DHCP 取得 IP 位址後,它會向 PXE 開機伺服器徵求內核。PXE 開機伺服器利用 TFTP 伺服器來答覆這些請求。設定 PXE 開機伺服器是件一次性的事情。你必須把發行版本的 os 部份下載完畢,才能完成 PXE 開機伺服器的設定,這是由於我們須從中複製內核的映像。你也可選從 minimal 安裝光碟複製內核的映像。
cd /var/lib/tftpboot cp /usr/share/syslinux/pxelinux.0 . cp /usr/share/syslinux/menu.c32 . mkdir -p pxelinux.cfg centos/i386 centos/x86_64 CENTOS=/var/www/html/centos/6/os cp $CENTOS/i386/images/pxeboot/* centos/i386 cp $CENTOS/x86_64/images/pxeboot/* centos/x86_64 iptables -I INPUT -i eth0 -m state --state NEW -m tcp -p tcp --dport 69 -j ACCEPT iptables -I INPUT -i eth0 -m udp -p udp --dport 69 -j ACCEPT service iptables save chkconfig tftp on service xinetd restart
當空白的系統開機後,你便會看見一個讓你選擇要安裝的系統(32 位元或 64 位元)的選單。這個選擇是強制性的,以防正常的開機程式失效時你意外地以網絡開機。透過提供一個選單,你可在網絡安裝程式把硬碟格式化前終止它。下列步驟設定我喜好的選單架構:
cat <<EOF >pxelinux.cfg/default
DEFAULT menu.c32
PROMPT 0
TIMEOUT 300
ONTIMEOUT localdisk
MENU TITLE PXE Network Boot
LABEL localdisk
MENU LABEL ^Local Hard Drive
MENU DEFAULT
LOCALBOOT 0
LABEL install_32bit
MENU LABEL ^CentOS 6.0 (32-bit) Install
KERNEL centos/i386/vmlinuz
APPEND ks=http://NETINSTALL-HOST/ks/b32.ks initrd=centos/i386/initrd.img ramdisk_size=100000
LABEL install_64bit
MENU LABEL ^CentOS 6.0 (64-bit) Install
KERNEL centos/x86_64/vmlinuz
APPEND ks=http://NETINSTALL-HOST/ks/b64.ks initrd=centos/x86_64/initrd.img ramdisk_size=100000
EOF
在這個設定檔內,請以你的網絡安裝伺服器 DNS 名稱替代 NETINSTALL-HOST。32 位元及 64 位元的系統擁有自己的選項,因為它們採用不同的發行版本、內核及起始用 RAM 磁碟映像。
請留意你可以把整個程序自動化,甚至連鍵也不用按。然而,你無論如何也要開機才能找到設定時詢問有關空白伺服器的資料,因此我認為自動化的設定白費時間。
設定你的網絡安裝
這個程序的最後一步就是建立一個 Kickstart 檔,然後我們才能安裝首台空白伺服器。Kickstart 檔提供安裝系統時所需的資料 —— 你在標準安裝時所回答的每一條問題都有一個相應的指令。首先,讓我們在網頁伺服器上安排一個位置來發佈 Kickstart 檔給我們的客端。
mkdir /var/www/html/ks cd /var/www/html/ks
我們須要在這個目錄內建立一個名叫 b32.ks 的檔案。這是我的內容:
cat <<EOF >b32.ks install url --url http://NETINSTALL-HOST/centos/6.0/i386 lang en_US.UTF-8 keyboard us timezone --utc America/Denver network --noipv6 --onboot=yes --bootproto dhcp authconfig --enableshadow --enablemd5 rootpw --iscrypted CHANGEME firewall --enabled --port 22:tcp selinux --permissive bootloader --location=mbr --driveorder=sda --append="crashkernel=auth rhgb" # 分割碟盤 clearpart --all --initlabel --drives=sda part /boot --fstype=ext4 --size=200 part pv.1 --grow --size=1 volgroup vg1 --pesize=4096 pv.1 logvol / --fstype=ext4 --name=lv001 --vgname=vg1 --size=6000 logvol /var --fstype=ext4 --name=lv002 --vgname=vg1 --grow --size=1 logvol swap --name=lv003 --vgname=vg1 --size=2048 # 結束分割碟盤 # 確保我們完成後重新開機進入新系統 reboot # 選擇套件 %packages --nobase --excludedocs @core -*firmware -iscsi* -fcoe* -b43-openfwwf kernel-firmware -efibootmgr wget sudo perl %pre %post --log=/root/install-post.log ( PATH=/bin:/sbin:/usr/sbin:/usr/sbin export PATH # 在這裡放置你的後設指令 ) 2>&1 >/root/install-post-sh.log EOF
這裡有數個必須的修改。你可以利用以下指令取得加密版本的 root 密碼:
grep 'root' /etc/shadow | awk -F: '{print $2}'
請把它加進設定檔的適當位置。請把 NETINSTALL-HOST 改為你的網絡伺服器的 DNS 名稱。
此外,你也可考慮以下數點:
- 分割碟盤。以上配方建立固定大小的 /boot 及 / 分割區,和佔用其餘碟盤空間的 /var 分割區。這樣做也許未能迎合你的需要。
SELinux 及防火牆。以上配方容讓你以 ssh 連線到主機,及把 SELinux 設為 permissive 模式。有關這兩個功能的其它選項請參考 Kickstart 的文檔。
- 選擇套件。以上配方只選取了最基本的套件 —— 它預期你在事後安裝所需的套件。我經常會把其它診斷及工具套件(例如 wget、bind-utils、telnet 及 openssh-clients)加進清單內。
在 %post 那部份,你可加入任何要執行的腳本。下面提供了數個範例。
你可以從 32 位元用的 kickstart 檔建立 64 位元用的版本。每當你更改 32 位元檔時,請記得這樣做。
sed 's/i386/x86_64/g' b32.ks > b64.ks
轉變為固定的 IP
我所有伺服器都採用固定的 IP。以下腳本會把 DHCP 的範圍改為同一個固定的 IP 位址。
echo "Converting DHCP scope to static IP address"
DEVICE=`route -n|grep '^0.0.0.0'|awk '{print $8}'`
IPADDR=`ifconfig $DEVICE|grep 'inet addr:'|awk '{sub(/addr:/,""); print $2}'`
NETMASK=`ifconfig $DEVICE|grep 'Mask'|awk '{sub(/Mask:/,""); print $4}'`
NETWORK=`ipcalc $IPADDR -n $NETMASK|awk -F= '{print $2}'`
GATEWAY=`route -n|grep '^0.0.0.0'|awk '{print $2}'`
HWADDR=`ifconfig $DEVICE|grep 'HWaddr'|awk '{print $5}'`
cat <<EOF >/etc/sysconfig/network
NETWORKING=yes
HOSTNAME=$HOSTNAME
GATEWAY=$GATEWAY
EOF
cat <<EOF >/etc/sysconfig/network-scripts/ifcfg-$DEVICE
DEVICE=$DEVICE
BOOTPROTO=static
IPADDR=$IPADDR
NETMASK=$NETMASK
ONBOOT=yes
HWADDR=$HWADDR
EOF
更新 YUM 以便採用本地軟件庫
我們也可以把 CentOS-Base.repo 的轉換放進腳本內。
echo "Updating YUM Repositories" cd /etc/yum.repos.d perl -npe '/mirrorlist=.*repo=os/ && s/^/#/' -i /etc/yum.repos.d/CentOS-Base.repo perl -npe '/mirrorlist=.*repo=updates/ && s/^/#/' -i /etc/yum.repos.d/CentOS-Base.repo perl -npe '/^#baseurl=.*\/os\// && s/^#//' -i CentOS-Base.repo perl -npe '/^#baseurl=.*\/updates\// && s/^#//' -i CentOS-Base.repo perl -npe '/^baseurl/ && s/mirror.centos.org/NETINSTALL-HOST/' -i CentOS-Base.repo yum -y update
安裝新的 sudoers 清單
我把一個可安裝至系統的 sudoers 檔放置在 /var/www/html/ks/sudoers。這個做法最好配合中央驗證及中央化的 NFS 主目錄。
echo "Updating sudoers" wget -O /etc/sudoers http://NETINSTALL-HOST/ks/sudoers chmod 0440 /etc/sudoers chown root.root /etc/sudoers
設定 LDAP 驗證
假若你採用 OpenLDAP 作為驗證機制,那麼你在安裝時應該與它連繫。
echo "Configuring LDAP Authentication" authconfig --enableldap --enableldapauth --ldapserver=ldap://ldap:389/ --ldapbasedn="dc=mydomain,dc=com" --enablecache --disablefingerprint --kickstart
記得把以下套件加進 %packages 清單內:
- openldap
- openldap-clients
- nss-pam-ldapd
- pam_ldap
透過 LDAP 設定 AUTOFS
與以上息息相關的,要是你的 LDAP 採用 OpenLDAP 對照表,你也該作出以下設定。
echo "Configuring autofs" perl -npe 's/^automount:.*/automount: ldap/' -i /etc/nsswitch.conf cat <<EOF >>/etc/sysconfig/autofs LDAP_URI="ldap://ldap.mobilenimbus.com:389/" SEARCH_BASE="ou=Maps,dc=mobilenimbus,dc=com" MAP_OBJECT_CLASS="nisMap" ENTRY_OBJECT_CLASS="nisObject" MAP_ATTRIBUTE="nisMapName" ENTRY_ATTRIBUTE="cn" EOF echo "Configuring LDAP autofs Boot-time" chkconfig nscd on chkconfig autofs on
記得把以下套件加進 %packages 清單內:
- rpcbind
- nfs-utils
- nscd
- autofs
預備網絡安裝伺服器給客端使用
在實際啟動你的客端前的最後一步,就是設定 DHCP 伺服器來提供一個固定的 IP 位址。以下腳本能夠達至這個目的:
cat <<EOF >>/etc/dhcp/dhcpd.conf
host newserver {
hardware ethernet ETHERNET-ADDRESS;
fixed-address 192.168.1.10;
filename "pxelinux.0";
}
EOF
service dhcpd restart
如果你用的是 VMware ESXi,你可以透過編輯 NIC 設定來指定 ETHERNET-ADDRESS。否則,請把乙太網的位址填進適當位置。乙太網位址的格式是 XX:XX:XX:XX:XX:XX(6 組雙位的十六進制字元)。此外,請確保以你的伺服器的 DNS 名稱替代 newserver。
一旦完成後,你便可重新啟動伺服器。稍後,空白伺服器的顯示器會列出 PXE 網絡開機的選單,讓你選擇 32 位元或 64 位元的安裝。選取後,你不用再做甚麼便能有一台可用的伺服器。
排除疑難
下面列出特定的問題:
- 無法接收 DHCP 位址
- 請確保網絡安裝伺服器的防火牆容許由 68 號埠發送至 67 號埠的 UDP 封包
- 請確保 DHCP 伺服器正在運行中
- 請確保網絡上沒有其它 DHCP 伺服器
- 無法下載 TFTP 檔案
- 請確保網絡安裝伺服器的防火牆容許發送至 69 號埠的 UDP 及 TCP 封包
- 請確保 TFTP 伺服器正在運行中
- 安裝一個 tftp 客端程式並嘗試存取 pxelinux.cfg/default
- 安裝程式詢問發行版本的位置
- 請確保網絡安裝伺服器的防火牆容許發送至 80 號埠的 TCP 封包
- 請確保你能從網絡安裝伺服器下載發行版本的檔案
- 請確保 kickstart 檔內的 url 語句是正確的
- 請確保網絡安裝伺服器已註冊在 DNS 內
- 安裝程式詢問其它問題
- kickstart 檔內出現了問題 —— 請在 kickstart 檔內找出有關部份
Translation of revision 6
