如何设置一台 CentOS 6.0 网络安装服务器
1. 引言
拥有一台网络安装服务器可以令安装多台服务器的程序更简便。有了它,每台服务器可通过网络开机,而如何安装服务器的指令将会所接收自网络安装服务器。一台网络安装服务器包含四个元素:
- DHCP 服务器为空白的服务器提供 IP 地址
- PXE 开机服务器为空白的服务器提供内核及开机环境
- 发行服务器为空白的服务器提供 CentOS 发行版本
- 你的设置告欣空白的服务器该安装哪些组件
完成这篇教学文档后,你只须以键盘输入一个开机指令便能安装一台空白的服务器,而该台新服务器将会功能全备。
这类设置最适合经常须要重新安装的服务器,或采用 VMware ESXi 等拟虚系统来设置多台服务器。
2. 开始之先
2.1. 推荐的服务器规范
在你可安装其它服务器之先,你必须在一台系统上安装 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 上也许会须要不同设置。
2.2. 原位编辑
每当情况许,我都会采用原位编辑以方便进行剪贴。要是你看见 perl -npe 或 cat <<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 名称。
此外,你也可考虑以下数点:
- 分割碟盘。以上配方创建固定尺寸的 /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
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 清单内:
- openldap
- openldap-clients
- nss-pam-ldapd
- pam_ldap
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 清单内:
- rpcbind
- nfs-utils
- nscd
- autofs
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. 排除疑难
下面列出特定的问题:
- 不能接收 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 8