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的时候不会报错。
解决方案源地址:
主备状态问题
keepalived 的主备之间会使用112端口进行状态监控,如果这个端口不通会导致两台主机都是主的状态。
所以在防火墙上需要把这个端口间的互通打开。