keepalivedをRPMでアップデートする際にはまった問題

2013/12/26

年の瀬ですね。 さて、先日よりkernelと特定CPUの組み合わせで起こる『新208.5日問題』が話題となりました。

208.5 日問題の逆襲: 熊猫さくらのブログ 新208.5日問題 - Systems with Intel® Xeon® Processor E5 hung after upgrade of Red Hat Enterprise Linux 6 上記の分かりやすい解説をご覧いただければと思います。

で、ばっちり要対応のサーバばかりでしたので、せっせこ作業をすすめておりました。 そのなかでLVSとして利用しているkeepalived、これkernelあげたらリコンパイルしないとだめだよね、 というのがあり、そのmake時にちょっとハマったのでここに残すようにします。

以前は KeepalivedによるロードバランサLVS構築 - RLB 上記の手順を参考にしてkeepalived-1.2.7をRPM化し利用していました。

yum -y install ipvsadm iproute curl make kernel kernel-devel rpm-build openssl-devel popt popt-devel gcc net-snmp-devel libnl-devel
useradd rpm
su rpm

### User `rpm' ###
cd ${HOME}
wget http://すでにダウンロードしていたソース置き場サーバ/peth/to/keepalived-1.2.7.tar.gz
tar xzvf keepalived-1.2.7.tar.gz
mkdir -p ${HOME}/rpmbuild/SOURCES
cp keepalived-1.2.7.tar.gz ${HOME}/rpmbuild/SOURCES/
cd ${HOME}/keepalived-1.2.7
./configure --enable-snmp
make rpm
exit
### User `rpm' ###

yum install -y /home/rpm/rpmbuild/RPMS/x86_64/keepalived-1.2.7-5.x86_64.rpm

はい。 これでkeepalived-1.2.7はインストールされました。 で、これをkernelアップデート後、最新のバージョンであるkeepalived-1.2.9にあげようという魂胆でした。 以下のような手順で簡単に上がるのだろうと考えていました。

# すでにkernel-2.6.32-358.23.2.el6にアップデートされrebootも行ったものとする。#
yum update -y kernel-devel
su rpm

### User `rpm' ###
cd ${HOME}
wget http://すでにダウンロードしていたソース置き場サーバ/peth/to/keepalived-1.2.9.tar.gz
tar xzvf keepalived-1.2.9.tar.gz
mkdir -p ${HOME}/rpmbuild/SOURCES
cp keepalived-1.2.9.tar.gz ${HOME}/rpmbuild/SOURCES/
cd ${HOME}/keepalived-1.2.9
./configure --enable-snmp
make rpm
exit
### User `rpm' ###

yum install -y /home/rpm/rpmbuild/RPMS/x86_64/keepalived-1.2.9-5.x86_64.rpm

ところが make rpm の最中に以下行を確認して「あれれおかしいな」と感じた次第。

(snip)
gcc -O2 -g  -I/lib/modules/2.6.32-358.18.1.el6/build/include -I/lib/modules/2.6.32-358.18.1.el6/build/include -I../include -I../../lib -Wall -Wunused -Wstrict-prototypes -D_KRNL_2_6_ -D_WITH_LVS_ -D_WITH_VRRP_ -D_WITHOUT_SNMP_  -c main.c
(同様のgcc行多数)
(snip)

アップデートしたはずの、`2.6.32-358.23.2.el6'を見てくれていないようです。

原因は以下にありました。

grep -n 'define kernel' /home/rpm/keepalived-1.2.9/keepalived.spec.in
5:%define kernel %(rpm -q kernel-devel --qf '%{RPMTAG_VERSION}-%{RPMTAG_RELEASE}\\n' 2>/dev/null | head -1)

この %(rpm -q kernel-devel –qf ’%{RPMTAGVERSION}-%{RPMTAGRELEASE}\n’ 2>/dev/null | head -1) が思ったように動いてくれなかったようです。

rpm -q kernel-devel --qf '%{RPMTAG_VERSION}-%{RPMTAG_RELEASE}\\n' 2>/dev/null | head -1
2.6.32-358.18.1.el6\n2.6.32-358.23.2.el6\n

とyum update kernel-develを実行したサーバにおいては、 『2.6.32-358.18.1.el6\n2.6.32-358.23.2.el6\n』と二つのバージョンが改行区切りの混在した形で出力されるようで、 動作をみている限りでは、前者である「2.6.32-358.18.1.el6」をdefine kernelした模様。 なので

yum remove kernel-devel
yum install kernel-devel-2.6.32-358.23.2.el6.x86_64

とした上でkeepalivedのリコンパイルを行った次第です。

気になったのが、今までkernel-develをupdateすることはあっても、 いちいちremoveして新しいものを改めて入れる、なんてことはしたことがありませんでした。 このように「いちいちremoveして新しいバージョンのkernel-develを改めて入れる」というのが、 通常の手順なのでしょうか。 それともkeepalivedの

%(rpm -q kernel-devel --qf '%{RPMTAG_VERSION}-%{RPMTAG_RELEASE}\\n' 2>/dev/null | head -1)

が変だ、という話なのでしょうか。 そのあたり疑問に残った次第であります。

それでは皆様、よい年越しを。