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

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

## 症状

```bash
$ sudo yum upgrade
```

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

## 1. 常套手段

### RPM DB をクリアして、改めてキャッシュしてもらう
```bash
$ 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 の場合はこれで直る)
```bash
$ 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` でとりあえずアンインストール.

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

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

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

```bash
$ 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

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

```bash
$ sudo yum remove zlib
```

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

```bash
$ sudo yum install zlib
```

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

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

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

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

### strace コマンドを使う.

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

```bash
$ sudo yum install strace
$ strace -V
```

> strace -- version 4.5.19

で OK.

### strace で何をするのか

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

```bash
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^)ﾉｼ