这两天学习kickstart的部署,采用 pxe + dhcp + tftp + nfs 的方式,下面把整个流程简要地列出来。
我这里用的系统是rhel6.5,对于rhel5/centos5系列的系统略有不同。
先简单描述一下通过网络启动安装的过程:
客户端设置为通过网络启动,可能需要在bios中设定开启该功能
启动之后在局域网内发出广播
dhcp服务器响应该广播,客户端获得IP地址,以及一些额外信息,比如tfpt服务器的IP,需要下载的文件等
客户端从tftp服务器中获取需要的启动文件(pxelinux.0)及其配置文件
客户端通过指定方式获取自动应答文件(ks.cfg),然后开始自动化安装
下面是完整过程:
dhcp服务:
安装
yum install -y dhcp
修改配置文件/etc/dhcp/dhcpd.conf,内容如下:
subnet 192.168.80.0 netmask 255.255.255.0 { range 192.168.80.100 192.168.80.110; option domain-name-servers 192.168.80.12; option domain-name "fhjjabba.com"; option routers 192.168.80.2; option broadcast-address 192.168.80.255; default-lease-time 600; max-lease-time 7200; next-server 192.168.80.12; filename "/pxelinux.0"; }
上面的配置中除了最后两句之外,其它的配置项都可以直接从示例配置中复制过来修改,示例文件是/usr/share/doc/dhcp-4.1.1/dhcpd.conf.sample,关于dns的配置不是必须的(据说是)。
next-server用于指定tftp服务器的地址,filename则指定要从该服务器下载的文件,其中的路径"/"并非指操作系统的根,而是tftp服务自己的根,下面讲到tftp服务配置时再细说。
配置好了以后可以启动服务了
service dhcpd start
这里需要注意的是,dhcpd.conf中必须至少有一个subnet与当前主机处于同一网段,否则dhcp服务将启动失败。根据以上配置,我当前的主机必须有一个192.168.80.0/24的地址。
tftp服务:
安装
yum install -y tftp-server
因为tftp服务是由xinetd管理的,所以其配置文件是/etc/xinetd.d/tftp,修改后内容如下:
service tftp { socket_type = dgram protocol = udp wait = yes user = root server = /usr/sbin/in.tftpd server_args = -s /var/lib/tftpboot disable = no per_source = 11 cps = 100 2 flags = IPv4 }
其实只是将disable = yes改成了disable = no,然后重启xinetd
service xinetd restart
检验tftp服务是否已经启动
netstat -ulnp | grep :69
能看到结果说明tftp正常启动了。
这里重点关注一下tftp配置文件中的server_args项,后面的值是/var/lib/tftpboot,这就是tftp服务的根目录,所以上面提到的"/pxelinux.0"文件的完整路径应该是/var/lib/tftpboot/pxelinux.0。
接下来为客户端准备一些必要文件。
包括内核vmlinuz,内存映像initrd.img,引导程序pxelinux.0。
首先挂载系统光盘到/mnt/cdrom
mkdir /mnt/cdrom mount /dev/cdrom /mnt/cdrom
复制其中的内核和内存映像
cp /mnt/cdrom/isolinux/{vmlinuz,initrd.img} /var/lib/tftpboot
另外还有很多教程说要复制/mnt/cdrom/isolinux/下的boot.msg和vesamenu.c32两个文件,这些都不是必须的,boot.msg是系统启动时输出的一些提示信息,vesamenu.c32是一个菜单。这里我就不复制了,待会修改配置时把它们去掉就好。
然后是引导程序pxelinux.0,它是由syslinux包提供的,所以要安装syslinux
yum install -y syslinux
装好后就可以复制了
cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot
客户端下载了pxelinux.0后还会下载其配置文件,该配置文件规定放在tftp根目录下的名为pxelinux.cfg的目录中,所以先创建这个目录
mkdir /var/lib/tftpboot/pxelinux.cfg
配置文件可以直接复制/mnt/cdrom/isolinux下的isolinux.cfg,名称默认为default
cp /mnt/cdrom/isolinux/isolinux.cfg /var/lib/tftpboot/pxelinux.cfg/default
然后为了修改这个配置文件,还需要修改其权限
chmod u+w /var/lib/tftpboot/pxelinux.cfg/default
我的配置如下:
#default vesamenu.c32 default linux prompt 0 #display boot.msg label linux menu label ^Install or upgrade an existing system menu default kernel vmlinuz append initrd=initrd.img ks=nfs:192.168.80.12:/nfs_share/ks.cfg
有两行以“#”开头的是注释,就是刚才没有复制到的两个文件。
注意第二行default linux和下面的label linux,这两项是对应的,表示默认就使用label linux下面的配置。重点关注label linux下面第四行的ks=...这一项,是我自己加上的,意思是指定系统安装过程中的自动应答文件,根据实际情况自己填写,如果是http或ftp的话格式就是http://ip/path/to/ks.cfg。
nfs服务:
安装
yum install -y nfs-utils
然后设置需要共享的目录,我设的是/nfs_share,配置文件是/etc/exports
mkdir /nfs_share echo "/nfs_share *(ro,async,nohide,crossmnt)" >> /etc/exports
exports文件说明了nfs需要共享的目录,这里建议加上nohide和crossmnt两个选项,不然客户端有可能无法挂载。
然后在共享目录中提供自动应答文件,我直接复制/root下的anaconda-ks.cfg了
cp ~/anaconda-ks.cfg /nfs_share/ks.cfg
然后手动编辑ks.cfg。
里面具体每一项我就不多说了,下面是我的配置:
# Kickstart file automatically generated by anaconda. #version=DEVEL install text key --skip nfs --server=192.168.80.12 --dir=/nfs_share/cdrom lang en_US.UTF-8 keyboard us network --onboot yes --device eth0 --bootproto dhcp --noipv6 rootpw --iscrypted $6$9ZnVhZodnRm03BDB$0bVVH1uMQeHmUbKTRuaNas2wrJYebJwIa6RQTcdqOFVn0Qw/fVwowbcdGx9zhs9xL7/kvSouyeVkUbAefZtO60 firewall --service=ssh authconfig --enableshadow --passalgo=sha512 selinux --permissive timezone Asia/Shanghai bootloader --location=mbr --driveorder=sda --append="crashkernel=auto rhgb quiet" reboot clearpart --all --drives=sda zerombr part /boot --fstype=ext3 --size=100 part / --fstype=ext3 --size=5120 part /usr --fstype=ext3 --size=10240 part /home --fstype=ext3 --size=5120 part swap --size=1024 %packages --nobase @core %end
注意nfs那一项,指定了nfs服务器的ip和系统镜像所在的目录(即系统安装过程中需要下载的各种安装包),我把系统光盘挂在了/nfs_share/cdrom下,这里就要指定这个目录而不是/nfs_share。另外,因为这个目录是/nfs_share的子目录,所以在/etc/exports中就要指定nohide和crossmnt两个选项。
因为此前系统光盘已经挂在了/mnt/cdrom下,所以可以用下面的方式再次挂载
mount --bind /mnt/cdrom /nfs_share/cdrom
这样就同时存在有两个入口了。
还有那个rootpw项就是设置root密码的,后面一长串是我设的密码加密后的结果,你可以根据自己需要设置,利用grub-crypt命令即可
# grub-crypt Password: Retype password: $6$eHcHyEchzEgZAkMl$dUvm9Ik06ZeYfIlFPeYsNhGqczu7SbkP19bupWj2RUQnZzjKrr9SJ03/Q9e8gHRTXCWDkcZHsExH6WtzIMiCe.
就是把最后的结果复制粘贴进去即可。
如果忘记做这一步,那么登陆系统就要输入我设置的密码咯,所以你要改密码,可以在grub引导界面给内核添加一个启动参数,在后面加上“1”或“s”即可,具体方法还是去google一下吧,忘记root密码的人太多了。。。
因为这个配置文件是从root的家目录复制出来的,所以还要修改权限让所有人可读,否则客户端将无法下载该文件
chmod +r /nfs_share/ks.cfg
然后启动nfs服务即可
service nfs start
好了,完整配置过程已经完成,接下来就可以新建一台机器做实验了。
不过还有几点需要说明一下:
新建的虚拟机要与dhcp服务器在同一个局域网中,而且尽量不要出现多个dhcp服务器,所以最好就是把两台虚拟机放在host-only网络中。
新建虚拟机时的虚拟磁盘要马上分配足够大小的空间,否则安装时会出现无法分配足够磁盘空间的错误。例如我的ks.cfg中配置的分区加起来有21+G,那么新建虚拟磁盘最好就立即分配25G,然后才能顺利安装。
如果客户端获得ip地址后无法连接tftp服务器,即出现连接超时的情况,就把selinux和iptables都关掉。
第一次在51CTO上写博客,做得不好的地方还请各位见谅,哪里写得不对请委婉指出,有问题可以提出来一起讨论。