RHEL4にkeepalivedをインストール

仕事の都合上RHEL4にkeepalivedをインストールすることになった。
CentOSでは何度か行っているが、RedHatでは少々変更する必要があったのでメモ。

環境

手順

インストール済カーネルソースをコピー

keepalivedコンパイル時にカーネルソースを指定する必要があるが、今回はソースに手に加える必要があったのでソース全体をコピーしておく。

$ cp -r /usr/src/kernels/2.6.9-67.EL-ppc64 /usr/src/kernels/make_keeepalived_2.6.9-67.EL-ppc64
keepalivedダウンロード&解凍
$ cd /usr/local/src
$ wget http://www.keepalived.org/software/keepalived-1.1.15.tar.gz
$ tar xvzf keepalived-1.1.15.tar.gz
カーネルソースダウンロード&解凍
$ wget -c http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.9.tar.gz
$ tar xvzf linux-2.6.9.tar.gz
net/coreをコピー

デフォルトのカーネルソースではLinkWatchのインストールができないので、DLカーネルソースnet/coreをコピー

$ cd linux-2.6.9
$ cp net/core /usr/src/kernels/make_keeepalived_2.6.9-67.EL-ppc64
config.h修正

この状態でmakeを行うと以下のエラーが発生

gcc -g -O2  -I/usr/src/kernels/make_keepalived_2.6.9-67.EL-ppc64/include -I../include -I../../lib -Wall 
-Wunused -Wstrict-prototypes -D_KRNL_2_6_ -D_WITH_LVS_ -D_WITH_VRRP_  -c main.c
/usr/src/kernels/make_keepalived_2.6.9-67.EL-ppc64/include/asm/cputable.h:18 から include されたファイル中,
                 /usr/src/kernels/make_keepalived_2.6.9-67.EL-ppc64/include/asm/elf.h:6 から,
                 /usr/src/kernels/make_keepalived_2.6.9-67.EL-ppc64/include/asm/sigcontext.h:12 から,
                 /usr/include/bits/sigcontext.h:28 から,
                 /usr/include/signal.h:333 から,
                 /usr/include/sys/wait.h:30 から,
                 ../include/main.h:30 から,
                 main.c:25 から:
/usr/src/kernels/make_keepalived_2.6.9-67.EL-ppc64/include/linux/config.h:6:2: #error including kernel header in userspace;
 use the glibc headers instead!
make[2]: *** [main.o] エラー 1
make[2]: Leaving directory `/usr/local/src/keepalived-1.1.15/keepalived/core'
make[1]: *** [all] エラー 1
make[1]: Leaving directory `/usr/local/src/keepalived-1.1.15/keepalived'
make: *** [all] エラー 2

config.hを覗いてみる。

#ifndef _LINUX_CONFIG_H
#define _LINUX_CONFIG_H

#include <linux/autoconf.h>
#if !defined (__KERNEL__) && !defined(__KERNGLUE__)
#error including kernel header in userspace; use the glibc headers instead!
#endif
#endif

一方、DLカーネルソースのconfig.hは以下。

#ifndef _LINUX_CONFIG_H
#define _LINUX_CONFIG_H

#include <linux/autoconf.h>

#endif

どうやらRHELではむやみにカーネルソースを用いてコンパイル出来ないようになっている模様。
今回はconfig.hをDLカーネルソースで上書きして対応することに。

$ cp /usr/local/src/linux-2.6.9/include/linux/config.h /usr/src/kernels/make_keepalived_2.6.9-67.EL-ppc64/include/linux/
カーネルソースを指定してコンパイル&インストール

以上でRHEL用のカーネルソース変更が終わったので、コンパイル&インストールを行う。
※prefixにルートを指定しないと変な場所(設定ファイル=/usr/local/etc/keepalived 等)にインストールされる

$ ./configure --prefix="/" --with-kernel-dir=/usr/src/kernels/make_keeepalived_2.6.9-67.EL-ppc64/
$ make
$ make install