質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

さくらのクラウド

さくらのクラウドは、さくらインターネット株式会社が提供するIaaS型のクラウドサービス。仮想化技術による柔軟性のあるカスタマイズを始め、様々な高機能を備えています。

Q&A

解決済

2回答

3361閲覧

共有ライブラリの新しいバージョンを認識させる方法

JunYasumura

総合スコア13

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

さくらのクラウド

さくらのクラウドは、さくらインターネット株式会社が提供するIaaS型のクラウドサービス。仮想化技術による柔軟性のあるカスタマイズを始め、様々な高機能を備えています。

0グッド

0クリップ

投稿2017/08/09 02:56

###前提
[https://teratail.com/questions/62937] と同じ問題が起こり、理由が示されていますが、解決法が明記されていませんでした。
(最初↑のチケットに2番めの回答として新たな質問を付けたのですが、これでは質問する意味になっていないと気づき、あたらしくチケットを作成した次第です。)

#質問
llfuse-1.2-py3.3-linux-x86_64.egg に/usr/lib/libfuse3.so.3 を認識させるにはどのようにしたらよいでしょうか?

###発生している問題・エラーメッセージ
fuse_lowlevel_notify_store シンボルの存在しないlibfuse.so.2 を参照し、ImportError になっています。

s3ql-2.13]# python3 setup.py build_ext --include-dirs='/usr/local/sqlite-3.8/include' --library-dirs='/usr/local/sqlite-3.8/lib' --include-dirs='/usr/local/lib/' --inplace Traceback (most recent call last): File "setup.py", line 40, in <module> import s3ql File "/usr/local/src/s3ql-2.13/src/s3ql/__init__.py", line 13, in <module> from llfuse import ROOT_INODE ImportError: /usr/lib/python3.3/site-packages/llfuse-1.2-py3.3-linux-x86_64.egg/llfuse.cpython-33m.so: undefined symbol: fuse_lowlevel_notify_store

###試したこと
確かにllfuse-1.2-py3.3-linux-x86_64.egg は古いバージョンである「/lib64/libfuse.so.2」を見ているようです。

# ldd /usr/lib/python3.3/site-packages/llfuse-1.2-py3.3-linux-x86_64.egg/llfuse.cpython-33m.so linux-vdso.so.1 => (0x00007ffe4ad03000) libpython3.3m.so.1.0 => /usr/lib64/libpython3.3m.so.1.0 (0x00007f270d679000) libfuse.so.2 => /lib64/libfuse.so.2 (0x00007f270d443000) libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f270d225000) librt.so.1 => /lib64/librt.so.1 (0x00007f270d01d000) libc.so.6 => /lib64/libc.so.6 (0x00007f270cc89000) libdl.so.2 => /lib64/libdl.so.2 (0x00007f270ca84000) libutil.so.1 => /lib64/libutil.so.1 (0x00007f270c881000) libm.so.6 => /lib64/libm.so.6 (0x00007f270c5fd000) /lib64/ld-linux-x86-64.so.2 (0x0000003599600000)

しかしlibfuse3.so.3 自体は存在し、ldconfig によって認識されています。

# ldconfig -p | grep fuse libfuse3.so.3 (libc6,x86-64) => /usr/lib/libfuse3.so.3 ※ある libfuse3.so (libc6,x86-64) => /usr/lib/libfuse3.so libfuse.so.2 (libc6,x86-64) => /lib64/libfuse.so.2 libfuse.so.2 (libc6,x86-64) => /usr/lib/libfuse.so.2 libfuse.so (libc6,x86-64) => /lib64/libfuse.so libfuse.so (libc6,x86-64) => /usr/lib/libfuse.so

私が調べた範囲でわかったことはこれだけです。
ぜひヒントなどをいただけると助かります。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

linux上の共有ライブラリの名前規則は、lib[ライブラリ名].so.[バージョン]という構成になっています。
libfuse3.so.3の方を参照させたいとのことですが、"fuse3"と"fuse"なので、この場合は別ライブラリとして扱われるので、libfuse3.soの方を見ることはないと思います。
元のライブラリをコンパイルし直すか、libfuse.soを入れるしかなさそうです。

投稿2017/08/09 03:07

編集2017/08/09 03:09
skitoy4321

総合スコア229

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

JunYasumura

2017/08/09 03:10

そういうことでしたか! ではlibfuse.so.3 のようなものがあればいいわけですね。 考え方が整理でき、納得です。 さあて、一歩前進、試してみます。
JunYasumura

2017/08/09 03:11

神速回答に感謝!!!
guest

0

回答でご指摘いただいた点を頼りに、自分なりに工夫し解決しましたのでその過程を残します。

結論

LD_PRELOAD=/usr/lib/libfuse.so.2

を頭にいれること

作業の流れ詳細

libfuse.so.2 は2つあった

# ldconfig -p | grep fuse libfuse3.so.3 (libc6,x86-64) => /usr/lib/libfuse3.so.3 libfuse3.so (libc6,x86-64) => /usr/lib/libfuse3.so libfuse.so.2 (libc6,x86-64) => /lib64/libfuse.so.2 // これ libfuse.so.2 (libc6,x86-64) => /usr/lib/libfuse.so.2 // これ libfuse.so (libc6,x86-64) => /lib64/libfuse.so libfuse.so (libc6,x86-64) => /usr/lib/libfuse.so

どちらか一方が使える可能性がある

今回「無い」と問題になったシンボルfuse_lowlevel_notify_store を持っているかどうかを調べる

# strings /usr/lib/libfuse.so.2 | grep fuse_lowlevel_notify_store fuse_lowlevel_notify_store // ある -> こいつを使わせたい # strings /lib64/libfuse.so.2 | grep fuse_lowlevel_notify_store // ない -> こいつが邪魔をしている

setup.py 時に使う共有ライブラリに、/usr/lib/libfuse.so.2 を指定する

https://www.ecoop.net/memo/archives/2008-01-28-2.html の記事を読み、環境変数LD_PRELOAD を指定すればいいとわかりました。

# LD_PRELOAD=/usr/lib/libfuse.so.2 python3 setup.py build_ext --include-dirs='/usr/local/sqlite-3.8/include' --library-dirs='/usr/local/sqlite-3.8/lib' --include-dirs='/usr/local/lib/' --inplace ...略... running build_ext copying build/lib.linux-x86_64-3.3/s3ql/deltadump.cpython-33m.so -> src/s3ql

うまくできました!!(おわり)

(余談)邪魔なやつはyum でインストールしているものじゃないかと思われるので、確認してみる

yum パッケージの名前を調べる

# yum list | grep fuse fuse.x86_64 2.8.3-5.el6 @base fuse-devel.x86_64 2.8.3-5.el6 @base fuse-libs.x86_64 2.8.3-5.el6 @base // これの気がする fuse-python.x86_64 0.2.1-1.el6.rf @rpmforge ... 略

パッケージを構成するファイル一覧を調べる

# rpm -ql fuse-libs /lib64/libfuse.so.2 // やはりyum パッケージが入れた方が邪魔だったんだ /lib64/libfuse.so.2.8.3 /lib64/libulockmgr.so.1 /lib64/libulockmgr.so.1.0.1 /usr/share/doc/fuse-libs-2.8.3 /usr/share/doc/fuse-libs-2.8.3/COPYING.LIB

かなりスッキリしました。

投稿2017/08/09 09:27

JunYasumura

総合スコア13

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問