SageMath のインストールと設定の備忘録です.統計パッケージの R を Web フロントエンドで使うのが目的.SageMath 自体の概要を知りたい場合は,こことかここが分かり易い.
インストールから Web フロントエンドの起動まで
PPA が利用でき,バイナリパッケージでのアップデートが可能なことから,Ubuntu 上に構築することにします.Ubuntu 16.04 LTS のインストールと設定はこちら.
まずは,システムへの PPA の登録と SageMath と必要パッケージのインストール.
$ sudo -E apt-add-repository -y ppa:aims/sagemath $ sudo -E apt-get update $ sudo -E apt-get install sagemath-upstream-binary $ sudo apt-get -y install gnutls-bin
すると約 5G 分のファイルのインストールが始まります.分かってはいましたが,巨大ですねぇ….しばらく放っておきます.終ったら,
$ sage ┌────────────────────────────────────────────────────────────────────┐ │ SageMath version 7.2, Release Date: 2016-05-15 │ │ Type "notebook()" for the browser-based notebook interface. │ │ Type "help()" for help. │ └────────────────────────────────────────────────────────────────────┘ Setting permissions of DOT_SAGE directory so only you can read and write it. sage: notebook.setup() Domain name [localhost]: sage.*****.local .... Signing certificate... Successfully configured notebook. sage: notebook.setup() Domain name [localhost]: sage.*****.local .... Signing certificate... Successfully configured notebook. sage: notebook(secure=True, interface="") --------------------------------------------------------------------------- RuntimeError Traceback (most recent call last) <ipython-input-2-d75b1e180d5b> in <module>() ----> 1 notebook(secure=True, interface="") sage/misc/lazy_import.pyx in sage.misc.lazy_import.LazyImport.__call__ (/usr/lib/sagemath//src/build/cythonized/sage/misc/lazy_import.c:3627)() /usr/lib/sagemath/local/lib/python2.7/site-packages/sagenb/notebook/notebook_object.py in __call__(self, *args, **kwds) 237 """ 238 def __call__(self, *args, **kwds): --> 239 return self.notebook(*args, **kwds) 240 241 notebook = run_notebook.notebook_run /usr/lib/sagemath/local/lib/python2.7/site-packages/sagenb/notebook/run_notebook.py in notebook_run(self, directory, port, interface, port_tries, secure, reset, accounts, openid, server_pool, ulimit, timeout, doc_timeout, upload, automatic_login, start_path, fork, quiet, server, profile, subnets, require_login, open_viewer, address) 474 import OpenSSL 475 except ImportError: --> 476 raise RuntimeError("HTTPS cannot be used without pyOpenSSL" 477 " installed. See the Sage README for more information.") 478 RuntimeError: HTTPS cannot be used without pyOpenSSL installed. See the Sage README for more information. sage:
とコマンドラインでは起動しますし,notebook.setup() で ssl のキー等も作られるのですが,pyOpenSSL が無いと言われて起動できません.で,確かに
sage: import sys sage: sys.path ['', '/usr/lib/sagemath/local/bin', .... '/usr/lib/sagemath/src'] sage:
と python が読み込むライブラリのパスを調べ,実際にその中を見ても pyOpenSSL は無い.しかし,pip は /usr/lib/sagemath/local/bin/pip にある.だから,
$ sudo /usr/lib/sagemath/local/bin/pip install pyopenssl Traceback (most recent call last): File "/usr/lib/sagemath/local/bin/pip", line 5, in <module> from pkg_resources import load_entry_point ImportError: No module named pkg_resources $
とすればよいのかと思ったら,何だか怒られてしまいます.色々試した結果,以下の通り対処することで pip が使えるようになりました.しかし,これは良い対処方法では無い気がする.
$ wget https://bootstrap.pypa.io/get-pip.py $ sudo /usr/lib/sagemath/local/bin/python get-pip.py $ sudo /usr/lib/sagemath/local/bin/pip Usage: pip <command> [options] ....
これで pip で pyopenssl をインストールできますが,インスト―ル途中で,ffi と openssl のライブラリが無いと怒られるので,事前に libffi-dev と libssl-dev を入れます.で,やっと
$ sudo apt-get -y install libffi-dev libssl-dev $ sudo /usr/lib/sagemath/local/bin/pip install pyopenssl $ sudo /usr/lib/sagemath/local/bin/pip install service_identity $ sage ┌────────────────────────────────────────────────────────────────────┐ │ SageMath version 7.2, Release Date: 2016-05-15 │ │ Type "notebook()" for the browser-based notebook interface. │ │ Type "help()" for help. │ └────────────────────────────────────────────────────────────────────┘ sage: notebook(interface="",secure=True) The notebook files are stored in: sage_notebook.sagenb Please choose a new password for the Sage Notebook 'admin' user. Do _not_ choose a stupid password, since anybody who could guess your password and connect to your machine could access or delete your files. NOTE: Only the hash of the password you type is stored by Sage. You can change your password by typing notebook(reset=True). Enter new password:
と sage の admin のパスワードの設定を求められるので,設定すると,
で,やっと Web フロントエンドが使えるようになりました.
自動起動の設定
このままだと,サーバーを再起動するたびに ssh でログインして sage ⇒ notebook(***) と Web フロントエンドを立ち上げないといけませんが,面倒なので,フロントエンドが自動起動するように設定します.
まず,一般ユーザー権限でも https の標準的な port 番号である 443 が使えるよう python を設定します.
$ sudo setcap CAP_NET_BIND_SERVICE+ep /usr/lib/sagemath/local/bin/python2.7 $ sudo getcap /usr/lib/sagemath/local/bin/python2.7 /usr/lib/sagemath/local/bin/twistd = cap_net_bind_service+ep
で,Web フロントエンド起動と停止用のスクリプトを用意し,起動と終了のテストを行います.
$ sudo vi /usr/local/bin/startsagenb #!/bin/bash # configuration SAGE_HOME="/usr/lib/sagemath" SAGE_LOG="/usr/local/var/log/sagenb.log" # commands $SAGE_HOME/sage -c "notebook(automatic_login=false, port=443, secure=True, interface='')" >> $SAGE_LOG 2>&1 & $ sudo vi /usr/local/bin/stopsagenb #!/bin/sh CMD_KILL="/bin/kill" SAGESV_PID=`/bin/cat /home/sage/.sage/sage_notebook.sagenb/sagenb.pid` $CMD_KILL $SAGESV_PID $ sudo mkdir /usr/local/var/log $ sudo touch /usr/local/var/log/sagenb.log $ sudo chown sage.sage /usr/local/var/log/sagenb.log $ startsagenb $ cat /usr/local/var/log/sagenb.log /usr/lib/sagemath/local/lib/python2.7/site-packages/Crypto/Util/number.py:57: PowmInsecureWarning: Not using mpz_powm_sec. You should rebuild using libgmp >= 5 to avoid timing attack vulnerability. _warn("Not using mpz_powm_sec. You should rebuild using libgmp >= 5 to avoid timing attack vulnerability.", PowmInsecureWarning) 2016-06-15 00:55:29+0900 [-] Log opened. 2016-06-15 00:55:29+0900 [-] twistd 15.5.0 (/usr/lib/sagemath/local/bin/python 2.7.10) starting up. 2016-06-15 00:55:29+0900 [-] reactor class: twisted.internet.epollreactor.EPollReactor. 2016-06-15 00:55:29+0900 [-] QuietSite (TLS) starting on 443 2016-06-15 00:55:29+0900 [-] Starting factory <__builtin__.QuietSite instance at 0x7efde596dfc8> sage@sage:/usr/local/var/log$ cat /usr/local/var/log/sagenb.log /usr/lib/sagemath/local/lib/python2.7/site-packages/Crypto/Util/number.py:57: PowmInsecureWarning: Not using mpz_powm_sec. You should rebuild using libgmp >= 5 to avoid timing attack vulnerability. _warn("Not using mpz_powm_sec. You should rebuild using libgmp >= 5 to avoid timing attack vulnerability.", PowmInsecureWarning) 2016-06-15 00:55:29+0900 [-] Log opened. 2016-06-15 00:55:29+0900 [-] twistd 15.5.0 (/usr/lib/sagemath/local/bin/python 2.7.10) starting up. 2016-06-15 00:55:29+0900 [-] reactor class: twisted.internet.epollreactor.EPollReactor. 2016-06-15 00:55:29+0900 [-] QuietSite (TLS) starting on 443 2016-06-15 00:55:29+0900 [-] Starting factory <__builtin__.QuietSite instance at 0x7efde596dfc8> $ stopsagenb
なんか libgmp >= 5 にして,再コンパイルしろと出ますが,そんな元気は無いし,ローカルでしか使わないので無視です.最後にサービスとして起動するよう設定し,実際に起動してみます.
$ sudo vi /etc/systemd/system/sagenb.service [Unit] Description=SageMathNB Server After=network.target [Service] Type=oneshot RemainAfterExit=yes ExecStart=/bin/su - sage /usr/local/bin/startsagenb ExecStop=/bin/su - sage /usr/local/bin/stopsagenb [Install] WantedBy=multi-user.target $ sudo systemctl enable sagenb.service Created symlink from /etc/systemd/system/multi-user.target.wants/sagenb.service to /etc/systemd/system/sage.service. sage@sage:~$ sudo systemctl start sagenb.service sage@sage:~$ sudo systemctl status sagenb.service ● sage.service - SageMathNB Server Loaded: loaded (/etc/systemd/system/sagenb.service; enabled; vendor preset: enabled) Active: active (exited) since 水 2016-06-15 01:00:32 JST; 11s ago Process: 3079 ExecStart=/bin/su - sage /usr/local/bin/startsagenb (code=exited, status=0/SUCCESS) Main PID: 3079 (code=exited, status=0/SUCCESS) 6月 15 01:00:32 sage systemd[1]: Starting SageMath Server... 6月 15 01:00:32 sage su[3079]: Successful su for sage by root 6月 15 01:00:32 sage su[3079]: + ??? root:sage 6月 15 01:00:32 sage su[3079]: pam_unix(su:session): session opened for user sage by (uid=0) 6月 15 01:00:32 sage systemd[1]: Started SageMath Server.
この辺はなんかもう少しやりようがあると思うのですが,まあ動いているので良しとします.なお,旧 /etc/init.d/sagenb だと以下の通りの設定でした.
#!/bin/bash # configuration SAGESV_PATH="/usr/local/bin" # commands CMD_ECHO="/bin/echo" CMD_GREP="/bin/grep" CMD_SLEEP="/bin/sleep" CMD_KILL="/bin/kill" sage_start() { $CMD_ECHO "Starting Sage..." /bin/su - sage $SAGESV_PATH/runsage } sage_stop() { $CMD_ECHO "Stopping Sage..." SAGESV_PID=`/bin/cat /root/.sage/sage_notebook.sagenb/sagenb.pid` $CMD_KILL $SAGESV_PID } case $1 in start) sage_start ;; stop) sage_stop ;; restart) sage_stop $CMD_SLEEP 5 sage_start ;; *) $CMD_ECHO "Use: $0 {start|stop|restart}" exit 1 ;; esac exit 0
証明書の作成とインストール
Web フロントエンドの起動を行う前に notebook.setup() とすると certtool を用いて Web フロントエンドの SSL 化が行われます.しかし所謂オレオレ証明ですので,ブラウザが警告を出してきます.面倒なので,警告が出ないよう証明書をインストールし直します.と言っても,ローカル環境にあるものなので,やはりローカルの証明局で証明書の発行を行い,これを Web フロントエンドの証明書として組み込むわけです.
手順としては,まず,openssl で秘密鍵(private.pem)を発行します.
$ openssl genrsa 2048 > private.pem Generating RSA private key, 2048 bit long modulus ...............................................................+++ .+++ e is 65537 (0x10001)
次に証明書書名要求(sagenb.csr)を作成します.
$ openssl req -new -key private.pem > sagenb.csr You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:JP State or Province Name (full name) [Some-State]:***** Locality Name (eg, city) []:**** ***** ***** ****** Organization Name (eg, company) [Internet Widgits Pty Ltd]:***** Organizational Unit Name (eg, section) []:labohyt Common Name (e.g. server FQDN or YOUR name) []:sage.*****.local Email Address []:[email protected] Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:
私の場合は Windows Server に立てている証明局で証明書を発行(署名)しました.その証明書をnotebook.setup() により作成された証明書と入れ替えます.
$ mv private.pem ~/.sage/notebook/. $ mv certnew.cer ~/.sage/notebook/public.pem $ chmod 600 ~/.sage/notebook/private.pem $ chmod 600 ~/.sage/notebook/public.pem
最後に再起動して終了です.
$ sudo systemctl stop sagenb.service $ sudo systemctl start sagenb.service
その他
SageMath がインストールする共有ライブラリへのパスが通っておらず,一部パッケージが起動できないことが分かったので,以下の通り対処しました.
$ ln -s /usr/lib/sagemath/local/lib/libpari-gmp-2.8.so.0 /usr/local/lib/. $ sudo ldconfig
最初は /usr/lib/sagemath/local/lib をライブラリのパスに入れて対処しようとしたのですがこれだと今度は他のプログラムのライブラリと conflict してしまってもっと困ったことになってしまいました.
う~ん…大変だなぁ…こんなことなら素直に SageMathCloud をお金を払って使った方が良かったかも知れない.