2020年12月8日にCentOSの方針転換が発表され騒ぎになっています(CentOSが開発方針を変更ーー「CentOS 8」は2021年終了、今後は「CentOS Stream」に注力)。気になりますが、発表が唐突ですし、反発も大きいので、別の方向性が示されるかもしれません。今後の動向に注意しようと思います。
それはさておき、CentOS7で使われていたコマンド「yum」は、CentOS8では「dnf」に置き換わることになっています。yumがPython3に対応できないことが理由です。CentOS7ではyumを使い続けることになっていますが、dnfをインストールすることも可能です。そこでCentOS7.4の環境にインストールしてみました。ところが実行するとエラーで動きません。
Traceback (most recent call last):
File "/usr/bin/dnf", line 57, in <module>
from dnf.cli import main
File "/usr/lib/python2.7/site-packages/dnf/__init__.py", line 30, in <module>
import dnf.base
File "/usr/lib/python2.7/site-packages/dnf/base.py", line 29, in <module>
import libdnf.transaction
File "/usr/lib64/python2.7/site-packages/libdnf/__init__.py", line 3, in <module>
from . import conf
File "/usr/lib64/python2.7/site-packages/libdnf/conf.py", line 17, in <module>
_conf = swig_import_helper()
File "/usr/lib64/python2.7/site-packages/libdnf/conf.py", line 16, in swig_import_helper
return importlib.import_module('_conf')
File "/usr/lib64/python2.7/importlib/__init__.py", line 37, in import_module
__import__(name)
ImportError: No module named _conf
何が悪いのか分かりません。別の環境で試してみようと考えて、VirtualBox上にCentOS7.9を準備して、動かしてみました。すると、全く問題ありません。
CentOS7.4とCentOS7.9の中で何かが違うのでしょう。Webを検索してみたら「Centos Extras DNF incompatible with versions less than EL7.6 #827」という情報を見つけました。その解決策は次のようにすると書かれていました。
After installing/updating some related packages, resolved the "ImportError: No module named _conf" issue for me.
yum update python*
yum install dnf-data dnf-plugins-core libdnf-devel libdnf python2-dnf-plugin-migrate dnf-automatic
dnf is now working on a CentOS 7.5 box. Some packages might be unnecessary, but you have to try for yourself...
これで本当に解決するなら、それはそれで良いのですが、何故これで解決になるのか理解できません。なにしろ何が問題の原因なのか把握できていないからです。
状況を調査するため、エラー出力で指摘されているファイル「/usr/lib64/python2.7/importlib/__init__.py」にデバッグ情報を出力するロジックを加えてみました。するとCentOS7.4とCentOS7.9とでは結果が違います。
CentOS7.4では以下のようになりました。
('>>>', 'libdnf._conf')
('>>>', '_conf')
CentOS7.4では以下のようになりました。
('>>>', 'libdnf._conf')
('>>>', 'libdnf._module')
('>>>', 'libdnf._repo')
('>>>', 'libdnf._transaction')
('>>>', 'libdnf._utils')
('>>>', 'libdnf._smartcols')
更に、ファイル「/usr/lib64/python2.7/importlib/__init__.py」にデバッグ情報を出力するロジックを加えて状況を確認すると、次のことが分かりました。
- CentOS7.4の場合、ファイル「/usr/lib64/python2.7/site-packages/libdnf/conf.py」の14行目で呼ばれたのが最初の行に相当し、2番目は16行目が呼び出し元のようです。
- どうやら初回呼び出しで例外が起きているようですが、その詳細情報がわかりません。それを取得するロジックを加えてみると、「ImportError('/lib64/libmodulemd.so.1: undefined symbol: g_log_structured_standard'」であることがわかりました。
ちなみにファイル「/usr/lib64/python2.7/site-packages/libdnf/conf.py」の14行目とか16行目というのは、以下のようになっています。
13 try:
14 return importlib.import_module(mname)
15 except ImportError:
16 return importlib.import_module('_conf')
コマンド「ldd -r /lib64/libmodulemd.so.1」で確認しても、やはり同様のエラーになります。
undefined symbol: g_log_structured_standard (/lib64/libmodulemd.so.1)
linux-vdso.so.1 => (0x00007fffbf9b8000)
libgobject-2.0.so.0 => /lib64/libgobject-2.0.so.0 (0x00007fa9b63d0000)
libglib-2.0.so.0 => /lib64/libglib-2.0.so.0 (0x00007fa9b60be000)
libyaml-0.so.2 => /lib64/libyaml-0.so.2 (0x00007fa9b5e9e000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007fa9b5c88000)
libc.so.6 => /lib64/libc.so.6 (0x00007fa9b58ba000)
libpcre.so.1 => /lib64/libpcre.so.1 (0x00007fa9b5658000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fa9b543c000)
libffi.so.6 => /lib64/libffi.so.6 (0x00007fa9b5234000)
/lib64/ld-linux-x86-64.so.2 (0x00007fa9b6881000)
だいぶ状況が理解出来てきたので、あらためてWebを検索すると「ローカルで動いてたpuppeteerがCentos7で動かにゃい」という情報が見つかりました。
この問題はパッケージ「glib2」を更新すれば良いようです。現状を確認してみると、CentOS7.4では「glib2.x86_64 2.50.3-3.el7 @anaconda」、CentOS7.9では「glib2.x86_64 2.56.1-7.el7 @anaconda」でした。CentOS7.4でコマンド「yum update glib2」を実行すると「glib2.x86_64 2.56.1-8.el7 @updates」になりました。
以上の処置をすませて、コマンド「dnf」を実行してみると、無事に動作してくれました。