Ubuntu 18.04 (Stretch) on WSL

はじめに

過去記事にて、古いシステムを運用するために、古いライブラリ(例えば、OpenSSL 1.0系)が必要で Ubuntu 18.04 ではなく、Ubuntu 16.04 を泣く泣く使用するなどの話を書きました。

やはりapt upgrade でエラーが出るなどして失敗することがありましたので、とりあえず、WSLとしては最新の Ubuntuを入れておいて、古いライブラリが必要なシステム開発環境の構築については、Dockerを使えばいいやということで、今回は Ubuntu 18.04 をセットアップしてみます。

Dockerについては、Hyper-V を有効にして、Docker for Windowsを使い、Dockerクライアントは、WSL上のUbuntuから利用するという手で行きたいと思いますが、これについてはまた後程。。。

今回の流れとしては以下のとおりです。
私の仕事で必要なものを入れていきます。

さて、一つ一つやっていきますよ(・∀・)b

Ubuntu on WSL のインストール

a) 既にUbuntu 16.04 を動かしていた場合

Ubuntuをアンインストールします。

スタートメニューからUbuntuのショートカットアイコンを右クリック→「アンインストール

b) WSLの実装自体が初めての場合

コントロールパネル」→「プログラム」→「Windowsの機能の有効化と無効化」より「Windows Subsystem for Linux」にチェックを入れ、「OK」をクリックします。

WSL_enable

色々と設定が行われて、PCを再起動するよう要求してきますので、Windowsの再起動を行います。


Ubuntuのインストール

次に、Ubuntuのインストールを行います。他アプリと同様 Microsoft Store からできるのが良いですね。

Microsoft Store」から「Ubuntu」(2019年02月現在は Version 18.04)を選択。

インストール後、スタートメニューから、Ubuntuのアイコンクリックで起動します。すると、シェルが動いて、管理者のユーザ名とパスワードの入力要求してきます。

Enter new UNIX username: foo
Enter new UNIX password:

一応、インストールされたUbuntuのバージョンを確認してみます。

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.1 LTS
Release:        18.04
Codename:       bionic

ここで、OSのアップデートを試みます。

$ sudo apt update
$ sudo apt upgrade

開発環境等、必要なアプリのインストールを行います。

$ sudo apt install build-essential
$ sudo apt install libssl-dev libreadline-dev libsqlite3-dev zlib1g-dev

日本語化

続いて、日本語ローカライズ化です。現在は、このように英語環境になっており、タイムゾーンもJSTではなくDSTになっています。

$ date
Sun Sep 2 16:02:09 DST 2018

まず、タイムゾーンを Asia/Tokyo にします。

$ sudo dpkg-reconfigure tzdata

[Geographic area:]→[Asia]→[Tokyo]

再度dateコマンドで確認。一応、JST の表示になりました。

$ date
Sun Sep 2 16:04:32 JST 2018

次にロケールの変更です。現在のロケールは、en_US.UTF-8

その前に、日本語パックと、日本語manのインストール。

$ sudo apt install language-pack-ja manpages-ja
$ sudo update-locale LANG=ja_JP.UTF-8

シェルを再起動し、環境変数 LANGを確認してみます。

$ echo $LANG
ja_JP.UTF-8
$ date
2018年  9月  2日 日曜日 16:12:47 JST

日本語環境になりました。


Windowsファイルシステムへのアクセス

次に、WindowsとWSL間とのファイルアクセスについて、まず、WSL側からWindowsの主要フォルダ(デスクトップ、ダウンロード、Dropbox)にアクセスしやすくするよう、ホームディレクトリにシンボリックリンクを作成します。

$ ln -s /mnt/c/Users/hoge/Favorites/Desktop ~/Desktop
$ ln -s /mnt/c/Users/hoge/Downloads ~/Downloads
$ ln -s /mnt/c/Users/hoge/Dropbox ~/Dropbox

あと、C:\Users\fooに、Windows用ツールを入れるためのディレクトリ「Applications」と作業用ディレクトリ「Workspace」を作成しておいて、それにもシンボリックリンクをはります。

explorer
$ ln -s /mnt/c/Users/foo/Applications ~/Applications
$ ln -s /mnt/c/Users/foo/Workspace ~/Workspace

Windows側で作成したファイルのパーミッションが777ということで、面倒なのでumask等を設定します。

