CoreOSでもtmuxがしたい!
概要
CoreOSでもtmuxくらいは備えてないと、接続が不安定な環境では怖くて使えないので、汚い手で対処したという話。
経緯
GCEのimageメニューの中にCoreOSっちゅーのがある。CoreOSの名前と概要だけは聞いたことがあった。Docker専用の軽量Linuxディストリビューションである。Dockerは流行りだし、いっちょ使ってみるかってことで試し始めた。
Dockerの使い方はここを読みながら弄ってたらなんとなく分かった。
しかし問題が一つあった。CoreOSにはtmuxが備わってないのだ(screenも無いです)。作業中に通信が切れたらと思うと怖い。なんとかしてtmuxが使いたい。
解決方針
CoreOSは、原則としてそれ自体のソフトウェア構成はimmutableに保つ思想のOSである。アプリケーション環境はあくまでDockerコンテナの中に構築せよ、というのが本来の筋。CoreOS自体にはyumもrpmも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を使って起動しないといけない。