torutkのブログ

ソフトウェア・エンジニアのブログ

WSLでCentOSが利用できたかも?(CentOS 7)

WSLで動くLinuxディストリビューション

現在、WSLの上で動くLinuxディストリビューション(WSLではLinuxカーネルは動かさないので実際にはユーザーランド)は、マイクロソフトストア上にUbuntuOpenSUSE 他いくつか用意されていますが、CentOSはありません。普段CentOSを使っている場合、別なディストリビューションを使うとコマンド体系等が異なるので不便を感じます。

そんな折、WSLへCentOS 7を入れるブログを見かけました。

vogel.at.webry.info

ということで、この方法を追ってみたいと思いました。

方法

WSL上で動かすCentOS 7のユーザーランドを作成・公開しているGitHubリポジトリが次です。

github.com

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

RedmineGitHubリポジトリから取得するために、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

RedmineGitHubレポジトリからクローンしてきます。

~$ 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ソフトウェアをインストールしました。

sourceforge.net

インストール後、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
~$ sudo fc-cache -fv
  :

日本語入力

ibus-kkcを動かそうと試みるが・・・

CentOS 7標準のIbusを入れてみる。

~$ 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が動いていないので動かすか聞いてきます。動かすを選択したがエラーで動きません。