現在のWindowsファイルシステムのマウント状況は次の通り。

$ mount -l
:
C: on /mnt/c type drvfs (rw,noatime,uid=1000,gid=1000,case=off)

ここで、次のように/etc/wsl.conf を作成します。

[automount]
enable = true
root = /mnt/
options = "metadata,uid=1000,gid=1000,umask=22,fmask=11"

ここで、WSLを再起動させます。再度マウント状況を確認

$ mount -l
:
C: on /mnt/c type drvfs  (rw,noatime,uid=1000,gid=1000,umask=22,fmask=11,metadata,case=off)

metadataumaskが有効になりました。

あと、デフォルトで umask が 0000  になっているので、ディレクトリ等を作成するとパーミッションが 777 になってしまいます。なので、「.profile」内に、

umask 022

を記載しておきます。恐らくコメントアウトされていると思いますので、コメント「#」を外します。シェルを再起動し、Workspaceディレクトリ内等でディレクトリを作成してみましょう。


ターミナルソフト wsl-terminal のインストール

ターミナルソフトも標準のものから、「wsl-terminal」に変更します。実体はminttyですが、インストールして起動すればそのままbashが起動します。WSL標準のものよりもこちらの方が使いやすいと思います。

(参考)GitHub – goreliu/wsl-terminal: Terminal emulator for Windows Subsystem for Linux (WSL)
https://github.com/goreliu/wsl-terminal

ZIPファイルをダウンロードし、Applications フォルダ内に展開します。

フォルダ「wsl-terminal」の中にあるプログラム「open-wsl.exe」のショートカットを作成します。ショートカットのプロパティのリンク先パスの後に「-l」(小文字のL)を追記します。

C:\Users\foo\Applications\wsl-terminal\open-wsl.exe -l

そうすると、起動させたときにカレントディレクトリが、WSL上の自分のホームディレクトリ /home/fooになります。

wsl-terminal にて使用するフォントですが、MSゴシック、Consolasなどのフォントでも良いのですが、日本語の文字間が空いてしまうのがものすごく気になるので、私はVLゴシックを選びます。

(参考)VL Gothic Font Family
http://vlgothic.dicey.org/

ここから「VLGothic-20141206.zip」をダウンロードし、ZIPを解凍すると、

  • VL-Gothic-Regular.ttf
  • VL-PGothic-Regular.ttf

の2つのファイルがありますので、それらのアイコンを右クリックして「インストール」を選べば、Windowsのフォントとしてインストールされます。あとは、wsl-terminalの[Option]の[Text]にてフォントを設定します。

続いて、コンソールにて、lsしたとき、otherがwriteableなディレクトリの配色(背景緑色)がどぎついのを改良します。

ls_colors

(参考)「WSL bash ディレクトリのフォントカラーを青から変更 – グロブ」
http://typea.info/blg/glob/2016/10/wsl-bash.html

現在の環境数LS_COLORSの中で、owの設定項目がどうなっているか抜き出してみます。

$ echo $LS_COLORS | tr ':' '\n' | grep ow
ow=34;42

これが、「ow=01;34」になるよう、環境変数LS_COLORSの値(文字列)に後付けします。

export LS_COLORS="$LS_COLORS:ow=01;34"

を、「.profile」に記載します。


Ruby環境の構築

以下、必要なパッケージのインストールと設定です。

まずは、Gitの設定を行っておきます。

$ git config --global user.name "User Name"
$ git config --global user.email foo@example.com
$ git config --global color.ui auto

確認です。

$ git config --list

続いて、rbenvとRubyのインストールを行います。

rbenvgit clone でゲットします。

$ git clone https://github.com/rbenv/rbenv.git ~/.rbenv

PATHなど必要な設定を行います。次の2行を「.profile」の最後に記載します。

export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"

有効にするために、シェルを再起動します。

そして引き続き、ruby-build のインストールです。専用のディレクトリ「plugins」を作成して、git cloneでゲットします。

$ mkdir -p "$(rbenv root)"/plugins
$ git clone https://github.com/rbenv/ruby-build.git "$(rbenv  root)"/plugins/ruby-build

さて、Rubyのインストールです。Rubyは最新の安定版は、2.6.1 をビルドしインストールします。

$ rbenv install -v 2.6.1

(結構時間がかかりました)

インストールが完了しても、まだ設定していないので、ruby は利用できません。

$ ruby -v
rbenv: ruby: command not found

