ConoHa Advent Calender 2020 を書くにあたって、なににしようかなと悩みましたが、ConoHa WINGについて書くことにしました。
私は、webの置き場所としてや、sshfsのストレージとして、またssh terminalでのちょいとコマンド実行できるLinux環境として活用しています。
ConoHa WINGでせっかくssh/sftpがあるのだからと、VPSの補助用の環境として使っています。
雑多に、私が使っているCLI関係の話を 2020/12/2 の記事にしようとか思います。
ConoHa WINGとはどんな環境なの?
ConoHa Cloud VPSでは、VMを作ってwebを動かすまで色々設定が必要だったりするが、ConoHa WINGではすぐにwebサーバとして、メールサーバとして使える機能がホスティングサービスとして提供されていますね。
とくに、WordPressを簡単に運用することにかなり注力されていることが、コントロールパネルのweb GUIに見て取れます。
ConoHa WINGはどんなOSで動いているのか?
"uname -a" をみると、収容されているサーバごとに若干変わってはきていますが、下記のような情報が取得できます。
[cXXXXX7@web0007 ~]$ uname -a
Linux web0007.sh.tyo1 3.10.0-714.10.2.lve1.5.17.1.el7.x86_64 #1 SMP Tue May 22 10:39:25 EDT 2018 x86_64 x86_64 x86_64 GNU/Linux
"el7"と見えてピンときた人は、多いと思います。
現行、sshでloginできるwebホスティングの環境は、CentOS7.x ベースの環境であることが確認できます。また、x86_64の実行環境であることもわかります。
このカーネルのバージョン "3.10.0-714.10.2.lve1.5.17.1.el7.x86_64" でGoogle検索すると、ユーザごとにコンテナ技術でリソース隔離(lve)とJailing技術(cagefs)が各ユーザごとに適用可能な、ホスティング用のOSであるCloudLinuxのKernelパッケージであることがわかります。
自分が借りているサーバについては、kernelについては、7.4と7.5の間ぐらいのbuildがベースになっているようですね。
(契約した環境によって異なるのではないかと思います)
- CentOS 7.4.1708 : kernel-3.10.0-693.el7.src.rpm (installer のkernel src.rpm)
- CentOS 7.5.1804 : kernel-3.10.0-862.el7.src.rpm (installer のkernel src.rpm)
つまり、以下の条件が揃えば、ssh環境のCLIなどの環境を充実させることができることになります。
- el7ということで、CentOS7で動くバイナリなら持ち込んでも動きそう
- バイナリ持ち込みするときには、staticなものか、dynamicなものはライブラリパスが通す必要がある
ConoHa WING で wp CLIを使う
まずは、すでに入っているphpを活用する方法。
ConoHa WING は かなりWordPressの運用を簡単にすることに注力して、コンパネのweb画面が作られていますが、WordPressのCLIを入れることで、cronなどの自動実行により、スクリプト実行などもできるかなと。
phar版の "wp-cli.phar" をcurlでdownloadする
curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
実行権限をつける("chmod +x")
入れるのは"$HOME/bin"にいれます
chmod +x wp-cli.phar
mkdir bin
mv wp-cli.phar bin
cd bin
ln -s wp-cli.phar wp
"--path" オプションを入れれば使える
ConoHa WINGで自分のWordPressがインストールされているpath(相対パス、または絶対パス)まで指定することで、その中のWordPressのphpから読み取ってくれる。
WordPressのversion取得
[c6xxxxxx@web0007 ~]$ wp --path=$HOME/public_html/coha.tw core version
5.5.3
WordPessでサイトを複製するために、exportを取得するなどもCLIで可能となります。
c6xxxxxx@web0007 ~]$ wp --path=$HOME/public_html/coha.tw export
Starting export process...
Writing to file /home/c6xxxxxx/cohacloudopshackers.wordpress.2020-11-17.000.xml
Success: All done with export.
pluginの管理など、WordPressのWeb GUIからだと、ポチポチ押して、選択してupdateみたいな煩雑な作業は、CLIで簡単にできるのかなと思います。
[c6xxxxxx@web0007 ~]$ wp --path=public_html/coha.tw plugin
usage: wp plugin activate [<plugin>...] [--all] [--network]
or: wp plugin deactivate [<plugin>...] [--uninstall] [--all] [--network]
or: wp plugin delete [<plugin>...] [--all]
or: wp plugin get <plugin> [--field=<field>] [--fields=<fields>] [--format=<format>]
or: wp plugin install <plugin|zip|url>... [--version=<version>] [--force] [--activate] [--activate-network]
or: wp plugin is-active <plugin>
or: wp plugin is-installed <plugin>
or: wp plugin list [--<field>=<value>] [--field=<field>] [--fields=<fields>] [--format=<format>]
or: wp plugin path [<plugin>] [--dir]
or: wp plugin search <search> [--page=<page>] [--per-page=<per-page>] [--field=<field>] [--fields=<fields>] [--format=<format>]
or: wp plugin status [<plugin>]
or: wp plugin toggle <plugin>... [--network]
or: wp plugin uninstall [<plugin>...] [--deactivate] [--skip-delete] [--all]
or: wp plugin update [<plugin>...] [--all] [--exclude=<name>] [--minor] [--patch] [--format=<format>] [--version=<version>] [--dry-run]
or: wp plugin verify-checksums [<plugin>...] [--all] [--strict] [--format=<format>]
See 'wp help plugin <command>' for more information on a specific command.
これにより、たとえば、plugin listは下記のように取得できる
[c6xxxxx@web0007 ~]$ wp --path=public_html/coha.tw plugin list
+------------------------+----------+-----------+---------+
| name | status | update | version |
+------------------------+----------+-----------+---------+
| akismet | inactive | none | 4.1.7 |
| conoha-wing-plugin | active | none | 1.0 |
| cache-clear-conoha | active | none | 1.0.0 |
| manage-xml-rpc | inactive | none | 1.0 |
| siteguard | inactive | available | 1.5.0 |
| ts-webfonts-for-conoha | inactive | none | 1.0.2 |
| wp-multibyte-patch | inactive | available | 2.8.4 |
+------------------------+----------+-----------+---------+
これについては、ホストのphpに依存しているところがあるので、phpのバージョンが上がったりすると、wp CLIの方もupgradeしないとだめなので、運用には注意も必要です。
wp コマンドをbashで補完してもらう
wp CLIコマンドのbasでの補完(completion)も入れておこう。
以下のURLがgithubのwp CLIのgit masterブランチの直リンクなので、curlなどでdownloadして配置する。
ホームディレクトリにetcとか作って
[c6xxxxxx@web0007 ~]$ mkdir ~/etc
curlでダウンロード
[c6xxxxx@web0007 ~]$ curl -o etc/wp-completion.bash https://raw.githubusercontent.com/wp-cli/wp-cli/master/utils/wp-completion.bash
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 495 100 495 0 0 1544 0 --:--:-- --:--:-- --:--:-- 1546
[c6xxxxxx@web0007 ~]$ file etc/wp-completion.bash
etc/wp-completion.bash: ASCII text
bash で読み込むようにする
[c6xxxxxx@web0007 ~]$ echo 'source $HOME/etc/wp-completion.bash' >> .bashrc
[c6xxxxxx@web0007 ~]$ grep wp-completion .bashrc
source $HOME/etc/wp-completion.bash
これで、ログインし直すか、手動で下記のように実行して読み込みすればbashでのコマンドライン補完が効くようになる
source $HOME/etc/wp-completion.bash
Linux Homebrew for ConoHa WING (brew だめらしい)
Homebrew 2.0 から Linuxbrew と統合されてしまってから、Linuxbrew は殆どの少し古い環境では動作しなくなってしまいました。
CentOS7.xでは、まだ動く環境がある(bottleでちゃんとインストールされる)ので、ちょっとConoHa WINGで動かないのは残念である(Hackしたい)。
git clone で 以下のようにインストールすると次のようになる。
だが、glibc問題により、最終的には動かないので、"だめらしい"ということなのです。
ssh loginして、git clone
n-gohko@$ ssh wing
Warning: No xauth data; using fake authentication data for X11 forwarding.
X11 forwarding request failed on channel 0
[c6xxxxxx@web0007 ~]$ git clone https://github.com/Homebrew/brew ~/.linuxbrew/Homebrew
Cloning into '/home/c6xxxxxx/.linuxbrew/Homebrew'...
remote: Enumerating objects: 46, done.
remote: Counting objects: 100% (46/46), done.
remote: Compressing objects: 100% (37/37), done.
remote: Total 159587 (delta 18), reused 26 (delta 8), pack-reused 159541
Receiving objects: 100% (159587/159587), 40.87 MiB | 10.78 MiB/s, done.
Resolving deltas: 100% (118219/118219), done.
binを設定
[c6xxxxxx@web0007 ~]$ mkdir .linuxbrew/bin
[c6xxxxxx@web0007 ~]$ ln -s ~/.linuxbrew/Homebrew/bin/brew ~/.linuxbrew/bin
brewを環境設定して、rubyが無いので、最初にbottleのportable-rubyが入る。
[c6xxxxxx@web0007 ~]$ eval $(~/.linuxbrew/bin/brew shellenv)
[c6xxxxxx@web0007 ~]$ brew
which: no ruby in (/usr/bin:/bin:/usr/sbin:/sbin)
==> Downloading https://linuxbrew.bintray.com/bottles-portable-ruby/portable-ruby-2.6.3_2.x86_64_linux.bottle.tar.gz
######################################################################## 100.0%
==> Pouring portable-ruby-2.6.3_2.x86_64_linux.bottle.tar.gz
Example usage:
brew search [TEXT|/REGEX/]
brew info [FORMULA...]
brew install FORMULA...
brew update
brew upgrade [FORMULA...]
brew uninstall FORMULA...
brew list [FORMULA...]
Troubleshooting:
brew config
brew doctor
brew install --verbose --debug FORMULA
Contributing:
brew create [URL [--no-fetch]]
brew edit [FORMULA...]
Further help:
brew commands
brew help [COMMAND]
man brew
https://docs.brew.sh
brew updateなどを走らせると、不完全であることがわかります。
[c6xxxxxx@web0007 ~]$ brew update [64/295]
==> Tapping homebrew/core
Cloning into '/home/c6xxxxxx/.linuxbrew/Homebrew/Library/Taps/homebrew/homebrew-core'...
remote: Enumerating objects: 781, done.
remote: Counting objects: 100% (781/781), done.
remote: Compressing objects: 100% (375/375), done.
remote: Total 1025061 (delta 452), reused 588 (delta 406), pack-reused 1024280
Receiving objects: 100% (1025061/1025061), 362.50 MiB | 22.39 MiB/s, done.
Resolving deltas: 100% (714080/714080), done.
Tapped 2 commands and 5376 formulae (5,660 files, 400.2MB).
==> Downloading https://linuxbrew.bintray.com/bottles/patchelf-0.11.x86_64_linux.bottle.tar.gz
<<中略>>
最後にglibcを入れようとする。
==> Downloading from https://akamai.bintray.com/
==> Installing curl dependency: glibc
==> ../configure --disable-debug --disable-dependency-tracking --disable-silent-rules --prefix=/home/c6xxxxxx/.linuxbrew/Cellar/glibc/2.23 --enable-obsolete-rpc --without-selinux --with-binutils=/home/c68194
Last 15 lines from /home/c6xxxxxx/.cache/Homebrew/Logs/glibc/01.configure:
2020-11-17 15:10:27 +0900
../configure
--disable-debug
--disable-dependency-tracking
--disable-silent-rules
--prefix=/home/c6xxxxxx/.linuxbrew/Cellar/glibc/2.23
--enable-obsolete-rpc
--without-selinux
--with-binutils=/home/c6xxxxxx/.linuxbrew/opt/binutils/bin
--with-headers=/home/c6xxxxxx/.linuxbrew/opt/linux-headers/include
ここで、失敗してしまいます。
homebrew at Linux (2.0 or lator)を、ConoHaWINGで使うのは無理そうです。
glibcを別バージョンでインストールして、brewを再構築しようとしてしまうため、Host OSに入っているglibcとバッティングして最終的にはエラーになります。
ConoHa WINGでHostにはgccが導入されているので、コンパイルなどは可能である。
[c6xxxxxx@web0007 ~]$ gcc --version
gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-28)
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
以前は、下記のようにglibcを除外してインストールなどができたのですが、最近はできなさそうです。
brew install gcc --without-glibc
ということで、今後動くようになったらいいな、Homebrew@Linux です。
Homebrew Linux for ConoHa WING 今後の検証方針
- gccなど同じような環境をCentOS7で作ってbinaryをrsync
- 何もしないで、Linux上でHomebrewを入れると、glibcが入ってしまう
- "--force-bottle" オプションでも、bottleとして glibcが必要な状態になる
これから、linuxbrew-legacy が githubでArchiveされてるので、そちらをforkしてちょっと研究してみようかと思います。
-
https://github.com/Linuxbrew/legacy-linuxbrew
- 5年前に停止もっと古い
-
https://github.com/Linuxbrew/brew
- 2年前停止、こちらのときには、動いていた気がする
-
ref:
- Linuxbrew改めHomebrew@Linuxでrelocation errorに対する対処法(08 May 2019) | https://rcmdnk.com/blog/2019/05/08/computer-linux-homebrew/
- https://gist.github.com/anonymous/27dcd5acdf5d906e811b47e35897177d
- https://gist.github.com/anonymous/a19fac9acdcb4c9a2b7703fabd43f464
- https://gist.github.com/anonymous/760a2f887eaf22194f71148de5b9f3b0
tmuxないけど : pymux
ssh terminalで使っているときに、突然のssh 切断などで作業が中断するしんどい思いはしたくないですよね。
Linuxbrewが使えれば、tmux を入れるところですが、上記な理由で使えないのです。
ただ、ConoHa Wingも共用ホスティングであり、リソースをユーザ間で共有するプランだったりすると、bot掃除でkillされるかもしれないので、そのあたりは長時間運用にはご注意が必要ですが、PythonのTerminal Multiplexerがありますので、それを使いましょう。
ConoHa WINGの python環境 を設定
ConoHa WING のpythonは .bashrcにより、"/usr/local/bin" に PATH が通っているために python コマンドで呼ばれるのは、python3.6 となっている。
[c6xxxxxx@web0007 ~]$ ls -l /usr/local/bin/
合計 0
lrwxrwxrwx 1 root root 23 2月 26 2020 gem -> /opt/alt/ruby25/bin/gem
lrwxrwxrwx 1 root root 22 7月 23 2018 lsphp -> /etc/cl.selector/lsphp
lrwxrwxrwx 1 root root 28 2月 26 2020 pip -> /opt/alt/python36/bin/pip3.6
lrwxrwxrwx 1 root root 30 2月 26 2020 pydoc -> /opt/alt/python36/bin/pydoc3.6
lrwxrwxrwx 1 root root 31 2月 26 2020 python -> /opt/alt/python36/bin/python3.6
lrwxrwxrwx 1 root root 24 2月 26 2020 rake -> /opt/alt/ruby25/bin/rake
lrwxrwxrwx 1 root root 24 2月 26 2020 rdoc -> /opt/alt/ruby25/bin/rdoc
lrwxrwxrwx 1 root root 24 2月 26 2020 ruby -> /opt/alt/ruby25/bin/ruby
この python を手がかりに、pyenv をインストールして、好きなPython環境をインストールしてもらってもよいのだが、とりあえず簡単に、HostのPython3.6を整えて使ってみる。
[ConoHa WING]ConoHa WING で Anaconda 環境を整える
https://note.com/hyanagisawa/n/nedd7484acd60
"/usr/local/bin" の シンボリックリンクのように、コマンドは "/opt/alt/*" 以下にあるようなので、使いたいバージョンのPATHを通しておきます。
- python 2.7 : /opt/alt/python27/bin
- python 3.6 : /opt/alt/python36/bin
python3.6 の bin配下を確認すると、pip3, pydoc3, pyvenv-3.6 も使えるようにします。
[c6xxxxxx@web0007 ~]$ ls -l /opt/alt/python36/bin/
合計 60
-rwxr-xr-x 1 root 995 108 7月 4 2018 2to3-3.6
-rwxr-xr-x 1 root root 247 7月 28 2017 easy_install-3.6
lrwxrwxrwx 1 root 995 7 7月 24 2018 idle3 -> idle3.6
-rwxr-xr-x 1 root 995 106 7月 4 2018 idle3.6
lrwxrwxrwx 1 root root 9 7月 24 2018 pip-3 -> ./pip-3.6
lrwxrwxrwx 1 root root 8 7月 24 2018 pip-3.6 -> ./pip3.6
-rwxr-xr-x 1 root root 219 7月 28 2017 pip3
-rwxr-xr-x 1 root root 219 7月 28 2017 pip3.6
lrwxrwxrwx 1 root 995 8 7月 24 2018 pydoc3 -> pydoc3.6
-rwxr-xr-x 1 root 995 91 7月 4 2018 pydoc3.6
lrwxrwxrwx 1 root 995 9 7月 24 2018 python3 -> python3.6
lrwxrwxrwx 1 root 995 8 7月 24 2018 python3-2to3 -> 2to3-3.6
lrwxrwxrwx 1 root 995 16 7月 24 2018 python3-config -> python3.6-config
-rwxr-xr-x 2 root 995 11384 7月 4 2018 python3.6
lrwxrwxrwx 1 root 995 17 7月 24 2018 python3.6-config -> python3.6m-config
-rwxr-xr-x 2 root 995 11384 7月 4 2018 python3.6m
-rwxr-xr-x 1 root 995 173 7月 4 2018 python3.6m-config
-rwxr-xr-x 1 root 995 3487 7月 4 2018 python3.6m-x86_64-config
lrwxrwxrwx 1 root 995 10 7月 24 2018 pyvenv -> pyvenv-3.6
-rwxr-xr-x 1 root 995 448 7月 4 2018 pyvenv-3.6
手動で、下記のコマンドでパスを通すと、python3.6の
export PATH=/opt/alt/python36/bin:$PATH
.bashrc にも PATH を入れておきます
echo 'export PATH=/opt/alt/python36/bin:$PATH' >> $HOME/.bashrc
pip3にPATHが通ったことを確認
[c6xxxxxx@web0007 ~]$ which pip3
/opt/alt/python36/bin/pip3
pipでは、ユーザのHomeにインストールする場合には "--user" オプションを付けると、Linuxでは "$HOME/.local/" 以下にインストールされます。
pymux をインストールしてみます。
[c6xxxxxx@web0007 ~]$ pip3 install --user pymux
Collecting pymux
Downloading https://files.pythonhosted.org/packages/a8/4a/c9ef8349a3c9d3544ce61314c7ae8561efd233dd429191cb696c4808b5c4/pymux-0.14-py3-none-any.whl (78kB)
100% |████████████████████████████████| 81kB 5.3MB/s
Collecting six>=1.9.0 (from pymux)
Downloading https://files.pythonhosted.org/packages/ee/ff/48bde5c0f013094d729fe4b0316ba2a24774b3ff1c52d924a8a4cb04078a/six-1.15.0-py2.py3-none-any.whl
Collecting docopt>=0.6.2 (from pymux)
Downloading https://files.pythonhosted.org/packages/a2/55/8f8cab2afd404cf578136ef2cc5dfb50baa1761b68c9da1fb1e4eed343c9/docopt-0.6.2.tar.gz
Collecting pyte<0.6.0,>=0.5.1 (from pymux)
Downloading https://files.pythonhosted.org/packages/5c/0b/f219072567ebcae41211f7c268a36e6d281c3be619984c02653f16ec084c/pyte-0.5.2-py2.py3-none-any.whl
Collecting prompt-toolkit<1.1.0,>=1.0.8 (from pymux)
Downloading https://files.pythonhosted.org/packages/64/27/5fd61a451d086ad4aa806dc72fe1383d2bc0e74323668672287f616d5d51/prompt_toolkit-1.0.18-py3-none-any.whl (245kB)
100% |████████████████████████████████| 245kB 4.0MB/s
Collecting wcwidth (from pyte<0.6.0,>=0.5.1->pymux)
Downloading https://files.pythonhosted.org/packages/59/7c/e39aca596badaf1b78e8f547c807b04dae603a433d3e7a7e04d67f2ef3e5/wcwidth-0.2.5-py2.py3-none-any.whl
Installing collected packages: six, docopt, wcwidth, pyte, prompt-toolkit, pymux
Running setup.py install for docopt ... done
Successfully installed docopt-0.6.2 prompt-toolkit-1.0.18 pymux-0.14 pyte-0.5.2 six-1.15.0 wcwidth-0.2.5
You are using pip version 9.0.1, however version 20.3 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
[c6xxxxxx@web0007 ~]$
以下のようにインストールされています。
[c6xxxxxx@web0007 ~]$ ls -l $HOME/.local/bin
合計 5
-rwxr-xr-x 1 c6xxxxxx c6xxxxxx 242 12月 2 21:38 pymux
[c6xxxxxx@web0007 ~]$ ls -l $HOME/.local/
合計 1
drwxr-xr-x 2 c6xxxxxx c6xxxxxx 3 12月 2 21:38 bin
drwx------ 3 c6xxxxxx c6xxxxxx 3 12月 2 21:38 lib
[c6xxxxxx@web0007 ~]$ ls -l $HOME/.local/lib/python3.6/site-packages/
合計 143
drwxr-xr-x 2 c6xxxxxx c6xxxxxx 4 12月 2 21:38 __pycache__
drwxr-xr-x 2 c6xxxxxx c6xxxxxx 7 12月 2 21:38 docopt-0.6.2-py3.6.egg-info
-rw-r--r-- 1 c6xxxxxx c6xxxxxx 19946 6月 16 2014 docopt.py
drwxr-xr-x 11 c6xxxxxx c6xxxxxx 35 12月 2 21:38 prompt_toolkit
drwxr-xr-x 2 c6xxxxxx c6xxxxxx 9 12月 2 21:38 prompt_toolkit-1.0.18.dist-info
drwxr-xr-x 5 c6xxxxxx c6xxxxxx 26 12月 2 21:38 pymux
drwxr-xr-x 2 c6xxxxxx c6xxxxxx 10 12月 2 21:38 pymux-0.14.dist-info
drwxr-xr-x 3 c6xxxxxx c6xxxxxx 13 12月 2 21:38 pyte
drwxr-xr-x 2 c6xxxxxx c6xxxxxx 9 12月 2 21:38 pyte-0.5.2.dist-info
drwxr-xr-x 2 c6xxxxxx c6xxxxxx 8 12月 2 21:38 six-1.15.0.dist-info
-rw-r--r-- 1 c6xxxxxx c6xxxxxx 34159 12月 2 21:38 six.py
drwxr-xr-x 4 c6xxxxxx c6xxxxxx 10 12月 2 21:38 wcwidth
drwxr-xr-x 2 c6xxxxxx c6xxxxxx 9 12月 2 21:38 wcwidth-0.2.5.dist-info
ここにも、PATHを通しておきます。
export PATH=$HOME/.local/bin:$PATH
echo 'export PATH=$HOME/.local/bin:$PATH' >> $HOME/.bashrc
これで、"tmux" ならぬ "pymux" が実行できます。
使い方は、tmux とコンパチなので、pymux のサイトにて詳細を確認してみてください。
pumux セッションを始める
$ pymux
pymux セッションを中断(dettach)
上記のような pymux が terminalに表示されているときに、
[Control] b + d
pymux セッションを始める
$ pymux attach
pymux の複数のセッションを起動している場合
セッションのUnit socket pathの一覧取得
[c6xxxxxx@web0007 ~]$ pymux list-sessions
/tmp/pymux.sock.c6819497.3
/tmp/pymux.sock.c6819497.2
socketの最後の".2"とか".3"とかが実行番号と思って良いので、それを指定してattach
[c6xxxxxx@web0007 ~]$ pymux attach -S /tmp/pymux.sock.c6819497.2
```
ではでは、よいConoHa WINGライフを。