PR

Almalinux8のPHPのバージョンを変更する手順とperlの依存関係解消の手順

PHPの脆弱性が世間を騒がせておりますが、AlmaLinux8の標準でバンドルされているPHPのバージョンを変更する手順を紹介します。また、全く別件ですが、perlの依存関係についても解消したので、合わせてお知らせします。

現在のPHPのバージョンの確認

現在有効になっているPHPモジュール(ストリーム)を確認するには、以下のコマンドを実行します。

# dnf module list php 

AlmaLinux 8 - AppStream
Name Stream Profiles Summary
php 7.2 [d][e] common [d], devel, minimal PHP scripting language
php 7.3        common [d], devel, minimal PHP scripting language
php 7.4        common [d], devel, minimal PHP scripting language
php 8.0        common [d], devel, minimal PHP scripting language
php 8.2        common [d], devel, minimal PHP scripting language

表示の見方

  • バージョンの横にある [e] は Enabled(有効化されている) を意味します。
  • [d] は Default(標準設定) を意味します。

PHP 8.2への変更手順(標準モジュール使用)

  1. 既存のPHPモジュール設定をリセット

現在有効になっているPHP 7.2のモジュール設定をクリアします。

# dnf module reset php
  1. 標準のPHP 8.2モジュールを有効化

AlmaLinux 8の標準リポジトリで提供されている php:8.2 ストリームを指定して有効化します。

# dnf module enable php:8.2
  1. パッケージの同期とアップデートを実行

既存のPHP 7.2関連パッケージをすべてPHP 8.2へ一括更新します。

# dnf distro-sync --allowerasing --refresh
  1. 関連サービスの再起動

Apacheと、裏側で動作するPHP-FPMの双方を再起動して設定を反映させます。

PHP-FPMの再起動 (こちらは自動で再起動されていました)

# systemctl restart php-fpm

Apacheの再起動

# systemctl restart httpd
  1. バージョンの確認

切り替えが正常に完了したか、以下のコマンドで確認してください。

# php -v

出力結果に PHP 8.2.x と表示されていれば、標準モジュールでのアップデートは無事成功です。

念のため、

# rpm -qa | grep php 

でも、phpのパッケージが8.2になっている事を確認しておきます。

<番外編>

dnfコマンドを実行した際に、以下のようにモジュールの依存関係問題が表示されていました。(文面が見にくいので一部XXXに編集)ここからは、perlの依存関係の解消の手順について記載します。

# dnf module list perl

モジュールの依存関係問題:

 問題 1: module perl:5.26:XXX.x86_64 from appstream conflicts with module(perl:5.32) provided by perl:5.32:XXX.x86_64 from appstream
  - module perl:5.32:XXX.x86_64 from appstream conflicts with module(perl:5.26) provided by perl:5.26:XXX.x86_64 from appstream
  - module freeradius:3.0:XXX.x86_64 from appstream requires module(perl:5.26), but none of the providers can be installed
  - 競合するリクエスト
 問題 2: module perl:5.26:XXX.x86_64 from appstream conflicts with module(perl:5.32) provided by perl:5.32:XXX.x86_64 from appstream
  - module perl:5.32:XXX.x86_64 from appstream conflicts with module(perl:5.26) provided by perl:5.26:XXX.x86_64 from appstream
  - module freeradius:3.0:XXX.x86_64 from appstream requires module(perl:5.26), but none of the providers can be installed
  - 競合するリクエスト
AlmaLinux 8 - AppStream
Name              Stream                Profiles                         Summary
perl              5.24                  common [d], minimal              Practical Extraction and Report Language
perl              5.26 [d]              common [d], minimal              Practical Extraction and Report Language
perl              5.30                  common [d], minimal              Practical Extraction and Report Language
perl              5.32 [e]              common [d], minimal              Practical Extraction and Report Language

freeradiusはインストールしていないはずですが、念のため、

# rpm -qa | grep freeradius

や

# dnf list installed freeradius 

を実行してインストールされていないことを確認します。

「FreeRADIUSはインストールしていない」にもかかわらずこのエラーが出る理由は、DNFモジュールの仕様にあります。FreeRADIUSのパッケージ自体がシステムになくても、リポジトリ(AppStream)側で「FreeRADIUS 3.0 モジュール」が有効(enable)になっているか、システムがデフォルトで有効とみなしているため、DNFが「FreeRADIUSを動かすためのPerl 5.26が必要だ」と自動判定してしまい、手動で選んだ Perl 5.32 と衝突しています。

FreeRADIUSを実際には使わないのであれば、FreeRADIUSのモジュール自体を無効化(disable)することで、Perl 5.32 への切り替えエラーを完全に解消できます。

perlの依存関係を解消する手順

1. 衝突の原因になっている freeradius モジュールを完全に無効化する

# dnf module disable freeradius

2. Perl関連のモジュール設定を一度リセットする

# dnf module reset perl perl-DBI

3. 使いたい Perl 5.32 モジュールを有効化する

# dnf module enable perl:5.32

4. DNFのキャッシュを完全に削除する

# dnf clean all

5. 依存関係を整理しながらシステムを同期・更新する

# dnf distro-sync --allowerasing

なぜこれで直るのか?

dnf module disable freeradius を実行することで、DNFに対して「このシステムではFreeRADIUSのことは一切考慮しなくていい」と指示を出します。これにより、Perl 5.26 への縛りが消え、安全に Perl 5.32 へアップグレードできるようになります。

このあと、dnf module list perl や dnf update を試してみて、エラーが消えたことを確認します。

なお、現在は問題なく動いているように見えても、このエラーを放置すると今後一切のセキュリティアップデートやパッケージの新規インストール(dnf update や dnf install)が正常に機能しなくなる(毎回エラーで停止する)可能性が極めて高いため、このエラーに気が付いたときに対処しておくべきです。

今回はここまでです。最後までお読みいただきありがとうございました。