ローカルではなくグローバル(全ディレクトリ配下)でこのバージョン(2.6.1)を利用できるように設定します。

$ rbenv global 2.6.1

さて、今度はどうでしょう。

$ ruby -v
ruby 2.6.1p33 (2019-01-30 revision 66950) [x86_64-linux]

無事に動きました。さて、このRubyのパスはどこでしょう。

$ which ruby
/home/foo/.rbenv/shims/ruby

↑ここにあるからね。

次に、Bundler gem をインストールしておきます。

$ gem install bundler
$ rbenv rehash

TeXのインストール

TeXはやっぱり必要なので入れておきます。なるだけ最小限に。。。

サイトからwgetしてきます。

$ wget ftp://ftp.jaist.ac.jp/pub/CTAN/systems/texlive/tlnet/install-tl-unx.tar.gz

適当なtarballを場所で解凍します。

$ tar xvzf install-tl-unx.tar.gz

それではインストールです。

$ cd install-tl-2018MMDD(展開した日付が入る)
$ sudo ./install-tl -repository  ftp://ftp.jaist.ac.jp/pub/CTAN/systems/texlive/tlnet/ -scheme scheme-small

画面がこんな感じで表示されます。

Loading ftp://ftp.jaist.ac.jp/pub/CTAN/systems/texlive/tlnet/tlpkg/texlive.tlpdb
:
Distribution: net  (downloading)
Using URL: ftp://ftp.jaist.ac.jp/pub/CTAN/systems/texlive/tlnet
:
Detected platform: GNU/Linux on x86_64
Using URL: ftp://ftp.jaist.ac.jp/pub/CTAN/systems/texlive/tlnet
:
Detected platform: GNU/Linux on x86_64
<B> set binary platforms: 1 out of 17
<S> set installation scheme: scheme-small
:
Actions:
<I> start installation to hard disk save installation profile to 'texlive.profile' and exit
 help
<Q> quit
Enter command:

インストールを開始するので、「I」を入力してEnterを押します。

Enter command: I

インストールが始まります。

Installing to: /usr/local/texlive/2018
Installing [001/283, time/total: ??:??/??:??]: ae [83k]
:

(結構時間がかかります)

TeX関係プログラム(platex、dvipdfmxなど)へのパスを有効にするために、次の行を「.profile」に記載しておきます。

export PATH="/usr/local/texlive/2018/bin/x86_64-linux:$PATH"

また、TeXLiveの管理コマンド「tlmgr」はsudoで動かす必要がありますので、sudo しても現在のユーザのパスが引き継げるように、/etc/sudoers ファイルを修正します。sudoers ファイルは、「visudo」コマンドで行います。

$ sudo visudo

nanoエディタが起動しますので、次のように修正します。

:
# Defaults      env_reset
Defaults        mail_badpass
# Defaults       secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
Defaults        env_keep += "PATH"
:

一応、ターミナルを再起動させておきます。

tlmgrコマンドで、updateの実行と日本語関係パッケージをインストールします。

$ sudo tlmgr update --self --all
$ sudo tlmgr install collection-langjapanese

確認です。

$ kanji-config-updmap-sys status
CURRENT family for ja: ipaex
Standby family : ipa

あとは必要なライブラリを適当にインストールします。

$ sudo tlmgr install here moreverb

それではテストしてみます。次のようなTeXファイル「sample.tex」をWorkspaceディレクトリ内に作成しておきます。

\documentclass{jsarticle}
\begin{document}
Hello World! こんにちは!
\LaTeX

\begin{equation}
    y = \sum_{i=0}^\infty x_i
\end{equation}
\end{document}

ではTeXファイルのコンパイルと、PDF化です。

$ platex sample.tex
$ dvipdfmx sample.dvi

Rのインストール

授業でも使用していますし、ちょっとした計算や統計処理を行うには欠かせないので、Rもインストールします。

(参考)「UBUNTU PACKAGES FOR R」
https://cran.r-project.org/bin/linux/ubuntu/README.html

最新のR及びパッケージを入手するために、CRANのリポジトリを追加します。

/etc/apt/sources.list.d/ に「r.list」を追加します。

$ sudo vi /etc/apt/sources.list.d/r.list

r.listの内容は次の通り(一行だけです)

deb https://cloud.r-project.org/bin/linux/ubuntu cosmic-cran35/

