WSLにpython環境構築

普通にやるのはあきらめました。

WSLでやります

PowerShellを管理者で起動

Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux

あとは Microsoft StoreからUbuntuを入れる(18.04LTSでした)

sshdを動くようにする

apt install openssh-server

portとかlistenは適当に

 

初期設定とかいろいろインストール

apt-get update
apt-get upgrade
apt -y install bzip2 openssl git
apt install apt-file
apt update
apt-file search readline
apt-get install make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev xz-utils tk-dev
apt-get install libffi-dev
apt install git build-essential libssl-dev libreadline-dev zlib1g-dev x11-apps x11-utils x11-xserver-utils libsqlite3-dev nodejs fonts-ipafont libxml2-dev libxslt1-dev
apt install rcs

これでXが通る(MobaXterm 11.1を使用)

タスクスケジューラで /usr/bin/sudo /usr/sbin/service ssh start をログイン時に実行するようにする

ログイン時に自分のパスワードが必要になるけど、visudoで通るようにするとうまく動かないのであきらめる

python環境

pyenv

別エントリを元に、pyenvをインストール。上のapt-getでだいたいのライブラリは入ります。このあとは、pyenv の git cloneからでおけ。たりないときには検索検索ぅ

画像系のライブラリを入れる

pip install --upgrade pip
pip install matplotlib
pip install opencv-python
pip install pydicom
pip install requests
pip install watson-developer-cloud

しれっとWatsonのAPIも入れてるし

社内からgit接続するときの初期設定

こういうエラーがでたときは社内からのアクセスが不可のとき

fatal: unable to connect to github.com:
github.com[0: 192.30.255.113]: errno=Resource temporarily unavailable
github.com[1: 192.30.255.112]: errno=Resource temporarily unavailable

そのときはこの初期設定を一度だけやればよい

git config --global url."https://".insteadOf git://

pyenv と virtualenv の違い

似ているようで違うので自分メモ

CentOS 6 のレガシーな環境は Python 2.6です。

pyenv

一つのシステムに複数のバージョンのPythonを入れるためのもの

  • linux(というかCentOSとかRHとか各ディストリ)は割とPythonに依存している
  • よって、/usr/bin/python を差し替えるようなインストールは難しい
  • しかもPython 2/3の問題もある
  • 使いたいpackage によって必要なPythonのバージョンも異なる

というものに対応するためのもの。一つのシステムに複数のバージョンのpython環境を入れるためのもの。

  • pyenv global 2.7.15
    システム全体で2.7.15を使わせる。linuxではほぼ使わないと思われ

  • pyenv local 2.7.15
    今いるフォルダ(cwd)で、未来永劫 2.7.15 を使う。ここでpip installすると、システム全体の 2.7.15のsite-packageに入る。そのフォルダから上に行くと元から入っている2.6を使う

  • pyenv shell 2.7.15
    現在実行しているシェルで2.7.15を使うexit(ctrl-D)してloginしなおすと、2.6に戻る。

この3つで自分的にはOK

 

virtualenv

 

pyenvでインストールした環境から自分専用の環境をforkするもの

ぶっちゃけ自分専用のvm使い捨て環境ならいらないか、と思っていたが、wheelを使えるので一人でも意味がある。

  • pyenv virtualenv 2.7.15 2715forTensor
    今いるフォルダにpyenvで作成した、2.7.15 の環境から特別な環境を作る。このあとにpipでインストールしたパッケージはシステム全体には波及されない
  • pip install wheel
    wheel(コンパイル済み環境を保存する仕組み)をインストールする。
  • pyenv exec pip wheel --wheel-dir=~/wheelhouse -r 2715forTensor.txt
    今のvirtualenv環境を保存する。wheel-dirと.txtを保存しておけば下記で使える

別のサーバでpyenv/virutalenvを入れたあと

  • pyenv virtualenv 2.7.15 275forTensor
    pip install -r 2715forTensor.txt --use-wheel --no-index --find-links=~/wheelhouse
    別のサーバとかでも上の環境が復元できるはず。インストール漏れとか間違いがかなり減るはず。

これくらいで自分はに充分かな。

 

 

 

cloudn で NFSサーバを構築

特に難しいことはないです。

yum -y install nfs するとか普通の話。検索すれば方法はすぐわかるはずです。

 

ハマりポイントはあくまでも自分のアホさ

 

cloud n では セキュリティグループという名前の仮想ファイアーウォールがあるのですが、それはサーバというよりアカウント単位での管理ができ、複数のサーバを同一のファイアーウォール設定で守ることができます。

普通のサーバならfirewalld か iptables でやるはずのことがGUIで、かつ同一用途のサーバに対して一括でできるので便利といえば便利です。

で、nfs v4 なのでとある単一ポートを特定のサーバに解放すればオシマイのはずですがどうしても疎通が取れず、rpcxxを足したり、しまいにはずどーんとデカく穴を開けてもダメ・・・

 

はい、アカウントが違いました。ssh 的には普通に相互の疎通ができるのでぽんやりしてたといわれても「ぼーっと生きてんじゃねーよ」と言われてもしかたないっす。

用途別に親アカウントからサブアカウントが発給できますが、nfsdを立てたアカウントがクライアント側のアカウントとは別のものでした。しかもいわゆるFQDNではhostname.hoge.comのhoge.comは同一なので気付くのが遅れた次第……
我ながらアホなミス。

 

