検証環境を構築する上で知ったこと

# 古い環境を再現する
古い環境の改修作業でアップグレードなどが要求された場合、依存関係で問題が起きたり、その他諸々リスクが高い。かといって古い環境だからdev環境があることも少ないため、自前で構築する。

##古いミドルウェアのパッケージが無い
remiやepelは必要なソフトウェアのパッケージをリポジトリとして持っているし、yumもパッケージ管理ツールとして、リポジトリを持っているが、最新版から少し古めのものは管理されていても、更に古いものは入っていない。
epelやremiでせっかくリポジトリを追加したとしても、listしてみても無いことが多い。

### パッケージ化とは
ソースからコンパイルしたソフトウェアそのものが既に作られている状態までしてあることです。コンパイル済みのバイナリと、関連するファイル群が揃っています。インストールした後にすぐ起動できることからよくわかると思います。

### パッケージ管理ツール
パッケージの依存関係を解決してくれるツール。CentOSではyumが使われています。


# 今回のオーダー

- CentOS 6.9
- Apache 2.2.27
- mysql5.6.21
- php 5.3.3

## epelとかremiを使ってみる
epelやremiはOSのバージョンに合ったパッケージ化されたリポジトリを網羅的に持っています。だからいっぱい入っています。マイナーバージョンまで揃えるならepelなどのリポジトリでかたがつきますが、リビジョン番号とビルド番号まで揃えるとなると限界がきます。
冒頭で言いましたが、網羅的とはいえ、アカシックレコードでは無いので過去の全てのバージョンのリポジトリを持っているわけではないです。新しいのから3番目くらいまでが残っている感じですね。赤本みたいです。

```
$ sudo yum enablerepo=remi list | grep php

php72-php-pecl-geospatial.x86_64       0.2.1-1.el6.remi             remi-safe
php72-php-pecl-gmagick.x86_64          2.0.5~RC1-1.el6.remi         remi-safe
php72-php-pecl-gnupg.x86_64            1.4.0-4.el6.remi             remi-safe
php72-php-pecl-hprose.x86_64           1.6.6-2.el6.remi             remi-safe
php72-php-pecl-hrtime.x86_64           0.6.0-2.el6.remi             remi-safe
php72-php-pecl-http.x86_64             3.2.0-1.el6.remi             remi-safe
php72-php-pecl-http-devel.x86_64       3.2.0-1.el6.remi             remi-safe
php72-php-pecl-igbinary.x86_64         3.0.0-1.el6.remi             remi-safe
php72-php-pecl-igbinary-devel.x86_64   3.0.0-1.el6.remi             remi-safe
php72-php-pecl-imagick.x86_64          3.4.3-9.el6.remi             remi-safe
php72-php-pecl-imagick-devel.x86_64    3.4.3-9.el6.remi             remi-safe
php72-php-pecl-inotify.x86_64          2.0.0-6.el6.remi             remi-safe
php72-php-pecl-ip2location.x86_64      8.0.1-1.el6.remi             remi-safe
php72-php-pecl-json-post.x86_64        1.0.1-7.el6.remi             remi-safe
php72-php-pecl-jsond.x86_64            1.4.0-1.el6.remi             remi-safe
php72-php-pecl-jsond-devel.x86_64      1.4.0-1.el6.remi             remi-safe
php72-php-pecl-krb5.x86_64             1.1.2-2.el6.remi             remi-safe
php72-php-pecl-krb5-devel.x86_64       1.1.2-2.el6.remi             remi-safe
php72-php-pecl-leveldb.x86_64          0.2.1-4.el6.remi             remi-safe
php72-php-pecl-libsodium.x86_64        1.0.7-1.el6.remi             remi-safe
php72-php-pecl-lua.x86_64              2.0.6-1.el6.remi             remi-safe
                                 .
                                 .
                                 .
                                 .
                                 .
```
とまあこんな具合に欲しいバージョンに限って出てこないです。
なんとかならないものか・・・

