ほぼ雑記的メモ
とあるサーバにrailsを入れる必要が出てきたんですが、こんなエラーでpumaが起動後お亡くなりになります。その原因の調査。
> bundle exec puma /home/issei/cure_heart/vendor/bundle/ruby/3.2/gems/puma-6.6.0/lib/puma/puma_http11.so: [BUG] Segmentation fault at 0x0000000000000000 ruby 3.2.7 (2025-02-04 revision 02ec315244) [amd64-freebsd13] -- Control frame information ----------------------------------------------- c:0012 p:---- s:0053 e:000052 TOP [FINISH] c:0011 p:---- s:0050 e:000049 CFUNC :require c:0010 p:0011 s:0045 e:000044 METHOD :37 c:0009 p:0035 s:0039 e:000038 TOP /home/issei/cure_heart/vendor/bundle/ruby/3.2/gems/puma-6.6.0/lib/puma.rb:12 [FINISH] c:0008 p:---- s:0036 e:000035 CFUNC :require_relative c:0007 p:0017 s:0031 e:000030 TOP /home/issei/cure_heart/vendor/bundle/ruby/3.2/gems/puma-6.6.0/lib/puma/cli.rb:6 [FINISH] c:0006 p:---- s:0028 e:000027 CFUNC :require c:0005 p:0011 s:0023 e:000022 METHOD :37 c:0004 p:0005 s:0017 e:000016 TOP /home/issei/cure_heart/vendor/bundle/ruby/3.2/gems/puma-6.6.0/bin/puma:6 [FINISH] c:0003 p:---- s:0013 e:000012 CFUNC :load --中略-- 0x85d9f7000 0x85da37000 rw- 64 64 1 0 ---- df 0x85e437000 0x85e439000 r-- 2 2 3 0 ---- vn /usr/local/bin/ruby32 0x85fa00000 0x85fde4000 r-- 996 996 5 2 ---- vn /usr/local/lib/libruby32.so.32 0x8607e4000 0x860804000 r-- 32 32 47 20 ---- vn /lib/libthr.so.3 0x861804000 0x8619dd000 r-- 473 473 79 34 ---- vn /lib/libc.so.7 0x8627dd000 0x8629d1000 r-- 500 500 3 1 ---- vn /lib/libcrypto.so.7 0x864800000 0x864ae6000 r-- 742 742 39 14 ---- vn /lib/libcrypto.so.111 0x8668e6000 0x86697b000 r-- 149 149 39 14 ---- vn /usr/lib/libssl.so.111 0x1a2e9affd000 0x1a2e9b004000 r-- 7 29 61 17 CN-- vn /libexec/ld-elf.so.1 0x1a2e9b004000 0x1a2e9b01a000 r-x 22 29 61 17 CN-- vn /libexec/ld-elf.so.1 0x1a2e9b01a000 0x1a2e9b01b000 r-- 1 1 1 0 ---- df 0x1a2e9b01b000 0x1a2e9b01c000 rw- 1 0 1 0 C--- vn /libexec/ld-elf.so.1 0x1a2e9b01c000 0x1a2e9b01e000 rw- 2 2 1 0 ---- df 0x7ffffffff000 0x800000000000 r-x 1 1 183 0 ---- ph Abort (core dumped)
結論から先に言っておきます。これFreeBSDの秘伝のタレの問題でした。古いライブラリがバージョンアップで削除されていない問題です。
どうしてそこに至ったかというと、エラーからしてなんかSSL関係っぽいから。
で調べてみるとありました。めっちゃ古いファイルが。
$ ls -l /lib/libcrypt*-r--r--r-- 1 root wheel 53264 May 18 10:09 /lib/libcrypt.so.5-r--r--r-- 1 root wheel 3039112 May 18 10:09 /lib/libcrypto.so.111-r--r--r-- 1 root wheel 2046848 Jun 13 2016 /lib/libcrypto.so.7 -r--r--r-- 1 root wheel 2046848 Jun 13 2016 /lib/libcrypto.so.7
/usr/libにもありました。
lrwxr-xr-x 1 root wheel 19 Nov 12 2014 libcrypto.so -> /lib/libcrypto.so.7
/lib/libcrypto.so.7を削除して、ln -s ../../libcrypto.so.111 /usr/lib/libcrypto.so を実行。pumaを再ビルドしたら無事に起動しました。
/lib/libcrypto.so.7
ln -s ../../libcrypto.so.111 /usr/lib/libcrypto.so
そもそもなんでこうなってしまったのか?まともにメンテをしてなかったからかもしれませんが、とにもかくにもfreebsd-updateで運用しているとよくあるんですよ。というかbashでもつい最近あったわけで。こういうエラーに遭遇しちゃうと知らないと解決が大変で・・・
freebsd-update
とにかく、/libおよび/usr/libのタイムスタンプが異様に古いものは古いバージョンのものの可能性があるので削除。あるいは新しいものにsymbolic linkを切り替え。これが基本です。こんな古いライブラリが必要になるケースなんてほとんどないはずですし、そもそもメンテされてないライブラリを使っているアプリがあること自体ナンセンスです。
/lib
/usr/lib
あと、ついでだから今このバージョンで真っ新からインストールしたらどのような配置になるのか。それを調べる方法も書いておきます。以下の場所にbase.txzってファイルがあるかと思います。ベースシステムはこの中に全部入っています。これをダウンロードしてきます。
https://download.freebsd.org/ftp/releases/amd64/13.5-RELEASE/
このファイルはタダのtarファイルなんで中身を見ることができます。全部見ると大変なんで ./libだけとってきて、さらにファイルを出力します(ディレクトリの最後の/はとりのぞく。これはあとでfindの結果と比較するため)。これが最新のbaseシステムです。
tar tfz /usr/dist/13.5-RELEASE/base.txz ./lib ./usr/lib | sed -e 's/\/$//' | sort > /base.list
これを find ./lib した結果と比較すればOKです。
find ./lib
find ./lib ./usr/lib|sort | diff -c base.list -
OpenAIにイラスト描いてもらいました。pumaに乗ってます。