普段、sshを使って作業する際、ノートPCだと切れてからいちいち再度つなぐのが面倒なので moshを使っています。
あるサーバーに関してはFreeBSDのサーバーを踏み台としてmoshで接続して作業しているのですが、 FreeBSD上でmoshが上手く動かなくなっている件について。
Mosh
Mosh(the mobile shell)は sshの様にサーバーに接続し作業が出来、 さらにネットワークが切れた状態になってもネットワークが復旧し次第 再接続して同じ状態から作業が開始できる様になるツールです。
実際には、まずsshでサーバーに接続し、そこでmosh-server
を立ち上げ、UDP経由で
クライアント側から接続します。
なのでsshの代わりになる、というわけではなく、sshによるアクセスが出来ることが前提になります。
また、UDPポートをいくつか開放しておかないといけません。 (デフォルトでは60000-61000を使います。)
なので外部からのアクセスの制限が強い場合にはこの辺の準備をする必要がある場合があります。
サーバー側では当然sshdのサービスは走っている必要はありますが、
moshに関しては何も走らせておく必要はありません。
mosh-server
コマンドがインストールされてればOKです。
ユーザーローカルのディレクトリにインストールしても使えるので
サーバーの管理者権限がなくてもサーバーにインストールして使うことが出来ます。
(ポート開放とかファイアウォールはやってもらわないと駄目ですが。)
使い勝手としては
$ ssh [email protected]
とする代わりに
$ mosh [email protected]
とするだけなので完全にssh間隔で使えます。
起こった問題
ある時、いつもどおりmoshで接続しようとしたら
[libprotobuf FATAL google/protobuf/generated_message_util.cc:809] CHECK failed: (scc->visit_status.load(std::memory_order_relaxed)) == (SCCInfoBase::kRunning):
Abort trap (core dumped)
というエラーを出して接続できなくなっていました。
普段、数日単位でつなげっぱなしにしてあるのでどのタイミングか分からなかったですが、7月中旬頃です。
どうもprotobuf
関連でエラーが起こってる模様。
このサーバーに普通にアクセスしてバージョンなどをチェックしてみると
$ uname -a
FreeBSD xxx.xxx.xxx 11.2-STABLE FreeBSD 11.2-STABLE #33 r338991M: Fri Sep 28 14:10:47 JST 2018 [email protected]:/usr/obj/usr/src/sys/GENERIC amd64
$ pkg info mosh
mosh-1.3.2_9
Name : mosh
Version : 1.3.2_9
Installed on : Fri Jul 12 12:25:34 2019 JST
Origin : net/mosh
Architecture : FreeBSD:11:amd64
Prefix : /usr/local
Categories : net
Licenses : GPLv3
Maintainer : [email protected]
WWW : https://mosh.org/
Comment : Mobile terminal that supports intermittent connectivity
Shared Libs required:
libprotobuf.so.19
Annotations :
FreeBSD_version: 1102503
repo_type : binary
repository : poudriere
Flat size : 688KiB
Description :
Remote terminal application that allows roaming, supports intermittent
connectivity, and provides intelligent local echo and line editing of
user keystrokes.
Mosh is a replacement for SSH. It's more robust and responsive,
especially over Wi-Fi, cellular, and long-distance links.
WWW: https://mosh.org/
]$ pkg info protobuf
protobuf-3.8.0,1
Name : protobuf
Version : 3.8.0,1
Installed on : Fri Jul 12 12:25:27 2019 JST
Origin : devel/protobuf
Architecture : FreeBSD:11:amd64
Prefix : /usr/local
Categories : devel
Licenses : BSD3CLAUSE
Maintainer : [email protected]
WWW : https://github.com/protocolbuffers/protobuf
Comment : Data interchange format library
Shared Libs provided:
libprotoc.so.19
libprotobuf.so.19
libprotobuf-lite.so.19
Annotations :
FreeBSD_version: 1102503
repo_type : binary
repository : poudriere
Flat size : 22.4MiB
Description :
Protocol Buffers are a way of encoding structured data in an efficient yet
extensible format. Google uses Protocol Buffers for almost all of its internal
RPC protocols and file formats.
WWW: https://github.com/protocolbuffers/protobuf
と言った感じで、両方とも7月12日に新しいバージョンがインストールされたようです。
ちなみにこのサーバーは管理者じゃないので自分で勝手にどうこうはできません。
ちょっと探してみるとFreeBSDのフォーラムにこれに関することがありました。
239038 – net/mosh: Refuses connections due to protobuf error
ちょうどconfirm this bugと言っているバージョンがこれと全く一緒でした。 なので環境の問題というよりはmosh/protobufとFreeBSDの問題のようです。
なんとかしてみようとtry
moshが使えないと非常に面倒なのでなんとかしようとソースからコンパイルとかしてみました。 (ユーザーディレクトリに入れてmoshで接続する時にそれを指定)
まずはmosh 1.3.2の同じバージョンをコンパイルして実行してみましたが当然?同じエラーが出ました。 1.3.0を入れてみても同じエラーでした。
次にprotobufの方を入れてみよう、と。 まず、より新しい3.9.0があったのでそれを試すと、
[user@server ~/tmp/protobuf-3.9.0]$ make
make all-recursive
Making all in .
Making all in src
CXX google/protobuf/stubs/common.lo
google/protobuf/stubs/common.cc:48:2: error: #error "No suitable threading library available."
#error "No suitable threading library available."
^~~~~
*** Error code 1
Stop.
make[2]: stopped in /home/user/tmp/protobuf-3.9.0/src
*** Error code 1
Stop.
make[1]: stopped in /home/user/tmp/protobuf-3.9.0
*** Error code 1
Stop.
make: stopped in /home/user/tmp/protobuf-3.9.0
なんかエラーが出る。3.8.0とかでも同じエラーが出ます。
threading library
がない、と言っていますが、
具体的にはpthread
が見つからないみたいです。
ただ、サーバーに /usr/include/pthread.hや/usr/lib/libpthread.soなどはあります。
そもそもこんな状態ならconfigure
した時点でエラーを吐いてほしいのですが、
configure
は成功し(ただしchecking whether pthreads work with -pthread... no
というログは確かに出ている)
make
で失敗します。
configureファイルの中を見ていくとどうもライブラリを見つける部分に問題があるだけな感じがするので(ちゃんとは見てない)
適当なところでチェックを通してしまうようにしてみます。
(configure内のax_pthread_ok=no
と初期化してるところでax_pthread_ok=yes
にして見つからなくても見つかったようにするように)
これでconfigureも通り、make
も成功しました。
(なので、やはりpthread
はコンパイル時にちゃんと見えてるし使えている。。。)
これを$HOME/usr/libとかにインストールしてLD_LIBRARY_PATHとかの設定をして moshの方を再コンパイル。
configureする時に
$ protobuf_CFLAGS="-L/usr/local/lib -lprotobuf " protobuf_LIBS="-L/usr/local/lib -lprotobuf " ./configure --prefix=$HOME/usr
これでmosh(1.3.2, 1.3.0ともに)を再コンパイルして試してみましたがやはり最初と同じエラーが出ます。
protobuf-3.8.0でも同じ。protobuf-3.7.0も試してみましたがやはり同じ。
protobufの更に古い2.6とかは
最初にautogen.sh
をする際に
[user@server ~/tmp/protobuf-2.6.0]$ ./autogen.sh
Google Test not present. Fetching gtest-1.5.0 from the web...
tar: Error opening archive: Failed to open '/dev/sa0'
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 1586 100 1586 0 0 1103 0 0:00:01 0:00:01 --:--:-- 1104
とか出てしまい駄目。
moshの古いa1.2.5だとconfigureで
configure: error: Package requirements (openssl) were not met:
Package 'openssl', required by 'virtual:world', not found
Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.
Alternatively, you may set the environment variables OPENSSL_CFLAGS
and OPENSSL_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.
みたいなのが出てしまいます。この辺はもう面倒になって真面目にチェックしてません。
ここまで来て一旦諦め。
そしてしばらくしてまた上のFreeBSDのフォーラムを見てみると結構アップデートがあって、
This only happens on FreeBSD 11.2 and 11.3, and the root cause is configure script of protobuf, but only exposed after protobuf 3.8 upgrade, in this protobuf commit:
とあります。この環境は11.2なのでやはり起こる環境らしい。
ただ、3.8にアップグレード後のみ、との話なので、 上で3.7を入れて試したのになんで上手くいかないかは不明。 これらを信じるとすると、コンパイル時にリンクが上手く行かずシステムのpthreadを使ってしまっている様な雰囲気。
ただその後に書いてあるpatchは
--- configure~ 2019-07-22 15:39:35.886057000 +0800
+++ configure 2019-07-22 15:40:41.618362000 +0800
@@ -20122,7 +20122,7 @@
# ignore this macro, third-party headers might not.)
PTHREAD_CFLAGS="-pthread"
- PTHREAD_LIBS=
+ PTHREAD_LIBS="-pthread"
ax_pthread_ok=yes
こんなのがありますが、これは上にも書いた様にそもそもconfigureの段階でpthreadが見つからないとうまくいきません。
多分何か上手くやってないところがあるだけだと思いますが、いまのところまだうまく行ってません。
公式のアップデートコミット
これに関するアップデートが8月20日にFreeBSDのレポジトリにコミットされたようです。
これが実際に降りてくるのがいつになるかわかりませんが、FreeBSD側での対応で一応治るみたいです。
ただ、それまでになんとかしたいのでまだ時々コンパイルを試しているのですが、まだ上手く行かず。
まとめ
moshは非常に便利なので普段から良くsshして作業している人は一度使ってみると 手放せなくなると思います。 (と言う割には皆あまり使ってくれない。。。)
ノートPCで作業していて、ちょっと畳んで他に持っていって作業する際に 即座に作業が開始できるのは一度やるとなくてはならないものになると思うのですが。
今はちょっと上のサーバーで使えなくなっていて、ちょっと経由してでも他のところを踏み台にしたり 色々してますが、早くなおってほしいところ。
コンパイルのところもうちょっと真面目に見れば出来るはずのことではあるとは思いますが。。。