1.1. 原理
无人值守自动安装Linux操作系统,在部署好服务环境后,拥有PXE功能网卡的机器(Client)开机时能够选择网络引导安装。首先Client开机后会ARP广播请求IP地址,DHCP服务响应IP请求的同时,指定了next-server(tftp)的IP和需要Client下载的pxelinux.0文件位置。下载执行pxelinux.0后获取系统启动的相关vmlinuz和initrd文件,相当于启动了一个小型无盘操作系统。执行pxelinux.cfg/default文件时找到ks.cfg位置并下载,通过ks.cfg的配置指定了软件包源路径和安装配置,而后自动安装操作系统。
PXE Client向DHCP Server发送请求 PXE Client(需要安装系统的机器)从自己的PXE网卡启动,通过PXE BootROM(自启动芯片)会以UDP发送一个ARP广播请求,向本网络中的DHCP服务器请求IP等信息。
DHCP服务器提供信息 DHCP服务器收到客户端的请求,验证是否来至合法的PXE Client的请求,验证通过后它将给客户端一个“提供”响应,这个“提供”响应中包含了为客户端分配的IP地址、子网掩码、网关、pxelinux启动程序(TFTP)位置,以及配置文件所在位置等相关信息。
PXE客户端请求下载启动文件 客户端收到服务器的“回应”后,会回应一个帧,以请求传送启动所需文件。这些启动文件包括:pxelinux.0、pxelinux.cfg/default、vmlinuz、initrd.img等文件。
Boot Server(tftp)响应客户端请求并传送文件 BootROM由TFTP通讯协议从tftp Server下载启动安装程序所必须的文件(pxelinux.0、pxelinux.cfg/default)。default文件下载完成后,会根据该文件中定义的引导顺序,启动Linux安装程序的引导内核。
请求下载自动应答文件 客户端通过pxelinux.cfg/default文件成功的引导Linux运行内核后,安装程序首先必须确定你通过什么安装介质来安装linux,如果是通过网络安装(NFS, FTP, HTTP),则会在这个时候初始化网络,并定位安装源位置。接着会读取default文件中指定的自动应答文件ks.cfg所在位置,根据该位置请求下载该文件。
客户端安装操作系统 将ks.cfg文件下载回来后,通过该文件找到系统安装所需要的软件源服务器,并按照该文件的配置请求下载安装过程需要的软件包。
1.2. 步骤
安装配置DHCP服务
作用:分配IP地址和指定next-server(tftp)等信息
yum -y install dhcp
cp /usr/share/doc/dhcp-4.1.1/dhcpd.conf.sample /etc/dhcp/dhcpd.conf
修改/etc/dhcp/dhcpd.conf
subnet 10.0.0.0 netmask 255.255.255.0 {
range 10.0.0.100 10.0.0.200;
option subnet-mask 255.255.255.0;
default-lease-time 21600;
max-lease-time 43200;
next-server 10.0.0.7; #tftp 服务器
filename "/pxelinux.0"; #tftp服务上/var/lib/tftpboot/pxelinux.0
}
绑定DHCP分配IP网卡接口(多网卡机器需要配置) 修改/etc/sysconfig/dhcpd
# Command line options here
DHCPDARGS=“eth0”
启动DHCP服务
/etc/init.d/dhcpd start
netstat -tunlp|grep dhcp
udp 0 0 0.0.0.0:67 0.0.0.0:* 1573/dhcpd
安装tftp服务
作用:提供vmlinuz、initrd等内核文件下载
安装tftp-server
yum -y install tftp-server
修改tftp配置/etc/xinetd.d/tftp
disable = no # 由原来的yes改为no
启动tftp-server
/etc/init.d/xinetd restart
netstat -tunlp|grep 69`
udp 0 0 0.0.0.0:69 0.0.0.0:* 1106/xinetd`
服务内核镜像(PE)
syslinux有很多变种(都是官方的)适用于各种媒质,如syslinux用于从微软的文件系统fat 16/32引导,isolinux用于从光盘引导,pexlinux用于从网络引导,extlinux用于从ext2/3文件系统引导。
isolinux.cfg 文件是干什么的 ISOLINUX是 SYSLINUX项目的一系列引导程序中的一个,简单的说就是类似GRUB的一个东西,就是启动然后引导内核。ISOLINUX的特点如其名,区别于 GRUB LILO等的地方,就是他可以认出iso9660文件系统,所以可以读出cd上的内核镜像和inird 镜像,然后引导。
ISOLINUX启动后,默认会去读出cd光盘根目录的一个isolinux.cfg 文件,isolinux.cfg 类似grub的menu.lst,指定的内核镜像位置等。
yum -y install syslinux
cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/
cp -a /var/www/html/isolinux/\* /var/lib/tftpboot/
新建一个pxelinux.cfg目录,存放客户端的配置文件。
mkdir -p /var/lib/tftpboot/pxelinux.cfg
cp /var/www/html/isolinux/isolinux.cfg /var/lib/tftpboot/pxelinux.cfg/default
ls /var/lib/tftpboot
pxelinux.0 #网络引导grub
vesamenu.c32 #引导菜单文件
vmlinuz #内核镜像
initrd.img #初始化进程镜像
splash.jpg #背景图片
boot.msg #引导文件
isolinux.cfg/default #类grub配置文件
修改default文件
default vesamenu.c32
#prompt 1
timeout 60 #60-->6秒(1/10秒)
display boot.msg
menu background splash.jpg
menu title Welcome to CentOS 6.3!
menu color border 0 #ffffffff #00000000
menu color sel 7 #ffffffff #ff000000
menu color title 0 #ffffffff #00000000
menu color tabmsg 0 #ffffffff #00000000
menu color unsel 0 #ffffffff #00000000
menu color hotsel 0 #ff000000 #ffffffff
menu color hotkey 7 #ffffffff #ff000000
menu color scrollbar 0 #ffffffff #00000000
label linux
menu label ^Install or upgrade an existing system
menu default
kernel vmlinuz
append ks=http://10.0.0.1/ks.cfg initrd=initrd.img #指定ks.cfg位置
label vesa
menu label Install system with ^basic video driver
kernel vmlinuz
append initrd=initrd.img xdriver=vesa nomodeset
label rescue
menu label ^Rescue installed system
kernel vmlinuz
append initrd=initrd.img rescue
label local
menu label Boot from ^local drive
localboot 0xffff
label memtest86
menu label ^Memory test
kernel memtest
append
安装vsftp/http服务
作用:提供操作系统安装时软件的下载服务
yum -y install httpd
/etc/init.d/httpd start
cp -r /dev/cdrom/* /var/www/html
配置一个ks.cfg
开机安装
作用:开启启动通过网卡引导自动安装
配置文件
- ks.cfg
# Kickstart file automatically generated by anaconda.
#键盘类型,语言,安装方式等系统的配置,有必选项和可选项,如果缺少某项必选项,安装时会中断并提示用户选择
#version=DEVEL
#指定默认执行内容,是安装install还是升级upgrade
install
#文本方式安装,图像graphical
text
#安装方式,一般是ISO镜像挂载的目录。如果是网络安装的话可以写成
#url ––url ftp://192.168.1.254/dir
#nfs --server=192.168.0.241 --dir=/centosinstall
#cdrom
url --url=http://10.0.0.1/
#如果是redhat的系统,会要求输入key,这里配置为跳过,如果不配置安装时会停在那里要求用户输入key
key –skip
#语言
lang en_US.UTF-8
#键盘样式
keyboard us
#网络配置 配置具体参数样例:network –onboot yes --bootproto=static --ip=192.168.1.1 --netmask=255.255.255.0 其他网关,DNS等格式。是按照号操作系统后对ifcfg-eth0的配置,在pxelinux.cfg/default之前会还有多种下载方式,可以研究如何下载
#network --onboot yes --device eth0 --bootproto static --ip=10.0.0.101 --netmask=255.255.255.0
network --onboot no --device eth0 --bootproto dhcp --noipv6
#管理员密码,是加密过的 要是使用不加密的方式则这样写:rootpw 123456
rootpw --iscrypted $6$.U.Eg6dK4XP3FjND$t88vA623WNOtosCHQyV1.B7j7sm3R.W6dhOw1xRq3DNHowild41YcHcFIKeFRPARuKcH5PhgSoimBDuk2YzWr/
#开启防火墙,并打开ssh端口。关闭使用--disabled
firewall --service=ssh
#快速启动,不进行磁盘检测
fastboot --disabled
#用户认证和密码加密方式
authconfig --enableshadow --passalgo=sha512
#强制打开selinux。禁用使用--disabled
selinux --enforcing
#时区设置
timezone --utc Asia/Shanghai
#清空磁盘的mbr
zerombr yes
#引导程序相关参数
bootloader --location=mbr --driveorder=sda --append="crashkernel=auto rhgb quiet"
#初始化磁盘,清楚磁盘所有数据
clearpart –-all –-initlabel
#磁盘分区,单位是MB --grow会将剩下的全部分配给指定的分区
part swap --fstype=swap ---size=2048
part /boot --fstype=ext3 --size=1048
part / --fstype=ext3 --grow --size=1
#repo位置
#repo --name="CentOS" --baseurl=cdrom:sr0 --cost=100
#安装完后自动reboot
reboot
#============================================================
#在安装过程中默认安装的软件包,安装软件时会自动分析依赖关系
#%packages
#@groupname:指定安装的包组
#package_name:指定安装的包
#-package_name:指定不安装的包
%packages
@base
@console-internet
@core #mini安装就只会安装核心软件包组core
@debugging
@directory-client
@hardware-monitoring
@java-platform
@large-systems
@network-file-system-client
@performance
@perl-runtime
@server-platform
@server-policy
pax
oddjob
sgpio
certmonger
pam_krb5
krb5-workstation
perl-DBD-SQLite
gcc
gcc-c++
make
cmake
#=======================================================================
#脚本段(可选):
#%pre:预安装脚本(由于只依赖于启动镜像,支持的命令很少)
#%post:后安装脚本(基本支持所有命令)
%post
cat >> /etc/yum.repos.d/base.repo <<eof #配置yum源
[base]
name=baseserver
baseurl=http://10.0.0.1
gpgcheck=0
enable=1
eof
/etc/init.d/network restart
%end