声明:这篇文章是前面是拾人牙慧,我是结合 http://www.111cn.net/sys/linux/59969.htm 和 http://www.cnblogs.com/mchina/p/centos-pxe-kickstart-auto-install-os.html 两篇博客写的。
后面关于IP的部分是自己的
一:系统环境
实验平台:win7,VMware 12.0.0 build-2985596
要安装的系统:CentOS 6.7 64位
要安装的软件:hadoop 1.2.1,java
假设每台机器的网卡都是eth0
二:实验步骤
1.在VMware上先安装一个CentOS 6.7 64,网络采用桥接模式;这台机器是DHCP服务器,HTTP服务器,TFTP服务器一体的;这里假设它的IP是192.168.0.57,并且为了方便,我把这台机器叫server,下面所有的配置都是在server上进行的。
2.关闭server的防火墙和selinux
service iptables stop #临时关闭防护墙
setenforce 0 #临时关闭selinux
3.安装并配置http服务
yum -y install httpd #安装httpd
/etc/init.d/httpd start #启动http服务
mkdir -p /var/www/html/ #http服务默认的根目录就是这个文件夹,如果没有的话就新建
http服务默认的端口是80,可以在 /var/www/html/中随便放一个文件如test.txt ,然后在浏览器中输入 http://192.168.0.57:80/test.txt 看看是否显示
4.挂载Centos的ISO文件
使用任何方法找一个CentOS的ISO文件,我用的是CentOS-6.7-x86_64-bin-DVD1.iso,把它放入server中某一个位置,我放在 /root 文件夹中(因为是用root操作server的)
mkdir -p /var/www/html/os #新建一个os文件夹用来存放ISO中的所有文件
mount -t iso9660 -o loop /root/CentOS-6.7-x86_64-bin-DVD1.iso /var/www/html/os #把ISO挂载到os文件夹下
cd /var/www/html/os & ll #看看是否挂载成功
5.配置TFTP服务
yum -y install tftp-server
修改配置文件:/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 #修改的是这行,原来是yes,改为no
per_source = 11
cps = 100 2
flags = IPv4
}
/etc/init.d/xinetd restart #因为tftp服务是挂载在超级进程xinetd 下的,所以通过启动xinetd 来启动tftp服务。
6.配置DHCP服务
yum -y install dhcp
cp -f /usr/share/doc/dhcp-4.1.1/dhcpd.conf.sample /etc/dhcp/dhcpd.conf #注意这里的4.1.1是dhcp的版本,可能会不一样
修改/etc/dhcp/dhcpd.conf 配置文件,内容如下:
ddns-update-style interim; ignore client-updates; filename "pxelinux.0"; #pxelinux 启动文件位置; next-server 192.168.0.57; #这里是server的IP地址 subnet 192.168.111.0 netmask 255.255.255.0 { option routers 192.168.0.57; #这里还是server的IP地址 option subnet-mask 255.255.255.0; range dynamic-bootp 192.168.0.2 192.168.0.200; #这是分配的IP地址的范围 default-lease-time 21600; max-lease-time 43200; }
/etc/init.d/dhcpd start #启动DHCP服务
7.配置支持PXE的启动程序
cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/
cp /var/www/html/cdrom/images/pxeboot/initrd.img /var/lib/tftpboot/
cp /var/www/html/cdrom/images/pxeboot/vmlinuz /var/lib/tftpboot/
cp /var/www/html/cdrom/isolinux/*.msg /var/lib/tftpboot/
mkdir /var/lib/tftpboot/pxelinux.cfg
vi /var/lib/tftpboot/pxelinux.cfg/default #default中的所有内容如下,
default ks #默认启动的是 'label ks' 中标记的启动内核 prompt 1 #显示 'boot: ' 提示符。为 '0' 时则不提示,将会直接启动 'default' 参数中指定的内容。 timeout 6 #在用户输入之前的超时时间,单位为 1/10 秒。 display boot.msg #显示某个文件的内容,注意文件的路径。默认是在/var/lib/tftpboot/ 目录下。也可以指定位类似 '/install/boot.msg'这样的,路径+文件名。 F1 boot.msg #按下 'F1' 这样的键后显示的文件。 F2 options.msg F3 general.msg F4 param.msg F5 rescue.msg label linux #'label' 指定你在 'boot:' 提示符下输入的关键字,比如boot: linux[ENTER],这个会启动'label linux' 下标记的kernel 和initrd.img 文件。 kernel vmlinuz #kernel 参数指定要启动的内核。 append initrd=initrd.img #append 指定追加给内核的参数,能够在grub 里使用的追加给内核的参数,在这里也都可以使用。 label text kernel vmlinuz append initrd=initrd.img text label ks kernel vmlinuz append ks=http://192.168.0.57/ks.cfg initrd=initrd.img #告诉系统,从哪里获取ks.cfg文件 ,这里的IP是server的IP label local localboot 1 label memtest86 kernel memtest append -
8.安装Kickstart并配置ks.cfg文件
yum install system-config-kickstart
如果已经安装了X Windows 和Desktop,或者就是在图形环境中操作的server,那么运行命令
system-config-kickstart #启动图形界面,配置ks.cfg
如果没有图形界面,那也无所谓,自己生成个ks.cfg也可以。
按照下面的图形一步步来,最后 File -> Save 保存到 /var/www/html/文件夹下,文件名是ks.cfg
到这里server的所有配置项已经好了
10. 实验
再用VMware新建一个空白硬盘的虚拟器,网络还是桥接模式,启动之后会看到屏幕有一行DHCP:/ 然后就进入安装了
关于IP,在hadoop集群中有N多台机器,我需要知道它们的IP并把它们设置到DNS服务器中去,那么我们就需要一个方法收集所有机器的IP!另外每台机器的IP都应该是固定的,不应该是通过DHCP动态获得的!
1.关于收集IP,我一个思路,在server上配置NFS,假设把/ips文件夹共享出去,在每台机器上mount这个文件夹,同时在里面新建一个文件,文件的名称就是该台机器的IP
2.设置静态IP,这个只能通过修改/etc/sysconfig/network-scripts/ifcfg-eth0来进行
还记得上面第9步的最后一幅图吗?他是设置 Post-Installation Script,那么我们就可以写一个脚本,来实现上面的1,2两步,把下面的脚本拷贝到Post-Installation Script中去,当然该脚本还实现了其他功能,我都有注释。
其他功能包括添加hadoop用户,远程下载hadoop和java,配置PATH,mount hadoop的master服务器的公钥,配置dns,(如果用nfs分享hadoop的配置文件,下面也有)。
#declare -i number=$RANDOM*100/32768 #这两行我注释了,如果集群很大的话,最好取消注释。因为下面很多操作会访问http服务器,如果集群很大同时访问的话,http服务器可能会爆掉,所以先让主线程休眠随机的秒数再开始进行下面的工作 #sleep ${number}
NFS_SERVER_ID=192.168.0.57 #不是说要用NFS吗?这里就是NFS服务器的地址 NFS_SERVER_PATH_IPS=/ips #NFS服务器共享出去的文件夹,这个文件夹的作用是存放名称就是各台机器IP的文件
NFS_SERVER_PATH_HADOOP_CONF=/conf #干脆hadoop的配置文件也有NFS服务器提供吧^_^。这个文件夹的作用是存放hadoop的所有配置文件,不过这样做其实增大了风险,如果NFS服务器挂了。。。
NFS_SERVER_PATH_SSH=/ssh #要用NFS共享hadoop的master的公钥,这个文件夹的作用是存放master的公钥 PXE_URL=http://192.168.0.57 #http服务器的地址,我这里还提供了hadoop 和 java的下载; 还记得上面有个文件夹/var/www/html吗?把hadoop和java的gz压缩文件都放在/var/www/html下面就可以了 ROOT_DIR=/opt/modules # hadoop和java的安装地址 DNS=192.168.0.116 #大型集群肯定用DNS服务器啦,这个是DNS服务器的地址
#yum -y install rpcbind nfs-utils #每个datanode也是NFS的一个客户端,得装上客户端软件,我把这一行注释了,因为在生成ks.cfg文件时,在 Package Selection时可以选择 Servers -> NFS file server /etc/init.d/rpcbind start #就算是NFS的client,也得启动这两个服务 /etc/init.d/nfslock start chkconfig rpcbind on #开机启动,要不然hadoop就没有conf文件了!!! chkconfig nfslock on
useradd hadoop #添加一个用户 hadoop echo '123456' | passwd --stdin hadoop #把hadoop用户的密码设置为 123456 mkdir -p ${ROOT_DIR} #新建hadoop和java的安装根目录 cd ${ROOT_DIR} #进入安装根目录 #get hadoop and java wget "${PXE_URL}/jdk-7u79-linux-x64.tar.gz" "${PXE_URL}/hadoop-1.2.1.gz" #从http服务器上下载hadoop和java tar -xf jdk-7u79-linux-x64.tar.gz #解压hadoop tar -xf hadoop-1.2.1.gz #解压java chown -R hadoop ${ROOT_DIR} #把安装根目录下的所有文件和文件夹的所有者改成hadoop
rm -rf ${ROOT_DIR}/hadoop-1.2.1/conf/* #把hadoop现有的配置文件先都删除了
mount -t nfs ${NFS_SERVER_ID}:${NFS_SERVER_PATH_HADOOP_CONF} ${ROOT_DIR}/hadoop-1.2.1/conf/ #把远程的hadoop配置文件mount到本地 ROUTE=$(route -n|grep "^0.0.0.0"|awk '{print $2}') #一直到下面的红色的EOF都是设置静态IP,同时还设置了DNS BROADCAST=$(/sbin/ifconfig eth0|grep -i bcast|awk '{print $3}'|awk -F":" '{print $2}') HWADDR=$(/sbin/ifconfig eth0|grep -i HWaddr|awk '{print $5}') IPADDR=$(/sbin/ifconfig eth0|grep "inet addr"|awk '{print $2}'|awk -F":" '{print $2}') NETMASK=$(/sbin/ifconfig eth0|grep "inet addr"|awk '{print $4}'|awk -F":" '{print $2}') cat >/etc/sysconfig/network-scripts/ifcfg-eth0 <<EOF DEVICE=eth0 BOOTPROTO=static BROADCAST=$BROADCAST HWADDR=$HWADDR IPADDR=$IPADDR NETMASK=$NETMASK GATEWAY=$ROUTEroo ONBOOT=yes DNS1=$DNS EOF mkdir -p /ips mount -t nfs ${NFS_SERVER_ID}:${NFS_SERVER_PATH_IPS} /ips #把NFS远程文件夹mount到本地 touch /ips/${IPADDR} #在远程文件夹中新建一个文件,文件名称就是该机器的IP,那么在NFS服务器中就收集了整个集群的所有机器的IP
echo "export JAVA_HOME=${ROOT_DIR}/jdk1.7.0.79" >> /home/hadoop/.bash_profile #这三行只是为了操作java和hadoop时方便,也可以不要 echo "export HADOOP_HOME=${ROOT_DIR}/hadoop-1.2.1" >> /home/hadoop/.bash_profile echo "export PATH=${JAVA_HOME}/bin:${HADOOP_HOME}/bin:${HADOOP_HOME}/sbin:${PATH}" >> /home/hadoop/.bash_profile service network restart #重新启动网络服务,或者这里直接reboot也可以,反正是在装系统,装系统时重启不是很正常吗