SageMath 設定備忘録

Server
SageMath 初期画面

SageMath のインストールと設定の備忘録です.統計パッケージの R を Web フロントエンドで使うのが目的.SageMath 自体の概要を知りたい場合は,こことかここが分かり易い.

SageMath Mathematical Software System - Sage
SageMath is a free and open-source mathematical software system.

インストールから 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 のパスワードの設定を求められるので,設定すると,

https://sage.****.local:8080/
SageMath 初期画面

SageMath 初期画面

で,やっと 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 をお金を払って使った方が良かったかも知れない.

 

 

Server
スポンサーリンク
Following hyt!
タイトルとURLをコピーしました