## で、出てくるのがrpmです。
これも同じくパッケージ化されたリポジトリです。
こちらの方はepelと違いOSにあった全てのパッケージを持ってくるのではなく、ピンポイントで必要なパッケージだけを持ってくることに特化しています。

[rpmパッケージ](https://pkgs.org/)
[mysqlのrpmパッケージ](https://yum.oracle.com/oracle-linux-6.html)

rpmのパッケージは公式に用意されていたり、rpmのまとめサイトなどにありますので、サーフィンして見つけます。

### rpmコマンドなんて使ってられねぇよ
rpmのコマンドを使って落っことそうとすると、パッケージ管理ツールでは無いので、依存関係を全く解消してくれません。

```
＄　sudo rpm -ivh http://mirror.centos.org/centos/6/os/i386/Packages/php-5.3.3-49.el6.i686.rpm

Retrieving http://mirror.centos.org/centos/6/os/i386/Packages/php-5.3.3-49.el6.i686.rpm
warning: /var/tmp/rpm-tmp.LIa6wA: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY
error: Failed dependencies:
	libbz2.so.1 is needed by php-5.3.3-49.el6.i686
	libc.so.6 is needed by php-5.3.3-49.el6.i686
	libc.so.6(GLIBC_2.0) is needed by php-5.3.3-49.el6.i686
	libc.so.6(GLIBC_2.1) is needed by php-5.3.3-49.el6.i686
	libc.so.6(GLIBC_2.1.3) is needed by php-5.3.3-49.el6.i686
	libc.so.6(GLIBC_2.11) is needed by php-5.3.3-49.el6.i686
	libc.so.6(GLIBC_2.2) is needed by php-5.3.3-49.el6.i686
	libc.so.6(GLIBC_2.2.3) is needed by php-5.3.3-49.el6.i686
	libc.so.6(GLIBC_2.3) is needed by php-5.3.3-49.el6.i686
	libc.so.6(GLIBC_2.3.4) is needed by php-5.3.3-49.el6.i686
	libc.so.6(GLIBC_2.4) is needed by php-5.3.3-49.el6.i686
	libc.so.6(GLIBC_2.7) is needed by php-5.3.3-49.el6.i686
	libc.so.6(GLIBC_2.8) is needed by php-5.3.3-49.el6.i686
	libcom_err.so.2 is needed by php-5.3.3-49.el6.i686
	libcrypt.so.1 is needed by php-5.3.3-49.el6.i686
	libcrypto.so.10 is needed by php-5.3.3-49.el6.i686
	libcrypto.so.10(OPENSSL_1.0.1) is needed by php-5.3.3-49.el6.i686
	libcrypto.so.10(libcrypto.so.10) is needed by php-5.3.3-49.el6.i686
	libdl.so.2 is needed by php-5.3.3-49.el6.i686
	libdl.so.2(GLIBC_2.0) is needed by php-5.3.3-49.el6.i686
	libdl.so.2(GLIBC_2.1) is needed by php-5.3.3-49.el6.i686
	libgmp.so.3 is needed by php-5.3.3-49.el6.i686
	libgssapi_krb5.so.2 is needed by php-5.3.3-49.el6.i686
	libk5crypto.so.3 is needed by php-5.3.3-49.el6.i686
	libkrb5.so.3 is needed by php-5.3.3-49.el6.i686
	libm.so.6 is needed by php-5.3.3-49.el6.i686
	libm.so.6(GLIBC_2.0) is needed by php-5.3.3-49.el6.i686
	libm.so.6(GLIBC_2.1) is needed by php-5.3.3-49.el6.i686
	libnsl.so.1 is needed by php-5.3.3-49.el6.i686
	libpcre.so.0 is needed by php-5.3.3-49.el6.i686
	libssl.so.10 is needed by php-5.3.3-49.el6.i686
	libssl.so.10(libssl.so.10) is needed by php-5.3.3-49.el6.i686
	libxml2.so.2 is needed by php-5.3.3-49.el6.i686
	libxml2.so.2(LIBXML2_2.4.30) is needed by php-5.3.3-49.el6.i686
	libxml2.so.2(LIBXML2_2.5.2) is needed by php-5.3.3-49.el6.i686
	libxml2.so.2(LIBXML2_2.6.0) is needed by php-5.3.3-49.el6.i686
	libxml2.so.2(LIBXML2_2.6.11) is needed by php-5.3.3-49.el6.i686
	libxml2.so.2(LIBXML2_2.6.5) is needed by php-5.3.3-49.el6.i686
	libz.so.1 is needed by php-5.3.3-49.el6.i686
	php-cli(x86-32) = 5.3.3-49.el6 is needed by php-5.3.3-49.el6.i686
	php-common(x86-32) = 5.3.3-49.el6 is needed by php-5.3.3-49.el6.i686
```
えらい依存関係です。当初これ一個一個調べて入れるのかと思っていましたが、このURLをyumにぶち込んであげれば依存関係を解消しながらインストールまで導いてくれます。

### yumでやってみる

```
$ sudo yum install http://mirror.centos.org/centos/6/os/i386/Packages/php-5.3.3-49.el6.i686.rpm

Loaded plugins: priorities, update-motd, upgrade-helper
php-5.3.3-49.el6.i686.rpm                                                                      | 1.1 MB  00:00:00
Examining /var/tmp/yum-root-X1uSqP/php-5.3.3-49.el6.i686.rpm: php-5.3.3-49.el6.i686
Marking /var/tmp/yum-root-X1uSqP/php-5.3.3-49.el6.i686.rpm to be installed
Resolving Dependencies
                                   .
                                   .
                                   .
                                   .
                                   .
```
Oh,Yum is Resolving Dependencies!!

### それでもエラーが出る

```
                                   .
                                   .
                                   .
                                   .
Error: Package: php-5.3.3-49.el6.i686 (/php-5.3.3-49.el6.i686)
           Requires: php-cli(x86-32) = 5.3.3-49.el6
Error: Package: php-5.3.3-49.el6.i686 (/php-5.3.3-49.el6.i686)
           Requires: php-common(x86-32) = 5.3.3-49.el6
```
仕方ないので、こいつを探しに行く。
php-cli(x86-32)で検索していくと、＝で結ばれた方の5.3.3-49.el6でrpmのURLがあるので、同じようにyumで入れてあげる。

```
$ sudo yum install http://mirror.centos.org/centos/6/os/i386/Packages/php-cli-5.3.3-49.el6.i686.rpm
                                   .
                                   .
                                   .
Error: Package: php-cli-5.3.3-49.el6.i686 (/php-cli-5.3.3-49.el6.i686)
           Requires: php-common(x86-32) = 5.3.3-49.el6
```
まだでやがる。

```
$ sudo yum install http://mirror.centos.org/centos/6/os/i386/Packages/php-common-5.3.3-49.el6.i686.rpm
                                   .
                                   .
                                   .
Complete!
```

おっ、終わった。じゃ、先ほどつっかえたphp-cliを再度yumでインストールして、最後にphpそのものをもう一度インストールすれば...

```
$ sudo yum install http://mirror.centos.org/centos/6/os/i386/Packages/php-cli-5.3.3-49.el6.i686.rpm
                                   .
                                   .
                                   .

Complete!

$ sudo yum install http://mirror.centos.org/centos/6/os/i386/Packages/php-5.3.3-49.el6.i686.rpm
                                   .
                                   .
                                   .
Complete!

$ php -v
PHP 5.3.3 (cli) (built: Mar 22 2017 12:17:33)
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
```

というわけですね。正確に本番環境と同じものをこれで再現できます。

### パート2はこちら
[検証環境を構築する上で知ったことパート2](https://qiita.com/Nedward/items/84dce575785fb6505612)