Windows Subsystem for Linuxの環境を整える【準備編】

アスキー 2016年10月23日(日)10時00分配信

 Windows Subsystem for Linuxの具体的な話をする前に、Linux系での表記などについて簡単に解説しておく。Windows系では、特殊フォルダを含めて、階層化ディレクトリを「フォルダ」と表現するようになっているためこれに従うが、Linux系では「ディレクトリ」と呼ぶことが多いため、Linux側での表現は「ディレクトリ」する。

11
今回からはWindows Subsystem for Linuxの実際の動作環境を作っていく

 意味的には同じことになるが、WSL内とWindows側では同じ場所でもパスが違うため、用語を使い分ける。WSL側では、たとえば、ユーザー、shiodaのホームディレクトリは「/home/shioda」となるが、これはWindows側では「%Userprofile%\appdata\local\lxss\home」フォルダとなる。また、このユーザーディレクトリは、Linuxでは、「~」で表現できる。

 たとえば、ユーザーフォルダの下にある「abc.txt」というファイルへのパスは、「~/abc.txt」と表記できる。これは、Windowsでいう%Userprofile%環境変数やshellショートカットのshell:profile(これについては過去記事を参照)と同じようなものと考えていただいてかまわない。

 WSLには、Ubuntu Linuxのコードは使われているが、カーネル自体はエミュレーション、また、bash.exeが起動して環境が立ち上がることから、通常のLinuxとはユーザーモードの初期化などが違っている。

 一般的にLinuxでは、initと呼ばれるプログラムが、ユーザーモードの初期化を行ない、必要なデーモン(バックグラウンドで動作するプログラム)などを起動する。しかし、WSLでは、こうした仕組みは残っているものの、デーモン類は何も起動されず、bashのみが起動される。また、一般的にLinuxでパッケージ管理システムを使ってソフトウェアをインストールすると、必要な設定が同時に行なわれる。このため、Linux起動時のランレベル設定などについては、あまり触る必要はないかと思われるが、起動状態を修正するためには、起動システムについて知っておく必要がある。

 従来Unix System V系の流れを汲むUnix/Linuxシステムでは、「SysVinit」と呼ばれるシステムが起動時に動作していた。SysVinitは、実際には、initというコマンド名でユーザーモード最初の動作コマンドとして起動され、設定に従って、バックグラウンドで動作する「デーモン」類を起動していた。このとき、設定を複数用意しておき、これを切り替えて利用することができる。その設定を「ランレベル」(run level)と呼んでいた。

 ランレベルには、メンテンナンス時などに管理者だけがログインできる「シングルユーザーモード」などに対して割り当てられているものと、通常の起動だが、ログイン前からGUIを起動する、しないなどの設定の違いをランレベルで指定するなどが行われてきた。ただし、ランレベルを示す番号と意味の対応はLinuxでもディストリビューションにより違いがある。

 Ubuntuでは、SysVinitに代わり、Updatartがinitプロセスに対応するが、従来SysVinitで行ってきたランレベルによる設定管理と互換性を持たせるように設定されている。このため、起動時のランレベルごとの設定は、/etc/rc[0~6S].dディレクトリに記録されている。

 このあたりに深入りすると、かなり大変なので、とりあえず、WSLの起動時の挙動について調べるのであれば、「init」、「Upstart」、「initctl」(起動時設定の変更ツール)などについて調べてほしい(manコマンドが使える)。基本的には、WSLでは、通常のUbuntu Linuxのようにデーモン類を起動することはないが、仕組み自体はちゃんと残っている。

bashの初期設定状態

 WSLでは、こうした初期設定ののち、ユーザーのログイン手続きは省略され、/bin/bashが起動する。WSLでは、そもそもbashしか起動しないが、そのbashの初期設定は、原則ユーザーディレクトリにある「.bashrc」で行う。実際には、ログイン時には、以下のようなシーケンスでユーザーの環境が設定される。

1. ログイン直後(WSLではbash.exeを起動したとき)には、/etc/profileが実行される
 1.1 /etc/profile内では、以下の処理を行なう
 1.2 bashの場合、/etc/bash.bashrcが実行中のシェルに読み込まれて実行される
 1.3 /etc/profile.dディレクトリ以下の実行許可のある.shファイルがファイル名の順に実行される(※実行許可がない.shファイルは実行されない)
