2023年10月17日火曜日

FreeBSD で「libssl.so.11」がないからアプリが実行できない,と言われた

 2023年10月15日に FreeBSD 上のアプリケーションのアップデートをしていたら,急に多くのアプリケーションが動かなくなった。 その顛末を書こう。

 きっかけは FreeBSD 上で portupgrade をしたことに始まる。このパターンは結構多い。 今回は,実はアップデート自体には全く問題はなかった。 しかし,その後,急に多くのアプリが動かなくなった。 吐き出すエラーは
ld-elf.so.1: /usr/local/lib/libssl.so.11: version XXXXXX required by YYYYYY not found
という感じのもの(ここで XXXXXX や YYYYYY はバージョンやこのライブラリを使ってるアプリやら別のライブラリやら)

これが1個や2個ならいいが,サーバーによってはルート権限で実行もできなくてほとほと困ってしまった。

ちょっと調べると,この「libssl.so.11」は「openssl-1.1.1w」でインストールされるものだった。 これは,FreeBSD では「/usr/ports/security/openssl111/」でインストールできる。 実は少し前までは「openssl」といえばこのバージョンだったが,ちょっと前にデフォルトバージョンが「3.0.x」に変わっていた。 そのため,openssl をアップデートした際に,v.1.1.1w から v.3.0.x に上がってしまい,ライブラリが libssl.so.12 になっていた。 結果として openssl-1.1.1w でインストールされた libssl.so.11 を使ってるアプリケーションソフトでエラーが起こったみたい。

そこで,どのアプリが libssl.so.11 を使っているかをチェックしてみた。 それには以下のようにする。
# pkg shlib -qR libssl.so.11
libevent-2.1.12
librtmp-2.4.20190330
rtmpdump-2.4.20190330
python27-2.7.18_2
p5-Net-SSLeay-1.92
w3m-0.5.3.20230129
..........

しかし,これでは libssl.so のバージョンがわからない。 そこで,以下のようにすると libssl.so のバージョンもわかる。
# find /usr/local/bin -type f | xargs -n1 file -F ' ' | grep 'ELF.*dynamically' | cut -f1 -d' ' | xargs ldd -f '%A %o\n' | grep libssl.so
/usr/local/bin/gdcmgendir libssl.so.11
/usr/local/bin/lynx libssl.so.11
/usr/local/bin/gdcmpap3 libssl.so.11
/usr/local/bin/gnmanalyse libssl.so.11
..........

検索するディレクトリとしては,この「/usr/local/bin/」以外に「/usr/bin/」や「/usr/sbin/」,「/usr/local/sbin/」などもあるが,ports からインストールした openssl を使っているのは,「/usr/local/bin/」と「/usr/local/sbin/」だけだった。他は「libssl.so.111」となっていて,FreeBSD のシステムからのライブラリを使っているみたいだった。

今回は ports からインストールした openssl のバージョンと,その依存関係にあるアプリケーションの指定する openssl のバージョンが違っていたのが問題だった。 その根本的な解決は,以下のようにアプリケーションを強制的に作り直さないと仕方ない。 ここでは「libssl.so.11 (openssl-1.1.1w) に依存しているアプリを強制的にアップデート(再インストールになるかな?)している。
# portmaster -f `pkg shlib -qR libssl.so.11`
あるいは
# portupgrade -f `pkg shlib -qR libssl.so.11`
とする。どちらを使うかは好みだが,「portupgrade」を使う場合には,「export BATCH=yes」としておくと,いちいち config の設定をしなくていいから楽チンかもしれない。 「portmaster」なら「-DG」のオプションを付けるといいかも。

アップデートはある程度時間がかかるが,基本的には放置すればいいはず…。

0 件のコメント: