WSLで動くLinuxディストリビューション
現在、WSLの上で動くLinuxディストリビューション(WSLではLinuxカーネルは動かさないので実際にはユーザーランド)は、マイクロソフトストア上にUbuntu、OpenSUSE 他いくつか用意されていますが、CentOSはありません。普段CentOSを使っている場合、別なディストリビューションを使うとコマンド体系等が異なるので不便を感じます。
そんな折、WSLへCentOS 7を入れるブログを見かけました。
ということで、この方法を追ってみたいと思いました。
方法
WSL上で動かすCentOS 7のユーザーランドを作成・公開しているGitHubリポジトリが次です。
GitHubのリリースには、バイナリのzipアーカイブ(CentOS.zip)とソースアーカイブが公開されています。 本日時点では、7.0.1907.1 が最新リリースです。これは、CentOS 7.6.1907 に基づくWSL用ユーザーランドです。
CentOS.zipを解凍し、その中にあるCentOS.exeを管理者権限で実行します(展開したフォルダ上で実行)。 なお、ノートPCのmicroSD上(exFAT)で実行するとエラーとなりました。参考まで。
CentOS7.exeを実行すると、コマンドプロンプトが開き、インストールが完了すると Press any key to continue... と表示されます。 何かキーをたたくとコマンドプロンプトが消えます。
Installing... Installation Complete! Press any key to continue...
インストール後、再度CentOS7.exeを実行すると、Bashシェルが開きます。
アンインストール(レジストリ登録の消去)は、CentOS.exe clean を実行します。
コマンドプロンプトからwslconfig /lを実行すると、CentOS7が登録されているのが分かります。
C:> wslconfig /l Windows Subsystem for Linux ディストリビューション: openSUSE-Leap-15 (既定) CentOS7
初期設定
Windows上のコマンド環境Cmderへの設定
タブ機能を持つコマンドプロンプトツール Cmder でCentOS7を開けるよう、CentOS7.exeへのパスを設定したTaskを新規作成します。
ユーザー作成
デフォルトはrootユーザーとなっているので、自分用のユーザーを作成します。管理権限をsudoで実行できるようにwheelグループに登録します。
# adduser <自分用のユーザー名> # gpasswd -a <自分用のユーザー名> wheel
sudoコマンドでパスワードなしに実行できるよう/etc/sudoersを修正します。
%wheel ALL=(ALL) NOPASSWD: ALL
先のCentOS7.exeを実行したときに、ここで作成したユーザーでbashが開くよう設定します。
C:\path\to\CentOS7> CentOS7 config --default-user <自分用のユーザー>
うまくいかないときは、CentOS7 config --default-user root でいったんrootユーザーに戻してbashを実行し再設定します。
SoftwareCollections.org リポジトリ設定
OS標準パッケージとは別に、RHELおよびCentOS向けに新しいバージョンのパッケージを提供するSoftware Collectionsを利用できるようにします。
$ sudo yum install centos-release-scl-rh
例えば、rubyの場合、CentOS 7標準のパッケージは ruby-2.0.0ですが、Software Collectionsで提供されるパッケージには、
- rh-ruby22
- rh-ruby23
- rh-ruby24
- rh-ruby25
- rh-ruby26
があります。
ruby 2.6のインストール
$ sudo yum install rh-ruby26
Software Collectionsでインストールしたパッケージは、/opt下にインストールされます。rh-ruby26の場合は次になります。
/opt/rh/rh-ruby26/ +-- enable +-- root/
enableファイルには、環境変数定義が記述されているので、これをbash起動時に読み込まれるよう設定します。
$ sudo ln -s /opt/rh/rh-ruby26/enable /etc/profile.d/rh-ruby26.sh
以降新たにbashを起動すると、ruby26が利用できるようになります。
~$ ruby -v ruby 2.6.2p47 (2019-03-13 revision 67232) [x86_64-linux]
パスを通すには、/opt/rh/rh-ruby26/enable へのシンボリックリンクを、/etc/profile.d/rh-ruby26.sh として作成します。
~$ sudo ln -s /opt/rh/rh-ruby26/enable /etc/profile.d/rh-ruby26.sh
~$ bash ~$ ruby -v ruby 2.6.2p47 (2019-03-13 revision 67232) [x86_64-linux]
Redmine プラグイン開発環境を作ってみる
Redmineのプラグイン開発環境を作ってみます。前に作成した環境は次です。
Redmineプラグイン開発環境 - ソフトウェアエンジニアリング - Torutk
git
RedmineをGitHubリポジトリから取得するために、gitをインストールします。 CentOS 7の標準パッケージのgitはバージョンが1.8.3と今や相当古いバージョンです。Software Collectionsでgit 2.9を取得します。
~$ sudo yum install rh-git29
環境設定を/etc/profile.d下に作成します。
~$ sudo ln -s /opt/rh/rh-git29/enable /etc/profile.d/rh-git29.sh
RedmineのGitHubレポジトリからクローンしてきます。
~$ mkdir redmine ~$ cd redmine redmine$ git clone https://github.com/redmine/redmine.git redmine_glossary_dev :
sqlite開発環境
~$ sudo yum install sqlite-devel
ruby bundler
~$ sudo yum install rh-ruby26-rubygem-bundler
Redmineが必要とするgemsのインストール
redmine_glossary_dev$ bundle install --path vendor/bundler
bundle installでエラーになった対処
~$ sudo yum groupinstall "Development Tools" : sudo yum install openssl-devel readline-devel zlib-devel curl-devel libyaml-devel
~$ sudo yum install rh-ruby26-ruby-devel
セッション秘密鍵の生成
redmine_glossary_dev$ bundle exec rails generate_secret_token
データベース初期化(スキーマ生成)
redmine_glossary_dev$ bundle exec rails db:migrate
Redmineの実行
redmine_glossary_dev$ bundle exec rails server
Redmineへのアクセス
同一マシン上で、Webブラウザから http://localhost:3000 にアクセスするとRedmineが表示されます。
環境変数NAMEを無効化
WSLで使用するCentOS 7のユーザー環境変数NAMEにはホスト名が定義されています。Redmineのプラグインをインストールするときに影響が出るので、未定義にしておきます。
- ~/.bashrc に次を追記
unset NAME
ファイルシステムをwslfsに更新
WSLでインストールした際のファイルシステムは、デフォルトではlxfsですが、これをWslFsに更新することができます。 更新すると何がいいのかは明確には語られていないようなので、更新して良くなると思ったら実施で・・・。
更新するには、コマンドプロンプトから以下を実行します。
C:\> wslconfig /upgrade CentOS7
更新されたかどうかは、ルートファイルシステムを表示して確認します。
~$ df -T Filesystem Type 1K-blocks Used Available Use% Mounted on rootfs wslfs 103472168 81965432 21506736 80% / none tmpfs 103472168 81965432 21506736 80% /dev :
X Window Systemの利用
コマンドライン環境であれば、これで一通り操作できるようになりました。しかし、GUIを伴う環境も使いたくなります。 そこで、Windows OS側にXサーバー機能を入れ、Linux(WSL)側でXクライアントプログラムを実行したらその画面をWindows側に表示できるようにします。
Windows OSへXサーバー機能(VcXsrv)をインストール
Windows用のXサーバー機能には、今回VcXsrvソフトウェアをインストールしました。
インストール後、XLaunchをダブルクリックし、Xサーバーを起動します。
HiDPI画面でXの画面がぼやける
VcXsrvのアイコンを右クリックしプロパティで互換性タブを選択、[高DPI設定の変更]を押し、[高いDPIスケールの動作を上書きします。]にチェックを付け、種類は[アプリケーション]を選択。VcXsrvを再起動します。
ただし、Xのアプリケーションが小さく表示されるので、アプリケーション個別にフォントを大きくするなどして使いやすくする必要があります。
Xクライアントプログラムのインストール
~$ sudo yum install xorg-x11-apps
X Window Systemのライブラリ等を含めてインストールされます。
リモートのXサーバーに表示する場合、環境変数DISPLAYを設定します。
~$ export DISPLAY=0:0
xeyesツールを実行します。
~$ xeyes
目玉が表示されればOKです。
RubyMine Linux版
RubyMineのLinux版をインストールしてみます。Windows上であらかじめダウンロードしたアーカイブファイルを読み込むことができます。
~$ cd /opt opt$ sudo tar xvzf /mnt/c/Users/torutk/Downloads/RubyMine-2019.2.4.tar.gz : opt$ cd RubyMine-2019.2.4/bin bin$ ./rubymine.sh OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release. Start Failed: Internal error. Please refer to http://jb.gg/ide/critical-startup-errors :(略) Caused by: java.lang.UnsatisfiedLinkError: /opt/RubyMine-2019.2.4/jbr/lib/libawt_xawt.so: libX tst.so.6: cannot open shared object file: No such file or directory
libXtst.so.6 を探す
~$ yum provides libXtst.so.6 Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile * base: ftp.iij.ad.jp * centos-sclo-rh: ftp.iij.ad.jp * extras: ftp.iij.ad.jp * updates: ftp.iij.ad.jp libXtst-1.2.3-1.el7.i686 : X.Org X11 libXtst runtime library Repo : base Matched from: Provides : libXtst.so.6
~$ sudo yum install libXtst
これで、RubyMingeが起動するようになりました。
Redmine をRubyMine上で実行する
- RubyMineでRedmineを展開したディレクトリを開きます。([File]メニュー > [Open]から)
- rubyコマンド(インタープリター)の場所を設定します。([File]メニュー > [Settings]から)
- 初回実行時は、Railsを指定します。
日本語環境設定
日本語フォント
IPAフォント
~$ sudo yum install ipa-*-fonts :
VLゴシックフォント
~$ sudo yum install vlgothic-*
WindowsのフォントをVcXsrvで使う
~$ sudo ln -s /mnt/c/Windows/Fonts /usr/share/fonts/windows ~$ sudo fc-cache -fv :
日本語入力
ibus-kkcを動かそうと試みるが・・・
~$ sudo yum install ibus-kkc :
79個のパッケージがインストールされます。 ibus-setup を実行すると、ibus-daemonが動いていないので動かすか聞いてきます。動かすを選択したがエラーで動きません。
$ ibus-setup Gtk-Message: 14:17:48.995: GtkDialog mapped without a transient parent. This is discouraged. (ibus-setup:2931): IBUS-WARNING **: 14:17:58.140: Unable to connect to ibus: Unexpected lack of content trying to read a line portal is not running: GDBus.Error:org.freedesktop.DBus.Error.Spawn.ChildExited: Process org.freedesktop.portal.IBus exited with status 1 Gtk-Message: 14:18:03.295: GtkDialog mapped without a transient parent. This is discouraged.
ibus-mozcを動かそうと試みる
~$ sudo yum install ibus-mozc dbus-x11 :
84パッケージがインストールされます。
.bash_profileに以下を追記
# Input Method export LANG=ja_JP.UTF-8 export DefaultIMModule=ibus export XMODIFIERS="@im=ibus" export GTK_IM_MODULE=ibus export QT_IM_MODULE=ibus export IBUS_ENABLE_SYNC_MODE=1 ibus-daemon -d -x
bashを再度開いて、
~$ ibus-setup
ibus-setup を実行すると、ibus-daemonが動いていないので動かすか聞いてきます。動かすを選択したがエラーで動きません。