Cent の Yum さんが Segmentation fault と言ってきたときの対処方法


Cent の Yum さんが癇癪を起してしまったら

症状

$ sudo yum upgrade

とかやろうとすると、 Segmentation Fault とか怒鳴り散らしてこっちの仕事を邪魔してくる.
もしくは セグメンテーション違反です とか言って罵ってくる.

1. 常套手段

RPM DB をクリアして、改めてキャッシュしてもらう

$ sudo rm -rf /var/lib/rpm/__db.* && sudo rpm --rebuilddb && sudo yum clean all && sudo yum makecache

RPM の DB クリアして、リビルドして、yum さんの短期記憶も消して、もう一回記憶を作り直す.

2. 上記でも SegFault ってなった場合

インストール済みの Zlib をアンインストールする (特に 1.2.5 の場合はこれで直る)

$ sudo rpm -qa | grep zlib

まずバージョン確認. 1.2.5 とかなってたらバージョンダウンしておきましょう.

zlib-1.2.5-xx.el6.x86_64
zlib-devel-1.2.5-xx.el6.x86_64

その後、zlib さんがどこにいるか確認して抹殺します.
自分で make install したんなら、そこで make uninstall でとりあえずアンインストール.

$ cd /usr/local/bin/zlib1.2.5/
$ make uninstall

あとはもう一回 zlib-1.2.3 をインストールすれば OK.

番外として、これは RPM インストールした場合の探し方.
何故 RPM で 1.2.5 をインストールしたんでしょう….

$ sudo rpm -ql zlib

/lib64/libz.so.1
/lib64/libz.so.1.2.5
/usr/share/doc/zlib-1.2.5
/usr/share/doc/zlib-1.2.5/ChangeLog
/usr/share/doc/zlib-1.2.5/FAQ
/usr/share/doc/zlib-1.2.5/README

ふむ、こんな感じ.
あとは

$ sudo yum remove zlib

とかで削除して、もう一回

$ sudo yum install zlib

とかすると宜し.
標準外のリポジトリを使わなければ、大体 1.2.3 とかがインストールされるはず. されなかったらバージョン指定してインストールしてください.

3. そもそも zlib のインストールなんかしてなかったし、確認したら zlib-1.2.3 だった人向け.

実はこの記事を書こうとしたきっかけ.

この場合、yum.log にも出てないし、どうしろってんだとお手上げの人が多い.
もったいない!

strace コマンドを使う.

strace --V って打っても使えない人は

$ sudo yum install strace
$ strace -V

strace -- version 4.5.19

で OK.

strace で何をするのか

yum upgrade のプロセスを監視しましょ.

strace yum upgrade

これだけで OK. 簡単でしょ?

なんかものすごい勢いで文字が出てきますが、必ずどっかで停止します.
そうするとどうでしょう、以下のような感じで出力されていませんか?

fstat(11, {st_mode=S_IFREG|0644, st_size=10240, ...}) = 0
lseek(11, 24, SEEK_SET) = 24
read(11, "\0\0\0\10\0\0\0\n\0\0\0\0\0\0\0\0", 16) = 16
fstat(11, {st_mode=S_IFREG|0644, st_size=10240, ...}) = 0
access("/var/cache/yum/x86_64/6/mod-pagespeed/primary.xml.gz.sqlite-wal", F_OK) = -1 ENOENT (No such file or directory)
fstat(11, {st_mode=S_IFREG|0644, st_size=10240, ...}) = 0
fcntl(11, F_SETLK, {type=F_UNLCK, whence=SEEK_SET, start=0, len=0}) = 0
futex(0x7f2bfd845fa0, FUTEX_WAKE_PRIVATE, 2147483647) = 0
gettimeofday({1419945996, 413547}, NULL) = 0
stat("/var/cache/yum/x86_64/6/mod-pagespeed/primary.xml.gz", {st_mode=S_IFREG|0644, st_size=6276, ...}) = 0
stat("/var/cache/yum/x86_64/6/mod-pagespeed/primary.xml.gz", {st_mode=S_IFREG|0644, st_size=6276, ...}) = 0
stat("/var/cache/yum/x86_64/6/mod-pagespeed/primary.xml.gz", {st_mode=S_IFREG|0644, st_size=6276, ...}) = 0
open("/var/cache/yum/x86_64/6/mod-pagespeed/primary.xml.gz", O_RDONLY) = 12
lseek(12, 0, SEEK_CUR) = 0
read(12, "\37\213\10\10\0\0\0\0\2\377/auto/chromeclient/bui"..., 8192) = 6276
read(12, "", 1916) = 0
--- SIGSEGV (Segmentation fault) @ 0 (0) ---
+++ killed by SIGSEGV +++
セグメンテーション違反です

おっと.

mod_pagespeed でコケてるのが分かりましたね.

これは自分の場合でしたが、皆さんの環境の抱える問題によって様々な結果が出てくると思います.

結局今回は /etc/yum.repos.d/mod_pagespeed.repo が悪さをしていた(enable=1のままだった)のが原因だったので、 enable=0 にして再度 yum upgrade を試してみたら問題なく upgrade が出来るようになりました.

4. 結論

結構こういうところで詰まってる人も多いですが、基本中の基本をば.

「自分で追加した yum リポジトリは、標準で enable=1 にしないこと. 必要な時、必要なものだけを --enablerepo オプションで追加する」

それでは良きエンジニアライフを(^w^)ノシ