2021 9/23,9/24 誤字修正
2022 1/10 追記
複数の方からsamtoolsやbowtie2が動作しないという連絡をいただいたので、今日はその対処方法を検討します。通常、このような問題をいただいた場合、調べる側としては、その方が該当するツールをどのような環境にどのような方法で導入したのかにまず注目するかと思います。今回のケースでは、連絡をいただいた方の1名は、インテル版のmacにパッケージマネージャのcondaを使ってsamtoolsを導入したところ、エラーが発生したという事でした。condaコマンドにはM1 macやlinux版もありますが、インテルmacのcondaコマンドでは、ローカルのライブラリのチェックをした上で、macos向けにコンパイルされたプログラムのバイナリと足りないライブラリを導入(もしくはアップデート)しようとします(*1)。回りくどい書き方をしましたが、condaを使って導入したなら、バイナリの実行コード自体はOS互換と思われます(*2)。
導入方法自体は問題なさそうなので、あとはエラー情報を見て考えることにします。samtoolsのコマンドの実行時にどんなエラーが出たのかエラーメッセージを送ってもらいました。以下のメッセージが出たそうです。
$ samtools
samtools: error while loading shared libraries: libcrypto.so.1.0.0: cannot open shared object file: No such file or directory
これは共有ライブラリのlibcrypto.so.1.0.0が参照できないというエラーです(.soはshared.libraryの略。macでは.dylib)。自分も昔condaを使ってsamtoolsやbcftoolsをインストールした時に発生した記憶があります。condaで導入すると通常ライブラリを共有するdynamic linked(説明)のバイナリとしてインストールされるので、インストール時、samtoolsが依存している共有ライブラリのlibcrypto.so.1.0.0が正しく導入されなかったのだと推測されます(詳しい解説)。
ではここからは自分の環境でエラーを再現できるか試し、環境を再現できたら、修復できるか検討していこうと思います。まずは自分のローカル環境にcondaコマンドでインストールしたsamtoolsを検索します。私のように色々なツールを導入している場合、(samtoolsが様々なツールで使われているため)複数のsamtoolsバイナリがヒットするはずです。
find ~/miniconda/ -name samtools
出力は省略しますが、確かに、自分のマシンの~/miniconda/以下から複数のsamtoolsバイナリがヒットしました。そこで、lddコマンドを使ってそれぞれのsamtoolsで共有ライブラリは全て見えているか順番に調べていったところ、version1.7.0のsamtoolsで同様の現象が発生していました。
#lddコマンドで共有ライブラリを調べる(例;ldd /bin/cat)
ldd <path>/<to>/samtools1.7
このバージョンのsamtoolsを、質問された方と同じcondaコマンドを使って導入します。いつものように、ubuntu18で検証用の仮想環境を立ち上げて行います。conda互換のmambaを使います。pythonのバージョンは3.9です。
mamba create -n samtools_env -y
conda activate samtools_env
mamba install -c bioconda samtools==1.7.0 -y
動作するか確認します。
samtools
samtools: error while loading shared libraries: libcrypto.so.1.0.0: cannot open shared object file: No such file or directory
version1.7のsamtoolsをcondaで入れると同じエラーが再現されました。共有ライブラリのlibcrypto.so.1.0.0が見つからないというエラーです。
lddコマンドを使ってこのsamtoolsの共有ライブラリが見えているかどうか確認します。
ldd $(which samtools)
samtoolsの動作に必要な共有ライブラリの中で、libcrypto.so.1.0.0だけライブラリのパスが見えていません(写真は上と同一のもの)。
ldconfigコマンドにオプションの"-p"をつけると、システム側から見えている全ての共有ライブラリを確認できます。
> sudo ldconfig -p
しかしこれだと多すぎて見にくいので、grepを使って"libcrypto.so"があるか調べます。
sudo ldconfig -p |grep libcrypto.so
libcrypto.so.1.1は見つかりましたが、やはりlibcrypto.so.1.0.0は見つかりません。
さて、ここからどうするかですが、マイナーバージョンアップの例えばlibcrypto.so.1.0.1があれば、シンボリックリンクでlibcrypto.so.1.0.0として、これを/usr/libなどに追加すれば認識するかもしれません。しかし、ここではもう少し粘ります。まず、/etc/ld.so.cacheに含まれない場所に見つからないか、念のため確認します(参考ページ)。検索対象は、各ユーザーが共通して利用するライブラリやプログラムのバイナリを置く/usr(ユーザーディレクトリ、参考ページ)とします。
find /usr -type f -name "libcrypto.so.1.0*"
(出力は省略)
見つかりませんでした。どうしましょうか?このライブラリ名でググったところ、libcrypto.so.1.0はオープンソースの暗号通信プロトコルであるOpenSSL(リンク)でも使われていました。バイオインフォの情報共有サイトでは、このことを利用して、condaでOpenSSL(version1.0)をインストールしてsamtoolsのエラーを回避する方法が提案されていました(リンク)。OpenSSLの依存だけcondaで導入するなら
> mamba install -c bioconda samtools openssl=1.0 -y --only-deps
しかし、この方法を試したところ、私の場合は、依存関係の問題で導入できませんでした。そこで、OpenSSLの配布ファイルをbiocondaから直接ダウンロードします。
リンク
https://anaconda.org/conda-forge/openssl/files?page=5
linux-64/openssl-1.0.2h-0.tar.bz2をダウンロードして解凍し、lib/のlibcrypto.so.1.0.0を確認します。
このlibcrypto.so.1.0.0をcondaの共有ライブラリの配置場所である~/miniconda/lib/(ここでは~/miniconda/env/samtools_env/lib/)、もしくは/usr/lib/x86_64-linux-gnu/に配置します。
> cp lib/libcrypto.so.1.0.0 ~/miniconda/env/samtools_env/lib/
コピーしたらsamtoolsがランできるか確認します。
>samtools --version
バージョンが表示されます。ランできるようになりました。
今回はcondaでツールを管理していたため、LD_LIBRARY_PATHに追加することは避けました。自分でソースコードからビルドする場合、LD_LIBRARY_PATHに共有ライブラリのパスをライブラリの優先度を考慮して追加し、"ldconfig"して反映させれば良いのではないでしょうか(参考サイト)。
いつになるか未定ですが、次回はperlのライブラリエラーについて考えます。
参考
*1
2021年9月現在、condaコマンドでは、numpyなどを除いてほとんどのバイオインフォマティクスのツールはarmのM1 macosにはネイティブにはインストールできません(導入時に弾かれるはず)。M1 macでバイオインフォマティクスのツールをネイティブに動かすには、有志の方が公開されているバイナリを探してダウンロードするか (例: bwaのstatic binary)、もしくは自分で頑張ってビルドするということになります(参考ページ)。その一方で、インテルCPUが搭載されたmacは、人気のバイオインフォマティクスのツールの多くがパッケージマネージャで簡単にインストールできます。macにこだわる以上は、インテルCPUが搭載されたmacの方が現状有利です (armのM1 macのdockerはrosetta2に依存しており(docker)、現在は速度面でかなり不利)。M1 MacBookとintel mac miniを使ってベンチマークを取ったところ、M1 MacBook dockerでは、intel mac miniと同じ計算(3GB x2 fastq mapping)を終わるまでに10~30倍のユーザータイムが必要でした(データによる)。
*2
致命的なバグがあったり、対応するライブラリのバージョンがなかったりするバージョンは、コミュニティへの情報提供を通じて削除されます。例えばbowtie2の2.2.3はbioconda channelには見当たりません(biostarsスレッド)。