Raspberry piでrails sを実行するとエラーがでる時の対処法
この対処法は原因解決の理由が不明の部分がある為、あくまで自分用の覚え書きです。
以下の環境でrails s -b 0.0.0.0を実行するとエラーが出て正常に動作しませんでした。
環境
- Raspberry pi 3 model B+
- Raspbian v9.4
- Ruby v2.4.0
- Rails v5.2.1
rubyとrailsの導入方法はこちらを参考にさせていただきました。
いろいろ弄っていたら問題なくrails sできるようになったので、自分用に残しておきます。
結論
Bus Errorの解消法
rails sの時にBus Errorが発生する場合、config/boot.rbを編集し require bootsnap/setup を削除するかコメントアウトすれば解消できます。
Segmentation faultの解消法
rails new xxx を実行する際に末尾に--skip-bundleを加えて実行します。このオプションをつけるとbundle installが自動で実行されません。
処理が終わったあとアプリケーションディレクトリにcdしbundle installを行います。
このようにrails newの時にbundle installをskipすると、何故かrails sを実行した際にSegmentation faultエラーで詰まらなくなります。
概要
rails new xxxをした後にrails s -b 0.0.0.0を実行した際、下記のエラー文が出ました。
$ rails s -b 0.0.0.0 /home/hoge/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/bootsnap-1.3.1/lib/bootsnap/compile_cache/iseq.rb:18: [BUG] Bus Error at 0x1a632ab ruby 2.4.0p0 (2016-12-24 revision 57164) [armv7l-linux-eabihf] ~長文省略~
どうやらBus Errorとやらで正常に動作していないようです。
rails Raspberry pi Bus Error で検索した結果、以下のサイトがヒットしました。
どうやらbootsnapがRuby VMと相性が悪いそうです。この問題は少なくともRuby 2.4.1から2.5.1までに見られているそうです。
つまる所、bootsnapが有効だとBus Errorが出るようなので、config/boot.rbを編集しbootsnapを無効にしてあげれば解消できました。
ところがBus Errorを解消した後、rails sをすると下記のエラー文が出ました。
$ rails s -b 0.0.0.0 => Booting Puma => Rails 5.2.1 application starting in development => Run `rails server -h` for more startup options /home/hoge/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/rb-inotify-0.9.10/lib/rb-inotify/notifier.rb:54: [BUG] Segmentation fault at 0xe92d000e ruby 2.4.0p0 (2016-12-24 revision 57164) [armv7l-linux-eabihf] ~長文省略~
なにやらrb-inotifyというgemでセグメンテーション違反が発生しているようです。セグメンテーション違反とはWikipediaによると
セグメンテーション違反(英語:segmentation fault)はソフトウェアの実行時に起きる特定のエラー条件である。segfault(セグフォールト)と略される場合がある。 セグメンテーション違反はアクセスが許可されていないメモリ上の位置、もしくは許可されていない方法(例えばリードオンリーの位置へ書き込みをしようとする、もしくはオペレーティングシステムの部分を上書きしようとする)でメモリ上の位置にアクセスしようとするときに起こる。
セグメンテーション違反 - Wikipedia
なるほど?正直な所、自分にはどうすれば解決するかわかりませんでした。しかし結論で述べたようにrails newを実行する際にbundle installをskipし、後ほどbundle installすることによってセグメンテーション違反を解消することはできました。なぜ解消できたか不明な為、あくまで自分用の一時的な対処法です。