如何設定一台 CentOS 6.0 網絡安裝伺服器

引言

擁有一台網絡安裝伺服器可以令安裝多台伺服器的程序更簡便。有了它,每台伺服器可通過網絡開機,而如何安裝伺服器的指令將會所接收自網絡安裝伺服器。一台網絡安裝伺服器包含四個元素:

完成這篇教學文檔後,你只須以鍵盤輸入一個開機指令便能安裝一台空白的伺服器,而該台新伺服器將會功能全備。

這類設定最適合經常須要重新安裝的伺服器,或採用 VMware ESXi 等擬虛系統來設定多台伺服器。

開始之先

建議的伺服器規格

在你可安裝其它伺服器之先,你必須在一台系統上安裝 CentOS。要是你採用 VMware ESXi 作此用途,那麼你可應用以下數據:

這台伺服器大致上會是一台只擁有 root 帳戶的獨立伺服器。然而,你也許會想把它連繫至一個中央驗證機制或加入一個系統管理員帳戶。我安裝了 CentOS 6.0 —— 某些元素在較早版本的 CentOS 上也許會須要不同設定。

原位編輯

每當情況許,我都會採用原位編輯以方便進行剪貼。要是你看見 perl -npecat <<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 名稱。

此外,你也可考慮以下數點:

在 %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 清單內:

透過 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 清單內:

預備網絡安裝伺服器給客端使用

在實際啟動你的客端前的最後一步,就是設定 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 位元的安裝。選取後,你不用再做甚麼便能有一台可用的伺服器。

排除疑難

下面列出特定的問題:

Translation of revision 6

zh-tw/HowTos/NetworkInstallServer (last edited 2012-06-18 14:24:39 by TimothyLee)