有効にするために、apt updateです。

$ sudo apt update
:
W: GPG エラー: https://cloud.r-project.org/bin/linux/ubuntu
cosmic-cran35/ InRelease: 公開鍵を利用できないため、以下の署名は検証できませんでした:
NO_PUBKEY 51716619E084DAB9
:

なにやらエラーが出てきました。GPGエラーです。Secure APTを利用するために、公開鍵をaptに登録します。

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys  E298A3A825C0D65DFD57CBB651716619E084DAB9

すると次のように鍵がインポートされます。

gpg: 鍵51716619E084DAB9: 公開鍵"Michael Rutter  "をインポートしました
gpg: 処理数の合計: 1
gpg:               インポート: 1

すると、「Windowsセキュリティの重要な警告」のダイアログがでて、Windows Defender ファイアウォールにて「dirmngr」を許可するか否か聞いてきます。

「キャンセル」しておきます。

現在でも後でも、このプログラム「dirmngr」の状態がどうかは、「コントロールパネル」→「システムとセキュリティ」→「Windowsファイアウォールによるアプリケーションの許可」で許可か否かが確認できます。

再度、apt update を実施します。

$ sudo apt update

パッケージリストをすべて無事読み込むことができました。それでは、r-base をインストールしてみます。

$ sudo apt install r-base
:
インストールすることができないパッケージがありました。おそらく、あり得ない状況を要求したか、
(不安定版ディストリビューションを使用しているのであれば) 必要なパッケージがまだ作成されていなかったり
Incoming から移動されていないことが考えられます。
以下の情報がこの問題を解決するために役立つかもしれません:
以下のパッケージには満たせない依存関係があります:
r-base : 依存: r-recommended (= 3.5.2-1cosmic) しかし、インストールされようとしていません
E: 問題を解決することができません。壊れた変更禁止パッケージがあります。

また怒られました。チーン(;´・ω・)

他にパッケージがないかapt searchしてみます。

$ apt search r-base
:
r-base/cosmic-cran35 3.5.2-1cosmic all
  GNU R 統計計算・グラフィックスシステム
r-base-core/cosmic-cran35 3.5.2-1cosmic amd64
  統計およびグラフィックシステム GNU R の中核パッケージ
:

どう違うのかよくわかりませんが、r-base-core の方を入れてみます。

$ sudo apt install r-base-core

今度はうまくいきました。

r-base-devpython3-distutilsx11-commonx11-xserver-utilsなど、新規に153個(402MB)ものパッケージがインストールされました。

$ R
R version 3.5.2 (2018-12-20) -- "Eggshell Igloo"
Copyright (C) 2018 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu (64-bit)
R は、自由なソフトウェアであり、「完全に無保証」です。
:
'q()' と入力すれば R を終了します。

>

それでは適当にコマンドを叩いてみます。

> x <-c(1, 3, 7, 13)
> plot(x, type='o')

Xサーバソフトを導入していないので、plot画面を確認することはできません。

ということで、フリーのXサーバソフトである「VcXsrv」をインストールします。

「VcXsrv Windows X Server download | SourceForge.net」
https://sourceforge.net/projects/vcxsrv/

インストール後、VcXsrvのショートカット「XLaunch」が表示されるので、ダブルクリックして起動します。

設定画面が開きますので、デフォルトのまま「次へ」を押していきます。

完了すると、「Windowsセキュリティの重要な警告」ダイアログが表示されます。(名前: VcXsrv windows xserver)

これも、アクセスを許可せずに「キャンセル」しておきます。
また、「.profile」に環境変数DISPLAYの値を設定するように次の行を追記しておきます。

export DISPLAY=localhost:0.0

再度、Rのコマンドを実行してみます。

> x <-c(1, 3, 7, 13)
> plot(x, type='o')

Rplot

うまくプロットできました。

最後に、q() でRを終了させておきます。

> q()

Emacsのインストール

emacsもGUI(Xアプリ)として動かしても良いのですが、日本語入力とかフォントの設定とか面倒なので、Xを使わないパッケージ(nox)で。。。

$ sudo apt install emacs-nox
$ sudo apt install elpa-projectile

パッケージツールを使用するため最低限の設定を「 .emacs.d/init.el 」に記載します。

$ vi ~/.emacs.d/init.el
;; Package
(package-initialize)
(setq package-archives
         '(("melpa" . "https://melpa.org/packages/")
           ("melpa-stable" . "https://stable.melpa.org/packages/")))