2. ~/.bash_profileを実行(個別ユーザーのbash用プロファイル)。なければ実行しない
3. ~/.bash_loginを実行(個別ユーザーのbash用ログインスクリプト)。なければ実行しない
4. ~/.profileを実行(個別ユーザーのbsh互換プロファイル)。bash以外でも実行
 4.1 ~/.profileは、~/.bashrcを実行(ユーザーのシェルがbashのときのみ)

 この状態がbash.exeを起動した直後の状態となる。ただし、WSL(Ubuntu Linux)では、「~/.bash_profile」と「~/.bash_login」は標準では存在しないため実行されない。/etc/側にあるファイルを修正すると、通常は他のユーザーにも影響が及ぶが、WSLでは、インストール時に設定したユーザーのほかには、rootしかシェルを対話的に起動するユーザーはない。

 そのためどうでもいいといえばいいのだが、何かの理由でユーザーを追加する可能性もあるだろうから、一般的な修正を行なっておくことをお勧めする。一般的には、自分のホームディレクトリ以下にあるファイルのみを修正して/bin/bashの初期状態を制御する。

 もう1つ、/etc/profileなど、ファイル名に「bash」という文字が含まれないスクリプトは、ログインシェルを/bin/bash以外に設定したときも有効だ。Linuxでは、ユーザーのログインシェルを変更することが可能であることに注意されたい。逆に「bash」が含まれるスクリプトは、意識的に設定しないかぎり、他のシェルに切り替えたときには無効になる。

 bashが起動したあと、その上で起動されるbashは現在の環境を引き継ぐ、また、初期状態として「/etc/bash.bashrc」、「~/.bashrc」を起動時に読み込む。このため、ログインシェルでとこれらの設定内容と関わる設定(たとえばコマンドのエイリアス設定)を手動で行っても、新たに起動されたbashでは、~/.bashrcを読み込んで実行しているため、設定が元に戻されることになる。

 ログアウトする場合、ログインシェルは、「~/.bash_logout」を実行する。個人環境に関して、なにかの後始末やデータを保存する必要があるなら、このスクリプトファイル内で実行する。

ドットソース実行に注意

 もう1つ、こうしたシェルスクリプトの実行は、「ドットソース」と呼ばれ、スクリプトファイルが実行中のbashに読み込まれて処理される。これは、bashからスクリプトファイルを単に指定して起動した場合とは違う。

 たとえばbashのプロンプトから「xxx.sh」ファイルを起動すると、新規に/bin/bashが起動して、これを実行する。このため、内部状態などの変更は、すべて新しく起動した/bin/bashプロセスに対して行われ、実行が終了すると消えてしまう。MS-DOSやWindowsのコマンドラインでもこの仕組みは同じで、初心者がつまづきやすいところだ。

 これに対して「ドットソース」実行は、現在の/bin/bashプロセスに対して指定されたスクリプトファイルを読み込み実行する。このため、変数やエイリアスといった設定をbashが保持したままになる。「ドットソース」実行は、「.」コマンドで行う。ドットだけだと意味が分からなくなってしまうので、ドット(ピリオド)がソースファイルを読んで実行するため「ドットソース」表記する。

WSLの再インストール

 /etc以下にある設定をむやみに変更すると、最悪、WSLが起動しなくなることがある。このため、まずは、WSLへのUbuntu Linuxのアンインストールと再インストール方法を解説しておく。WSL自体は、設定変更で壊れてしまうことはないが、Ubuntu Linux自体は、設定を間違えると、起動できなくなってしまう。特にWSLでは、いくつかの機能がうまく動いておらず、Linuxでは問題のない設定でもbash.exeが起動しなくなる可能性がある。

11
/etc以下にはさまざまな設定情報が含まれている

 たとえば、コンソール系の制御は、Linuxとしてみると完全ではないため、画面を分割する類いのscreenやtmuxといったソフトウェアがうまく動作しない。このため、こうしたアプリをログイン時にシェルとして起動してしまうような設定をすると、簡単にbash.exeが起動しなくなる。Ubuntu Linuxでは、byobuと呼ばれるscreenやtmuxのフロントエンドプログラムがあり、これをログイン時に起動する仕組みがあり、有効にしただけで次回からbash.exeが起動できなくなってしまう。

 どこで起動しているのかわかっているなら%userprofile%\local\lxss\rootfs以下をWindows側で修正することで復旧できるが、わからない場合には、再インストールするしかない。

 幸いなことにWSLへのUbuntu Linuxのアンインストールでは、ユーザーフォルダ(Linux側の/home以下と/root)を維持することができ、再インストール時に再度これを使うことができる。パスワードは再設定(前のものと同じにする必要はないし、同じでもかまわない)が必要だが、ユーザー名はそのまま残る。

 なので、重要なファイルはなるべく、自分のホームディレクトリ(WSL側の/home以下)に置くようにしよう。Linuxに慣れるまでの間は、ファイルを/tmpなどにおいて、あとからコピーしようなどとは考えないほうがいい。

 さて、アンインストールは、

lxrun /uninstall

で行なう。このとき、/fullオプションを付けると、ユーザーディレクトリも完全に消去するが、付けなければ、フォルダはそのまま残る。再インストールするには、

lxrun /install

とする。このとき、パスワードを聞いてくるが、ユーザー名に関しては、残っている/homeディレクトリから自動的に設定される(前回までLinux側で使っていたユーザー名)。これで、WSLの設定を間違えて起動しなくなったといった問題を解消できる。

 回復の方法や具体的な起動の仕組みがわかったので、次回は、bashの初期設定を見ていくことにしよう。

アスキー
もっと見る もっと見る

【あわせて読む】

    最終更新: 2016年10月23日(日)10時00分

    【関連ニュース】

    【コメント】

    • ※コメントは個人の見解であり、記事提供社と関係はありません。

    【あなたにおススメ】