yum update でコンフリクトするパッケージを shell/swap で操作する方法【PHP8.0へアップデート】
こんにちは、運用チームのtuouraと申します。
今日はyumコマンドの小ネタを紹介致します。
PHP7.3からPHP8.0へアップデート
PHP7.3のEOLが近づいてきました・・・という訳で、一足飛ばしにPHP8.0にバージョンアップを行おうと思います。
サーバOSはAmazonLinux2、導入済みのAmazonのExtras LibraryのPHP7.3からPHP8.0に切り替え、アップデートをかけてみます。
# php -v PHP 7.3.29 (cli) (built: Jul 7 2021 17:34:15) ( NTS ) Copyright (c) 1997-2018 The PHP Group Zend Engine v3.3.29, Copyright (c) 1998-2018 Zend Technologies with Zend OPcache v7.3.29, Copyright (c) 1999-2018, by Zend Technologies# amazon-linux-extras list|grep php _ php7.2 available \ _ lamp-mariadb10.2-php7.2 available \ 31 php7.3=latest enabled \ _ php7.4 available [ =stable ] _ php8.0 available [ =stable ]# amazon-linux-extras disable php7.3 # amazon-linux-extras enable php8.0# amazon-linux-extras list|grep php _ php7.2 available \ _ lamp-mariadb10.2-php7.2 available \ _ php7.3 available \ _ php7.4 available [ =stable ] 51 php8.0=latest enabled [ =stable ]# yum update php* ~略 エラー: パッケージ: php-json-7.3.29-1.amzn2.x86_64 (@amzn2extra-php7.3) 要求: php-common(x86-64) = 7.3.29-1.amzn2 削除中: php-common-7.3.29-1.amzn2.x86_64 (@amzn2extra-php7.3) php-common(x86-64) = 7.3.29-1.amzn2 次のものにより更新された: : php-common-8.0.8-1.amzn2.x86_64 (amzn2extra-php8.0) php-common(x86-64) = 8.0.8-1.amzn2 利用可能: php-common-5.4.16-43.amzn2.x86_64 (amzn2-core) php-common(x86-64) = 5.4.16-43.amzn2 利用可能: php-common-5.4.16-43.amzn2.0.1.x86_64 (amzn2-core) php-common(x86-64) = 5.4.16-43.amzn2.0.1 利用可能: php-common-5.4.16-43.amzn2.0.2.x86_64 (amzn2-core) php-common(x86-64) = 5.4.16-43.amzn2.0.2 利用可能: php-common-5.4.16-43.amzn2.0.3.x86_64 (amzn2-core) php-common(x86-64) = 5.4.16-43.amzn2.0.3 利用可能: php-common-5.4.16-43.amzn2.0.4.x86_64 (amzn2-core) php-common(x86-64) = 5.4.16-43.amzn2.0.4 利用可能: php-common-5.4.16-45.amzn2.0.5.x86_64 (amzn2-core) php-common(x86-64) = 5.4.16-45.amzn2.0.5 利用可能: php-common-5.4.16-45.amzn2.0.6.x86_64 (amzn2-core) php-common(x86-64) = 5.4.16-45.amzn2.0.6 利用可能: php-common-5.4.16-46.amzn2.0.2.x86_64 (amzn2-core) php-common(x86-64) = 5.4.16-46.amzn2.0.2 利用可能: php-common-8.0.0-2.amzn2.x86_64 (amzn2extra-php8.0) php-common(x86-64) = 8.0.0-2.amzn2 利用可能: php-common-8.0.2-1.amzn2.x86_64 (amzn2extra-php8.0) php-common(x86-64) = 8.0.2-1.amzn2 利用可能: php-common-8.0.6-1.amzn2.x86_64 (amzn2extra-php8.0) php-common(x86-64) = 8.0.6-1.amzn2 問題を回避するために --skip-broken を用いることができます。 これらを試行できます: rpm -Va --nofiles --nodigest
見事(?)に失敗しました。
どうやらJSON拡張モジュールのパッケージ が原因でアップデートが出来ない様です。
PHP8.0.0以降にはJSON拡張モジュールのパッケージが無い
PHP8.0.0以降では、JSON拡張モジュールはデフォルトでコアに組み込まれており、対象パッケージが存在しないため、直接アップデートが出来なかった様です。
PHP > マニュアル > 関数リファレンス > その他の基本モジュール > JSON > インストール/設定
という事で、JSON拡張モジュールのパッケージだけ削除を試してみます。
# yum remove php-json ~略 ================================================================================================================================== Package アーキテクチャー バージョン リポジトリー 容量 ================================================================================================================================== 削除中: php-json x86_64 7.3.29-1.amzn2 @amzn2extra-php7.3 83 k 依存性関連での削除をします: php x86_64 7.3.29-1.amzn2 @amzn2extra-php7.3 9.7 M php-cli x86_64 7.3.29-1.amzn2 @amzn2extra-php7.3 15 M php-common x86_64 7.3.29-1.amzn2 @amzn2extra-php7.3 12 M php-devel x86_64 7.3.29-1.amzn2 @amzn2extra-php7.3 11 M php-fpm x86_64 7.3.29-1.amzn2 @amzn2extra-php7.3 4.9 M php-gd x86_64 7.3.29-1.amzn2 @amzn2extra-php7.3 749 k php-mbstring x86_64 7.3.29-1.amzn2 @amzn2extra-php7.3 2.0 M php-mysqlnd x86_64 7.3.29-1.amzn2 @amzn2extra-php7.3 824 k php-opcache x86_64 7.3.29-1.amzn2 @amzn2extra-php7.3 1.0 M php-pdo x86_64 7.3.29-1.amzn2 @amzn2extra-php7.3 373 k php-pear noarch 1:1.10.12-9.amzn2 @amzn2-core 2.1 M php-process x86_64 7.3.29-1.amzn2 @amzn2extra-php7.3 182 k php-xml x86_64 7.3.29-1.amzn2 @amzn2extra-php7.3 808 k トランザクションの要約 ================================================================================================================================== 削除 1 パッケージ (+13 個の依存関係のパッケージ)
このまま進めると、仲良く全てのPHPパッケージが綺麗になりますね。
完全にPHP7.3を削除した後に、改めてPHP8.0をインストールしても良いのですが、もう少しスマートな方法を考えてみます。
yum shell でJSON拡張モジュールだけ削除してアップデートする
依存関係でコンフリクトが発生しているパッケージが分かったので、yum shell の登場です。
yum shell 上でJSON拡張モジュールだけ削除し、アップデートをしてみます。
※「run」までが入力したコマンドです。
# yum shell 読み込んだプラグイン:langpacks, priorities, update-motd > remove php-json > update php php-cli php-common php-devel php-fpm php-gd php-mbstring php-mysqlnd php-opcache php-pdo php-process php-xml run ~略 ================================================================================================================================== Package アーキテクチャー バージョン リポジトリー 容量 ================================================================================================================================== 更新します: php x86_64 8.0.8-1.amzn2 amzn2extra-php8.0 3.3 M php-cli x86_64 8.0.8-1.amzn2 amzn2extra-php8.0 5.0 M php-common x86_64 8.0.8-1.amzn2 amzn2extra-php8.0 1.2 M php-devel x86_64 8.0.8-1.amzn2 amzn2extra-php8.0 1.3 M php-fpm x86_64 8.0.8-1.amzn2 amzn2extra-php8.0 1.7 M php-gd x86_64 8.0.8-1.amzn2 amzn2extra-php8.0 168 k php-mbstring x86_64 8.0.8-1.amzn2 amzn2extra-php8.0 473 k php-mysqlnd x86_64 8.0.8-1.amzn2 amzn2extra-php8.0 189 k php-opcache x86_64 8.0.8-1.amzn2 amzn2extra-php8.0 522 k php-pdo x86_64 8.0.8-1.amzn2 amzn2extra-php8.0 122 k php-process x86_64 8.0.8-1.amzn2 amzn2extra-php8.0 82 k php-xml x86_64 8.0.8-1.amzn2 amzn2extra-php8.0 173 k 削除中: php-json x86_64 7.3.29-1.amzn2 @amzn2extra-php7.3 83 k トランザクションの要約 ================================================================================================================================== 更新 12 パッケージ 削除 1 パッケージ ~略 更新: php.x86_64 0:8.0.8-1.amzn2 php-cli.x86_64 0:8.0.8-1.amzn2 php-common.x86_64 0:8.0.8-1.amzn2 php-devel.x86_64 0:8.0.8-1.amzn2 php-fpm.x86_64 0:8.0.8-1.amzn2 php-gd.x86_64 0:8.0.8-1.amzn2 php-mbstring.x86_64 0:8.0.8-1.amzn2 php-mysqlnd.x86_64 0:8.0.8-1.amzn2 php-opcache.x86_64 0:8.0.8-1.amzn2 php-pdo.x86_64 0:8.0.8-1.amzn2 php-process.x86_64 0:8.0.8-1.amzn2 php-xml.x86_64 0:8.0.8-1.amzn2 完了しました!
上手く行きました!
JSON拡張も有効な様です。
# php -v PHP 8.0.8 (cli) (built: Jul 7 2021 17:35:32) ( NTS ) Copyright (c) The PHP Group Zend Engine v4.0.8, Copyright (c) Zend Technologies with Zend OPcache v8.0.8, Copyright (c), by Zend Technologies# php -i|grep json json json support => enabled
yum swap でJSON拡張モジュール だけ削除してアップデートする
更にスマートな方法がある様です。
yum マニュアルの swap の項目には、こう書かれています。
swap At it's simplest this is just a simpler way to remove one set of package(s) and install another set of pack‐ age(s) without having to use the "shell" command. However you can specify different commands to call than just remove or install, and you can list multiple packages (it splits using the "--" marker). Note that option pars‐ ing will remove the first "--" in an argument list on the command line. Examples: swap foo bar swap -- remove foo -- install bar swap foo group install bar-grp swap -- group remove foo-grp -- group install bar-grp
DeepLで解説部分を和訳してみます。
swap 簡単に言えば、「シェル」コマンドを使わずに、あるパッケージを削除して、別のパッケージをインストールする方法です。
パッケージをインストールする簡単な方法で、「shell」コマンドを使う必要はありません。しかし、単に remove や install 以外のコマンドを指定することもできます。
また、複数のパッケージを列挙することもできます(「--」で分割されます)。なお、オプションの解析
がコマンドラインの引数リストの最初の「--」を削除することに注意してください。
yum swap を使う事で、 yum shell を使わず、簡単にパッケージを入れ替えられるようですね。
JSON拡張パッケージを削除で指定し、他のパッケージはアップデートを指定してみます。
# yum swap -- remove php-json -- update php php-cli php-common php-devel php-fpm php-gd php-mbstring php-mysqlnd php-opcache php-pdo php-process php-xml ~略 ================================================================================================================================== Package アーキテクチャー バージョン リポジトリー 容量 ================================================================================================================================== 更新します: php x86_64 8.0.8-1.amzn2 amzn2extra-php8.0 3.3 M php-cli x86_64 8.0.8-1.amzn2 amzn2extra-php8.0 5.0 M php-common x86_64 8.0.8-1.amzn2 amzn2extra-php8.0 1.2 M php-devel x86_64 8.0.8-1.amzn2 amzn2extra-php8.0 1.3 M php-fpm x86_64 8.0.8-1.amzn2 amzn2extra-php8.0 1.7 M php-gd x86_64 8.0.8-1.amzn2 amzn2extra-php8.0 168 k php-mbstring x86_64 8.0.8-1.amzn2 amzn2extra-php8.0 473 k php-mysqlnd x86_64 8.0.8-1.amzn2 amzn2extra-php8.0 189 k php-opcache x86_64 8.0.8-1.amzn2 amzn2extra-php8.0 522 k php-pdo x86_64 8.0.8-1.amzn2 amzn2extra-php8.0 122 k php-process x86_64 8.0.8-1.amzn2 amzn2extra-php8.0 82 k php-xml x86_64 8.0.8-1.amzn2 amzn2extra-php8.0 173 k 削除中: php-json x86_64 7.3.29-1.amzn2 @amzn2extra-php7.3 83 k トランザクションの要約 ================================================================================================================================== 更新 12 パッケージ 削除 1 パッケージ
yum swap でも綺麗にバージョンアップが出来ました!
実際のバージョンアップの時には
yum shell / yum swap で、PHPのバージョンアップが非常に簡単に出来ました。
実際にバージョンアップを行う際は、コンテンツ側での改修や、他にパッケージの追加や更新も必要となる事もあるので、事前に動作検証を行い、慎重に行いましょう。
また、今回は利用しているPHPを直接バージョンアップしましたが、サーバの設定によっては、複数のPHPを同居し、切り替えを行う事も可能です。
PHPのバージョンアップの仕方が分からない、そもそもサーバでバージョンアップ出来るか分からない等、お困りの事があれば、ぜひフォームやフリーダイヤルから、お問い合わせください。
最後まで読んで頂き、有難うございました。