次に、TeXでの作業をしやすくするために、YaTeXをセットアップします。

M-x package-install」と入力し、パッケージ「yatex」を指定します。

Install package: yatex

YaTeXのための設定を「 .emacs.d/init.el 」に追記します。

;; YaTeX
(setq auto-mode-alist
  (cons (cons "\\.tex$" 'yatex-mode) auto-mode-alist))
(autoload 'yatex-mode "yatex" "Yet Another LaTeX mode" t)
; latexコマンドの指定
(setq tex-command  "/usr/local/texlive/2018/bin/x86_64-linux/platex -kanji=utf8")
(setq bibtex-command  "/usr/local/texlive/2018/bin/x86_64-linux/pbibtex")
; dvipdfコマンドの指定(フォント埋め込みなしを指定)
(setq YaTeX-dvipdf-command  "/usr/local/texlive/2018/bin/x86_64-linux/dvipdfmx -f  ptex-noEmbed.map -f otf-noEmbed.map")
; PDFのプレビューコマンドの指定
(setq tex-pdfview-command "/mnt/c/Users/foo/Applications/Sumatra_PDF/SumatraPDF.exe -reuse-instance")
(defvar YaTeX-dvi2-command-ext-alist
  '(("xdvi" . ".dvi")
    ("ghostview\\|gv" . ".ps")
    ("acroread\\|pdf\\|Preview\\|open" . ".pdf")))
(setq YaTeX-use-font-lock t)</div>
; UTF-8
(setq YaTeX-kanji-code 4)
; 自動改行を無効
(add-hook 'yatex-mode-hook' (lambda () (setq auto-fill-function  nil)))
(put 'upcase-region 'disabled nil)

PDFファイルのビューアは、Sumatra PDF を使用するように指定しています。

「Free PDF Reader – Sumatra PDF」
https://www.sumatrapdfreader.org/free-pdf-reader.html

1ファイルの軽いPDFビューアですし、dvipdfmxでPDFを更新した際もビューアを再起動することなく更新結果が見られるのでGoodです。

Sumatra PDFは、wsl-terminalと同じ場所 \Users\foo\Applications の中にフォルダ「Sumatra_PDF」を用意して、そこにEXEファイルを置きます。

そこで一回EXEファイル(SumatraPDF.exe)を実行すると、「SumatraPDF-settings.txt」という設定ファイルができます。

それでは、WSL上から起動できるかどうかあらかじめ確認しておきます。

$ /mnt/c/Users/foo/Applications/Sumatra_PDF/SumatraPDF.exe

先ほど、TeXのインストールの際に、動作確認のため作成したTeXのソースファイルを開いてみます。

$ emacs sample.tex

で開くと、「やてふ」モードになります。

  • C-c t j
    • platexコマンドの実行 sample.tex → sample.dvi
  • C-c t d
    • platexコマンドの後でdvipdfmxコマンドの実行、即ちPDFファイルの生成になります
  • C-c t p
    • Foxit Readerが起動し、PDFファイルの内容を表示します。

次に、YAMLモードのセットアップをします。

M-x package-install」にて、パッケージ「yaml-mode」を指定します。

Install package: yaml-mode

YAMLモードのための設定を「 .emacs.d/init.el 」に追記します。

;; yaml mode
(require 'yaml-mode)
(add-to-list 'auto-mode-alist '("\\.ya?ml$" . yaml-mode))

最後に、Rでの開発をしやすくするESSのセットアップを行います。

M-x package-install」にて、パッケージ「ess」を指定します。

Install package: ess

ESSのための設定を「 .emacs.d/init.el 」に追記します。

;; ESS
(require 'ess-site)
(add-to-list 'auto-mode-alist '("\\.[rR]$" . R-mode))

では早速適当なRのソースを作成して確認してみましょう。

$ emacs test.R
x <- seq(0, 2*pi, by=0.5)
y <- sin(x)
y
plot(x, y, type='o')

ソースを作成後、「C-c C-c」と操作します。

すると、「R starting project directory? ~/」 と聞いてきますので、適当なディレクトリを指定して「Enter」キーすると、Rスクリプトを実行するシェルが別バッファとして開きます。

ess

plotすればグラフも表示されます。後は、スクリプトを修正するたびに C-c C-c すればOKです。