kickstart+cobbler系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.htmlhtml
所谓的PXE是Preboot Execution Environment的缩写,字面上的意思是开机前的执行环境。node
要达成PXE必需要有两个环节:linux
(1)一个是客户端的网卡必需要支持PXE用户端功能,而且开机时选择从网卡启动,这样系统才会以网卡进入PXE客户端的程序;ios
(2)一个是PXE服务器必需要提供至少含有DHCP以及TFTP的服务!vim
且其中:centos
· DHCP服务必需要可以提供客户端的网络参数,还要告知客户端TFTP所在的位置;服务器
· TFTP则提供客户端的boot loader及kernel file下载路径。网络
还要加上NFS/FTP/HTTP(选择同样便可)等提供安装文件(安装镜像的解压文件),才算是比较完整的PXE服务器。通常TFTP和DHCP服务都由同一台服务器提供,且大多数时候还提供NFS/FTP/HTTP服务,因此PXE服务器通常是提供3合一的服务。app
(1).Client向PXE Server上的DHCP发送IP地址请求消息,DHCP检测Client是否合法(主要是检测Client的网卡MAC地址),若是合法则返回Client的IP地址,同时将pxe环境下的Boot loader文件pxelinux.0的位置信息传送给Client。dom
(2).Client向PXE Server上的TFTP请求pxelinux.0,TFTP接收到消息以后再向Client发送pxelinux.0大小信息,试探Client是否满意,当TFTP收到Client发回的赞成大小信息以后,正式向Client发送pxelinux.0。
(3).Client执行接收到的pxelinux.0文件。
(4).Client向TFTP请求pxelinux.cfg文件(其实它是目录,里面放置的是是启动菜单,即grub的配置文件),TFTP将配置文件发回Client,继而Client根据配置文件执行后续操做。
(5).Client向TFTP发送Linux内核请求信息,TFTP接收到消息以后将内核文件发送给Client。
(6).Client向TFTP发送根文件请求信息,TFTP接收到消息以后返回Linux根文件系统。
(7).Client加载Linux内核(启动参数已经在4中的配置文件中设置好了)。
(8).Client经过nfs/ftp/http下载系统安装文件进行安装。若是在4中的配置文件指定了kickstart路径,则会根据此文件自动应答安装系统。
首先安装dhcp服务端程序。
yum -y install dhcp
DHCP主要是提供客户端网络参数与TFTP的位置,以及boot loader的文件名。同时,咱们仅针对内网来告知TFTP的相关位置,因此能够编辑/etc/dhcp/dhcpd.conf在subnet的区块内加入两个参数便可。其中PXE上专门为PXE客户端下载的boot loader文件名称为pxelinux.0。
vim /etc/dhcp/dhcpd.conf ddns-update-style none; default-lease-time 259200; max-lease-time 518400; option routers 172.16.10.10; option domain-name-servers 172.16.10.10; subnet 172.16.10.0 netmask 255.255.255.0 { range 172.16.10.11 172.16.10.100; option subnet-mask 255.255.255.0; next-server 172.16.10.10; # 就是TFTP的位置 filename "pxelinux.0"; # 告知得从TFTP根目录下载的boot loader文件名 }
重启dhcp。
service dhcpd restart
从流程图中能够看出,boot loader文件pxelinux.0以及内核相关的配置文件(目录pxelinux.cfg下)主要都是由TFTP来提供的!
TFTP的安装很简单,直接使用yum便可。不过要告诉客户端TFTP的根目录在哪里,这样客户端才能找到相关文件。另外要注意,TFTP是由xinetd这个super daemon所管理的,所以设定好TFTP以后,要启动的是xinetd。
默认TFTP服务的根目录是/var/lib/tftpboot/,为了少写些字母,将tftp的根目录修改成/tftpboot/。修改tftp的配置文件,主要是TFTP的根目录。
service tftp { socket_type = dgram protocol = udp wait = yes user = root server = /usr/sbin/in.tftpd server_args = -s /tftpboot #重点在这里!修改tftp的根目录 disable = no per_source = 11 cps = 100 2 flags = IPv4 }
建立tftp的根目录。
启动TFTP并观察之:
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name udp 0 0 0.0.0.0: 69 0.0.0.0:* 2238/ xinetd
接下来的文件必需要放置于/tftpboot/目录下。
若是要使用PXE的开机引导的话,须要使用CentOS提供的syslinux包,从中copy两个文件到tftp的根目录/tftpboot下便可。整个过程以下:
yum -y install syslinux cp -a /usr/share/syslinux/{menu.c32,vesamenu.c32,pxelinux.0} /tftpboot/ mkdir /tftpboot/pxelinux.cfg
ls -l /tftpboot/ -rw-r--r-- 1 root root 61796 Oct 16 2014 menu.c32 # 提供图形化菜单功能 -rw-r--r-- 1 root root 26759 Oct 16 2014 pxelinux.0 # boot loader文件 drwxr-xr-x 2 root root 4096 Feb 24 20:02 pxelinux.cfg # 开机的菜单设定在这里 -rw-r--r-- 1 root root 163728 Oct 16 2014 vesamenu.c32 # 也是提供图形化菜单功能,但界面和menu.c32不一样
pxelinux.cfg是个目录,能够放置默认的开机选项,也能够针对不一样的客户端主机提供不一样的开机选项。通常来讲,能够在pxelinux.cfg目录内创建一个名为default的文件来提供默认选项。
若是没有menu.c32或vesamenu.c32时,菜单会以纯文字模式一行一行显示。若是使用menu.c32或vesamenu.c32,就会有相似反白效果出现,此时可使用上下键来选择选项,而不须要看着屏幕去输入数字键来选择开机选项。通过测试,使用vesamenu.c32比menu.c32更加好看些。
这部分设定完毕后,就是内核相关的设定了。
要安装Linux系统,必须提供内核文件,这里以64位版本的CentOS 6.6为例。
这里计划将内核相关文件放在/tftpboot/centos6.6/目录下。
既然要从安装镜像中获取内核相关文件,首先得要挂载镜像。
mount /dev/cdrom /test mkdir /tftpboot/CentOS6.6 cp /test/isolinux/{vmlinuz,initrd.img} /tftpboot/CentOS6.6 cp /test/isolinux/isolinux.cfg /tftpboot/pxelinux.cfg/default
其实仅须要vmlinuz和initrd.img两个文件便可,不过这里还将isolinux.cfg这个文件拷贝出来了,这个文件里提供了开机选项,能够以它做为修改开机选项和菜单的模板,这样修改起来比较容易,也更便捷!
修改开机配置文件isolinux.cfg。因为拷贝它的时候重命名为default,因此修改default便可。修改的地方标红色了。
#prompt 1
timeout 10
display ./centos6.6/boot.msg
#这是为选项提供一些说明的文件 menu background splash.jpg menu title Welcome to CentOS 6.6! 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 your Linux
menu default #设置默认的光标停留在此label上 kernel ./centos6.6/vmlinuz
#设置内核文件,注意相对路径是从tftp的根路径/tftpboot开始的 append initrd=./centos6.6/initrd.img quiet #设置init ramdom disk文件,并设置启动时文本方式启动
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 -
设置Bios从网卡启动。
因为到这里我尚未提供Linux的安装文件,因此选择URL从互联网来获取系统安装。
因为要从互联网上获取系统安装文件,因此须要设置IP等网络参数,但要注意,这里的网络参数和前面设置的PXE网络参数是无关的,这里设置的IP仅是为了联上互联网。因为已经配置了DHCP,因此这里选择DHCP。
设置一个获取Linux系统的站点。上图设置的是163的站点。
若是没什么问题,到这里就开始进行安装直到完成了。如下是进度图片。
如今在本地服务器上安装http或ftp或nfs来做为系统文件的来源。
首先挂载Linux的镜像光盘(前文已经挂载过了),假设挂载到/mnt目录上。
注意,要提供的是镜像中的全部文件,而不是简单的提供一个镜像。因此将/mnt中的全部文件复制出来,假设复制到目录/install目录下。
其实也能够不用复制出来的,只须要将镜像挂载到某个目录下,只要nfs/http/ftp可以找到它就好了。
(1). 使用NFS提供安装文件
启动rpcbind和nfs。
而后导出/install目录给须要安装系统的客户端,这里导出给整个网段。
Export list for node1.longshuai.com: /install 192.168.0.0/24
(2). 使用http提供安装文件
安装httpd。
因为http的DocumentRoot "/var/www/html",因此系统的安装文件须要在此目录下或其子目录才能找到,假设在/var/www/html/centos6.6目录下,只须要简单的将镜像挂载到此目录便可。
(3). 使用vsftpd来提供安装文件
因为这里仅用来提供下系统的安装文件,因此就不必对vsftpd多多配置了,使用它最简单的匿名用户模式便可,可是匿名用户的根目录为/var/ftp,因此要将镜像挂载到此目录或此目录下的子目录下,假设放在/var/ftp/centos6.6。
(4). 测试并填写安装文件的路径地址
到此,就能够启动虚拟机来测试了。和前面的同样,直到下面这里。
对于ftp和http,直接填写便可。
ftp://192.168.100.100/centos6.6
http://192.168.100.100/centos6.6
对于NFS写这样的路径,由于在上面NFS的设定上是导出了/install目录,安装文件也是复制到此文件中的。
而后就会进入安装画面,可是这样仍是有些地方须要手动指定的。没法实现非交互时无人值守的方式安装。
因此下文就介绍kickstart实现无人值守的方式。
所谓的无人值守,就是自动应答,当安装过程当中须要人机交互提供某些选项的答案时(如如何分区),自动应答文件能够根据对应项自动提供答案。可是,无人值守并不彻底是无人值守,在设置bios从网卡启动是必须人为设置的,且安装完系统后设置不从网卡启动也是须要人为设置的。此处以外,其余的均可以无人值守。
要配置无人值守的系统安装,须要提供安装过程当中须要的各类选择,这些选择在kickstart的配置文件中,通常正常安装完Linux系统在root用户的家目录下有一个anaconda-ks.cfg,该文件的配置说明见kickstart文件详解。如下是该文件中的部份内容。
不难发现,装系统时不少选项在这里面都记录了。
那么,要使用kickstart来批量部署操做系统,就须要提供该文件。如下是我提供的配置文件/install/ks.cfg(由于我是使用NFS做为文件提供源的,因此我将其放在nfs的导出目录中,让客户端可以找到)。其中rootpw的加密密码要使用grub-crypt生成。
install
text
nfs --server=192.168.100.100 --dir=/install
#url --url=http://192.168.100.100/centos6.6 bootloader --location=mbr --driveorder=sda --append="crashkernel=auto quiet" lang en_US.UTF-8 keyboard us network --onboot no --device eth0 --bootproto dhcp --noipv6 rootpw --iscrypted $6$x4u9sIfSQsO7ddk5$/.0Xe6tFBY0uUmFFtyvAeY9YVPtcn8zl21fFNgmAoYtepQHRYDthQ4T1ZE12kDfAT6O3oXfRb7uv214t3Bb3K1 firewall --service=ssh authconfig --enableshadow --passalgo=sha512 selinux --disabled timezone Asia/Shanghai reboot #安装结束后重启 #make partitions zerombr clearpart --all --initlabel part /boot --fstype=ext4 --asprimary --size=250 part / --fstype=ext4 --asprimary --grow --size=2000 part swap --fstype=swap --size=2000 %packages @base @core @debugging @development @dial-up @hardware-monitoring @performance @server-policy @workstation-policy sgpio device-mapper-persistent-data systemtap-client %post #结束后作的事 cat >>etc/yum.repos.d/base.repo<<eof [base] name=163repo baseurl=http://mirrors.163.com/centos/6/os/x86_64/ gpgcheck=0 enable=1 eof sed "s/ONBOOT.*$/ONBOOT=yes/" /etc/sysconfig/network-scripts/ifcfg-eth0 #设置网卡为启动 sed "s/rhgb //" /boot/grub/grub.conf #设置启动系统时不使用图形进度条方式 sed "s/HOSTNAME=.*$/HOSTNAME=xuexi.longshuai.com/" /etc/sysconfig/network #设置主机名 %end
而后修改defalut文件,让客户端可以找到ks.cfg文件。
label linux
menu label ^Install your Linux
menu default
kernel ./centos6.6/vmlinuz
append initrd=./centos6.6/initrd.img ks=nfs:192.168.100.100:/install/ks.cfg quiet
若是要使用LVM的分区方式,参考以下:
part /boot --fstype ext4 --size=100 part swap --fstype=swap --size=2048 part pv26 --size=100 --grow volgroup VG00 --pesize=32768 pv26 logvol / --fstype ext4 --name=LVroot --vgname=VG00 --size=29984 logvol /data --fstype ext4 --name=LVdata --vgname=VG00 --size=100 --grow
若是以为使用样本的方式手工写配置文件比较麻烦,也可使用图形化工具来制做ks.cfg文件。在linux中用yum安装system-config-kickstart就好了(图形化依赖于x-window),选项也有些限制(好比分区不能使用lvm)。
而后找台机器从网卡启动就进入安装模式了。
由于在ks.cfg中设置了安装完成后reboot,因此要手动去修改bios不要再从网卡启动,不然重启后又再次从网卡启动而后又去自动应答装系统了。固然,能够将reboot换成shutdown或者poweroff,这样装完就只是关机了,等开机前人为设置不从网卡启动。