radhat7下安装keepalived

2016/7/22 posted in  linux

radhat7下安装keepalived

相比于ubuntu的apt-get方式,只需要一个命令行就能解决了。radhat 安装一般都只能首先用yum或者rpm安装依赖包,然后再通过下载安装包make的方式进行安装,在radhat7下遇到了不少问题。

首先上一下现在radhat7的内核版本:

[root@nginx-master ~]# uname -a
Linux nginx-master.hbglky.com 3.10.0-123.el7.x86_64 #1 SMP Mon May 5 11:16:57 EDT 2014 x86_64 x86_64 x86_64 GNU/Linux

当前内核版本的3.10,而网上大多数都是使用2.6左右的内核版本进行安装的,所以一些建议也基本不适用。

安装过程

安装所需环境:

1.gcc

安装命令:yum install gcc gcc-c++

2.openssl-devel ,openssl

安装命令:yum install openssl-devel openssl
3.源码内核的

安装命令:yum install kernel-devel kernel

建立软连接:ln -s _usr_src_kernels_内核名称/ _usr_src/linux

4.popt-devel,libnl-devel

安装命令:yum install popt-devel libnl-devel

这些都是基本的依赖包

安装命令

安装命令行:

[root@localhost ~]#  wget http://www.keepalived.org/software/keepalived-1.2.19.tar.gz
[root@localhost ~]#  tar zxvf keepalived-1.2.19.tar.gz
[root@localhost ~]#  cd keepalived-1.2.19
[root@localhost keepalived-1.2.19]#  ./configrure
[root@localhost keepalived-1.2.19]#  make && make install

我下载的1.2.19的版本。

用这种安装方式,在make的时候肯定会报错,基本报错信息如下:

gcc -g -O2  -I/usr/src/linux/include -I../include -I../../lib -Wall -Wunused -Wstrict-prototypes -D_KRNL_2_6_ -D_WITHOUT_LVS_ -D_WITH_VRRP_  -c smtp.c
In file included from /usr/include/linux/if_addr.h:4:0,
                 from ../include/vrrp_ipaddress.h:32,
                 from ../include/vrrp.h:31,
                 from ../include/smtp.h:34,
                 from smtp.c:27:
/usr/src/linux/include/linux/types.h:14:33: 错误:与‘fd_set’类型冲突
 typedef __kernel_fd_set         fd_set;
                                 ^
In file included from /usr/include/sys/types.h:219:0,
                 from /usr/include/sys/uio.h:24,
                 from /usr/include/sys/socket.h:27,
                 from /usr/include/netinet/in.h:24,
                 from /usr/include/netdb.h:27,
                 from ../include/smtp.h:27,
                 from smtp.c:27:
/usr/include/sys/select.h:75:5: 附注:‘fd_set’的上一个声明在此
   } fd_set;
     ^
In file included from /usr/include/linux/if_addr.h:4:0,
                 from ../include/vrrp_ipaddress.h:32,
                 from ../include/vrrp.h:31,
                 from ../include/smtp.h:34,
                 from smtp.c:27:
/usr/src/linux/include/linux/types.h:15:25: 错误:与‘dev_t’类型冲突
 typedef __kernel_dev_t  dev_t;
                         ^
In file included from /usr/include/sys/uio.h:24:0,
                 from /usr/include/sys/socket.h:27,
                 from /usr/include/netinet/in.h:24,
                 from /usr/include/netdb.h:27,
                 from ../include/smtp.h:27,
                 from smtp.c:27:
/usr/include/sys/types.h:60:17: 附注:‘dev_t’的上一个声明在此
 typedef __dev_t dev_t;
                 ^
In file included from /usr/include/linux/if_addr.h:4:0,
                 from ../include/vrrp_ipaddress.h:32,
                 from ../include/vrrp.h:31,
                 from ../include/smtp.h:34,
                 from smtp.c:27:
/usr/src/linux/include/linux/types.h:19:17: 错误:与‘nlink_t’类型冲突
 typedef __u32   nlink_t;
                 ^
In file included from /usr/include/sys/uio.h:24:0,
                 from /usr/include/sys/socket.h:27,
                 from /usr/include/netinet/in.h:24,
                 from /usr/include/netdb.h:27,
                 from ../include/smtp.h:27,
                 from smtp.c:27:
/usr/include/sys/types.h:75:19: 附注:‘nlink_t’的上一个声明在此
 typedef __nlink_t nlink_t;
                   ^
In file included from /usr/include/linux/if_addr.h:4:0,
                 from ../include/vrrp_ipaddress.h:32,
                 from ../include/vrrp.h:31,
                 from ../include/smtp.h:34,
                 from smtp.c:27:
/usr/src/linux/include/linux/types.h:25:26: 错误:与‘timer_t’类型冲突
 typedef __kernel_timer_t timer_t;
                          ^
In file included from smtp.c:25:0:
/usr/include/time.h:103:19: 附注:‘timer_t’的上一个声明在此
 typedef __timer_t timer_t;
                   ^
In file included from /usr/include/linux/if_addr.h:4:0,
                 from ../include/vrrp_ipaddress.h:32,
                 from ../include/vrrp.h:31,
                 from ../include/smtp.h:34,
                 from smtp.c:27:
/usr/src/linux/include/linux/types.h:45:26: 错误:与‘loff_t’类型冲突
 typedef __kernel_loff_t  loff_t;
                          ^
In file included from /usr/include/sys/uio.h:24:0,
                 from /usr/include/sys/socket.h:27,
                 from /usr/include/netinet/in.h:24,
                 from /usr/include/netdb.h:27,
                 from ../include/smtp.h:27,
                 from smtp.c:27:
