Siburlog

SiblogだとSI BlogっぽいのでSiburlogとする

CoreOSでもtmuxがしたい!

概要

CoreOSでもtmuxくらいは備えてないと、接続が不安定な環境では怖くて使えないので、汚い手で対処したという話。

経緯

GCEのimageメニューの中にCoreOSっちゅーのがある。CoreOSの名前と概要だけは聞いたことがあった。Docker専用の軽量Linuxディストリビューションである。Dockerは流行りだし、いっちょ使ってみるかってことで試し始めた。

Dockerの使い方はここを読みながら弄ってたらなんとなく分かった。

しかし問題が一つあった。CoreOSにはtmuxが備わってないのだ(screenも無いです)。作業中に通信が切れたらと思うと怖い。なんとかしてtmuxが使いたい。

解決方針

CoreOSは、原則としてそれ自体のソフトウェア構成はimmutableに保つ思想のOSである。アプリケーション環境はあくまでDockerコンテナの中に構築せよ、というのが本来の筋。CoreOS自体にはyumrpmもaptもgccも何も無く、ソフトウェアを(エレガントに)追加する方法は無い。

でも今回の話は、CoreOS自体にtmuxを追加しないと意味がない。ので、エレガントじゃなくてもいいやってことで、出来合いのtmuxバイナリを外から持ち込んで使うことにした。CoreOSもx86-Linuxであることに変わりは無いので、バージョンが近い他のx86-Linuxディストリビューションから持ってきても動くだろうと考えた。

バイナリの持ち込み

  • コピー元
    • OS : CentOS7(v3.10)
  • コピー先
    • OS : CoreOS(v3.16)
  • コピーしたファイル
    • /usr/bin/tmux
    • /usr/lib64/libtinfo.so.5.9

使用方法

単純に下記の要領でtmuxを起動すると、一見上手くいったように見えるが、detachしてサーバからlog offし、再度log inしてps aux | grep tmuxなどとしてみると、tmuxが死んでしまっているのが分かって愕然とするだろう。

$ ls $HOME
tmux libtinfo.so.5.9
$ mv libtinfo.so.5.9 libtinfo.so.5
$ LD_LIBRARY_PATH=. ./tmux

詳細はよく分かってないが、下記の議論にあるように、systemd-run -rを使ってやらないと、log off時に残っているプロセスは皆killされてしまうようだ。 https://groups.google.com/forum/#!topic/coreos-dev/JAeABXnQzuE

したがって、結局、下記のようにすることになる。

$ sudo systemd-run --uid=YOURID --gid=YOURID -r sh -c "LD_LIBRARY_PATH=$HOME $HOME/tmux -C"

最後に、作成されたtmuxセッションに対してattachする。このtmuxセッションはサーバとの接続が不慮の事故で切れても維持される。

$ LD_LIBRARY_PATH=. ./tmux attach

まとめ

  • (今現在の)CentOS7からバイナリを持ってくれば、(今現在の)CoreOS上でも動作する。
  • log off後も維持したいプログラム(=tmuxの親プロセス)は、systemd-runを使って起動しないといけない。