[FrontPage] [TitleIndex] [WordIndex

This is a read-only archived version of wiki.centos.org

如何设置一台 CentOS 6.0 网络安装服务器

1. 引言

拥有一台网络安装服务器可以令安装多台服务器的程序更简便。有了它,每台服务器可通过网络开机,而如何安装服务器的指令将会所接收自网络安装服务器。一台网络安装服务器包含四个元素:

完成这篇教学文档后,你只须以键盘输入一个开机指令便能安装一台空白的服务器,而该台新服务器将会功能全备。

这类设置最适合经常须要重新安装的服务器,或采用 VMware ESXi 等拟虚系统来设置多台服务器。

2. 开始之先

2.1. 推荐的服务器规范

在你可安装其它服务器之先,你必须在一台系统上安装 CentOS。要是你采用 VMware ESXi 作此用途,那么你可应用以下数据:

这台服务器大致上会是一台只拥有 root 帐户的独立服务器。然而,你也许会想把它连系至一个中央验证机制或加入一个系统管理员帐户。我安装了 CentOS 6.0 —— 某些元素在较早版本的 CentOS 上也许会须要不同设置。

2.2. 原位编辑

每当情况许,我都会采用原位编辑以方便进行剪贴。要是你看见 perl -npecat <<EOF,这便是用来取代 vi 或样似的编辑器。如果你不介意采用编辑器,你也可选用它。

2.3. 输入指令

所有指令应该以 root 权限在网络安装服务器上执行。更多信息可参考 如何成为 Root 用户

2.4. 在 DNS 上注册网络安装服务器

该台网络安装服务器必须登记在你的本地 DNS 内,或在每一台客端系统的 /etc/hosts 档内。

3. 所需组件

以下指令会安装一切所需的组件:

yum -y install rsync httpd vixie-cron dhcp tftp-server syslinux make perl

4. 取得一份 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

5. 创建一台 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。

6. 设置 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 服务器正在答复请求。

7. 设置 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 磁盘映像。

请留意你可以把整个程序自动化,甚至连键也不用按。然而,你无论如何也要开机才能找到设置时询问有关空白服务器的数据,因此我认为自动化的设置白费时间。

8. 设置你的网络安装

这个程序的最后一步就是创建一个 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/bin:/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

8.1. 转变为固定的 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

8.2. 更新 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

8.3. 安装新的 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

8.4. 设置 LDAP 验证

假若你采用 OpenLDAP 作为验证机制,那么你在安装时应该与它连系。

echo "Configuring LDAP Authentication"
authconfig --enableldap --enableldapauth --ldapserver=ldap://ldap:389/ --ldapbasedn="dc=mydomain,dc=com" --enablecache --disablefingerprint --kickstart

记得把以下组件加进 %packages 清单内:

8.5. 通过 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 清单内:

9. 预备网络安装服务器给客端使用

在实际引导你的客端前的最后一步,就是设置 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 位元的安装。选择后,你不用再做什么便能有一台可用的服务器。

10. 排除疑难

下面列出特定的问题:

Translation of revision 8


2023-09-11 07:23