しかし、これ、SPoFになるな・・・どうしよ。

いまさら centos6 + cloud n ObjectStorage

ハマりポイントが多すぎる(笑)

とりあえずpyenv のインストールから

 

■ざっくり足りなさそうなモジュールをyumで入れる。

# yum -y install gcc bzip2 bzip2-devel openssl openssl-devel readline readline-devel sqlite-devel tk-devel git

■ pyenvインストール

# cd /usr/local/
# git clone git://github.com/yyuu/pyenv.git ./pyenv

# mkdir -p ./pyenv/versions ./pyenv/shims
# cd pyenv/plugins/
# git clone git://github.com/yyuu/pyenv-virtualenv.git

■ pyenv 環境を profile.dに入れる

# echo 'export PYENV_ROOT="/usr/local/pyenv"' >> /etc/profile.d/pyenv.sh
# echo 'export PATH="${PYENV_ROOT}/shims:${PYENV_ROOT}/bin:${PATH}"' >> /etc/profile.d/pyenv.sh

■ 上記環境変数をsudoしても引き継がれるようにする。

# visudo

----- 編集 -----
#Defaults secure_path = /sbin:.........

Defaults env_keep += "PATH"
Defaults env_keep += "PYENV_ROOT"

■ 確認

# pyenv --version

curlがデフォルトでは古すぎるので入れる

# yum update -y nss curl libcurl

■ 2.7.9以降ならSNI対応。2.7.15が 2.7のfinal release

# pyenv install 2.7.15

# 10分くらいはかかる

 

■ ワーキングディレクトリを作って、そこでのpythonを設定
一般ユーザにもどる

$ mkdir py2715(なんでもよい)
$ cd py2715
$ sudo pyenv local 2.7.15

これでそこのフォルダでは 2.7.15が動く

■ 準備
最初の儀式

$ sudo pip install --upgrade pip

$ sudo pip install awscli

$ aws configure
AWS Access Key ID [None]:
AWS Secret Access Key [None]:
Default region name [None]:
Default output format [None]:

 

最初の二つにはCloudnポータルのAPIアクセスキー・秘密キー管理のページで見えるものを入れる
あとの二つは空白でOK

 

■ObjectStorageの古いシグネチャバージョン対応

 
$ vi ../.aws/credentials
最後に以下の二行を追加

s3 =
   signature_version = s3

 ■みてみる

$ aws s3 --endpoint-url "https://str.cloudn-service.com/" ls
2018-12-03 17:35:44 test-bucket

 見えました・・・

非常に間抜けな自分

cloudn の某サーバがリブートしていた。まぁ、故障はあるものだし、それはよい。アホだったのは自分。

 

まず、メールが届かなくなった。なぜか?

 

cloudn に置いていたのは、bindサーバ。なぜDNSサービスをつかわないかというと、ドメイン数が無駄に多くて、1000円(税別、以下同様)ではおさまらないからだ。あと、WebGUIがとろくて、ちょっとうんざりするというのもある。APIは面倒だし。

しかし仮想ファイヤウォールとしてセキュリティグループがそこそこ優秀なので、primary のDNSを置くにはよいか、という判断で設置した。去年、2014年10月からは月額450円だし。

secondaryは大阪にあると自称している別の……わざわざだまってることもないから書くとFreebit のやはり500円未満サービスを利用している。こっちはOpenVZなのでなんでもできるけではないが、安価なのと地理的要因と、元DTIユーザだったこともあって利用していたミニWebサーバを流用したわけだ。

メールサーバはさらに別のクラウド。これはどこか書かない。場所も知らない。ある程度のストレージ容量が欲しいので、これだけ1000円を越えてるプランだ(2000円までは行かない。消費税を足しても)。

 

実はここを契約する前にカゴヤを試してみた。容量は充分だったが、こちらもOpenVZだったのでユーザ数制限がキツく、崩壊した。2ヵ月ほど遊ばせておいたが、2014年の年末くらいに解約した。POP前提のメールサーバのような容量のわりにユーザ数が必要なものにはOpenVZはまったく向かないことを学んだ。そんなこと学びたくなかったがしかたない。

 

話を戻すと、メールが届かなくなった理由は、cloudnにおいてあったサーバ(DNS-p)のchkconfig忘れという超間抜けな理由だった。

しかし、freebit にセコンダリ(DNS-s)があるじゃないか、と思ったが、ともかく疎通しないものはしかたない。ログインしようにも名前解決できないので、IPでsshしてログイン、

service named start

で、解決した。じゃぁ、なぜDNS-sは働かなかったのか?と思い、そちらにログインすると理由はすぐ判明。

ipconfigで締めだしてるし(笑)。そら、セコンダリとして動くはずないわ。なぜかPOP3sは通るように書いてあるが、dovecotyum すらしてないぞ。

というわけで、相手のMTA側にキャッシュが残ってないとメールが届かない、という状況になりました。で、MXの書き換えを年末に実施したときのままの設定で、TTLが300のまま。そら、たいがいキャッシュされてないわな……

というわけで間抜けなのは自分だったというオチです。

 

cloudnの障害報告はメールで来るので、それが届いたのは自分でDNSの復旧がおわった後でした(笑)。