/usr/include/sys/types.h:44:18: 附注:‘loff_t’的上一个声明在此
 typedef __loff_t loff_t;
                  ^
In file included from /usr/include/linux/if_addr.h:4:0,
                 from ../include/vrrp_ipaddress.h:32,
                 from ../include/vrrp.h:31,
                 from ../include/smtp.h:34,
                 from smtp.c:27:
/usr/src/linux/include/linux/types.h:111:17: 错误:与‘uint64_t’类型冲突
 typedef  __u64  uint64_t;
                 ^
In file included from /usr/lib/gcc/x86_64-redhat-linux/4.8.2/include/stdint.h:9:0,
                 from /usr/include/netinet/in.h:23,
                 from /usr/include/netdb.h:27,
                 from ../include/smtp.h:27,
                 from smtp.c:27:
/usr/include/stdint.h:55:27: 附注:‘uint64_t’的上一个声明在此
 typedef unsigned long int uint64_t;
                           ^
In file included from /usr/include/linux/if_addr.h:4:0,
                 from ../include/vrrp_ipaddress.h:32,
                 from ../include/vrrp.h:31,
                 from ../include/smtp.h:34,
                 from smtp.c:27:
/usr/src/linux/include/linux/types.h:112:17: 错误:与‘u_int64_t’类型冲突
 typedef  __u64  u_int64_t;
                 ^
In file included from /usr/include/sys/uio.h:24:0,
                 from /usr/include/sys/socket.h:27,
                 from /usr/include/netinet/in.h:24,
                 from /usr/include/netdb.h:27,
                 from ../include/smtp.h:27,
                 from smtp.c:27:
/usr/include/sys/types.h:203:1: 附注:‘u_int64_t’的上一个声明在此
 __u_intN_t (64, __DI__);
 ^
In file included from /usr/include/linux/if_addr.h:4:0,
                 from ../include/vrrp_ipaddress.h:32,
                 from ../include/vrrp.h:31,
                 from ../include/smtp.h:34,
                 from smtp.c:27:
/usr/src/linux/include/linux/types.h:113:17: 错误:与‘int64_t’类型冲突
 typedef  __s64  int64_t;
                 ^
In file included from /usr/lib/gcc/x86_64-redhat-linux/4.8.2/include/stdint.h:9:0,
                 from /usr/include/netinet/in.h:23,
                 from /usr/include/netdb.h:27,
                 from ../include/smtp.h:27,
                 from smtp.c:27:
/usr/include/stdint.h:40:19: 附注:‘int64_t’的上一个声明在此
 typedef long int  int64_t;
                   ^
In file included from /usr/include/linux/if_addr.h:4:0,
                 from ../include/vrrp_ipaddress.h:32,
                 from ../include/vrrp.h:31,
                 from ../include/smtp.h:34,
                 from smtp.c:27:
/usr/src/linux/include/linux/types.h:134:23: 错误:与‘blkcnt_t’类型冲突
 typedef unsigned long blkcnt_t;
                       ^
In file included from /usr/include/sys/uio.h:24:0,
                 from /usr/include/sys/socket.h:27,
                 from /usr/include/netinet/in.h:24,
                 from /usr/include/netdb.h:27,
                 from ../include/smtp.h:27,
                 from smtp.c:27:
/usr/include/sys/types.h:235:20: 附注:‘blkcnt_t’的上一个声明在此
 typedef __blkcnt_t blkcnt_t;  /* Type to count number of disk blocks.  */
                    ^
In file included from /usr/src/linux/include/linux/kernel.h:6:0,
                 from /usr/src/linux/include/linux/skbuff.h:17,
                 from /usr/src/linux/include/linux/netlink.h:6,
                 from /usr/include/linux/if_addr.h:5,
                 from ../include/vrrp_ipaddress.h:32,
                 from ../include/vrrp.h:31,
                 from ../include/smtp.h:34,
                 from smtp.c:27:
/usr/src/linux/include/linux/linkage.h:7:25: 致命错误:asm/linkage.h:没有那个文件或目录
 #include <asm/linkage.h>
                         ^
编译中断。
make[2]: *** [smtp.o] 错误 1
make[2]: 离开目录“/opt/keepalived-1.2.2/keepalived/core”
make[1]: *** [all] 错误 1
make[1]: 离开目录“/opt/keepalived-1.2.2/keepalived”
make: *** [all] 错误 2

网上有一堆的解决方案,基本上都是1.2.2版本的,或者其他版本,然后其内核编译都在2.6左右,这种方式的解决都是不适用的。

这里介绍内核在radhat 3.8 到radhat 3.10左右的解决方案:

在configure的时候需要带上一下参数,才能解决,主要是build和with-kernel-dir两个参数起重要作用。

./configure --prefix=/usr --sysconfdir=/etc --mandir=/usr/man --docdir=/usr/doc/keepalived-1.2.19 --build=x86_64-slackware-linux --with-kernel-dir=/usr/src/linux/include/uapi

注意后面的--with-kernel-dir=_usr_src_linux_include/uapi 这个一定要带上。

这样configure后才能成功的编译上,在make的时候不会报错。

解决方案源地址:

http://www.linuxquestions.org/questions/linux-networking-3/problem-compiling-keepalived-1-2-15-a-4175534278-print/

主备状态问题

keepalived 的主备之间会使用112端口进行状态监控,如果这个端口不通会导致两台主机都是主的状态。

所以在防火墙上需要把这个端口间的互通打开。