古い環境を再現する
古い環境の改修作業でアップグレードなどが要求された場合、依存関係で問題が起きたり、その他諸々リスクが高い。かといって古い環境だから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のパッケージは公式に用意されていたり、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
というわけですね。正確に本番環境と同じものをこれで再現できます。