---
title: "WindowsパソコンをLinux（Ubuntu）に変身させる"
description: "Windows 10搭載のパソコンをLinuxパワーハウスに変身させる方法をご紹介"
authors:
  - name: "Steve Hobbs"
    url: "https://auth0.com/blog/authors/steve-hobbs/"
date: "Mar 6, 2019"
category: "Developers,Deep Dive,WSL"
tags: ["windows", "linux", "wsl", "ruby", "node", "development", "ubuntu", "docker"]
url: "https://auth0.com/blog/jp-convert-windows-pc-to-linux-ubuntu-dev-environment/"
---

# WindowsパソコンをLinux（Ubuntu）に変身させる



 ここでちょっと、自分が離れ小島に置き去りにされてしまったと想像してみてください。ソフトウェア開発者のあなたは、キーボードを打てる年頃になってから今の今まで、LinuxシステムとApple Macしか使ったことがありませんでした。しかし、この離れ小島に持ってこれたのは、Windowsマシンだけ。あとは、一生分のティーとビスケットだけでした。幸いにも、この島にはインターネット接続はあります。さて、あなたならどうしますか？

 もちろん、[Ubuntuをダウンロード](https://www.ubuntu.com/#download)し、仮想マシン上にインストールすることもできますが、他のやり方もあります。実はそのやり方でも、Ubuntuのインストールは免れないのですが...

## <a class="toc-target" id="a-week-without-my-macbook"></a>MacBookのない一週間

 最近、私はこれとよく似た状況にありました。もちろん、離れ小島に置き去りにされたというのは言い過ぎで、[タッチバーの不可思議な問題](http://www.youtube.com/watch?v=bvU1FIJ0daU)を修理するため、MacBookをしばらくApple Storeに預けなければならなかったのです。

 開発用のマシンが手元にない間、仕事を続けるにはどうしたらいいんだろう、と考えました。私は、Unixのコマンドラインや[ZSH](http://www.zsh.org/)や[Oh-my-zsh!](https://ohmyz.sh/)といったツールなどを使うのは好きでした。会社の仕事では定期的に[Ruby](https://www.ruby-lang.org/en/)や[Node](https://nodejs.org/en/)を使わなくてはいけないこともあり、メインのターミナルエミュレータとしては[iTerm2](https://www.iterm2.com/)を使うのが好きでした。主に、[Visual Studio Code](https://code.visualstudio.com/)、[Docker](https://www.docker.com/products/docker-desktop)、[Slack](https://slack.com/)などのデスクトップツールも使っています。

 ひとつのオプションとしては、Dockerをインストールして[コンテナ化した開発環境をセットアップ](https://auth0.com/blog/use-docker-to-create-a-node-development-environment/)するという手もありますが、それでは簡単すぎる。

 これまで通りの開発ツールやワークフローを、MacBookなしで続けられるだろうか？私はそれを目指してみることにしました。

 <include src="TweetQuote" quoteText="Windows Subsystem for Linuxをインストールし、Windows 10を完全なLinuxパワーハウスに変身させる方法を紹介"/>

## <a class="toc-target" id="cross-platform-applications"></a>クロスプラットフォームアプリケーション

 もちろん、上に挙げた多くのアプリケーションはクロスプラットフォーム版があり、HTML、CSS、JavaScriptのアプリケーションを[Electron](https://electronjs.org/)を使ってラップアップしているものも多くあります。私が毎日使っているVisual Studio CodeやSlackの2つのアプリケーションも含みます。

 たまに、どっぷりと[Intellij](https://www.jetbrains.com/idea/)を[Scala開発](https://auth0.com/blog/build-and-secure-a-scala-play-framework-api/)に使うこともあり、これもクロスプラットフォームで実行できます。自分が使っているデスクトップアプリケーションはすべて揃っているようなので、助かります。

 メインの開発とブログの書き込みには、主に[Git](https://git-scm.com/)、[Ruby](https://www.ruby-lang.org/en/)、[NodeJS](https://nodejs.org/en/)を使っています。運よくWindowsのインストーラはすべてあるので、最終的には機能するけれど、_Windows_っぽい感じがあるのはいなめません。たとえば、Windows上でGitを使う一番の方法は、[Git for Windows](https://gitforwindows.org/)を使うこと。これには、Gitを実行するターミナルに連れていってくれるGit Bashもついています。または、[GitHub Desktop](https://git-scm.com/)のようなデスクトップアプリケーションを使うことも、Visual Studio Codeに内蔵しているGitインターフェイスを使うこともできます。

 ![Visual Studio Code、GitHub Desktop、WSLを実行するWindowsデスクトップ](https://images.ctfassets.net/23aumh6u8s0i/7RERJuU7VNzU0C4YEr1c8/2bd1e3c69604cb4f7a61b026e149b10a/working-on-windows_desktop-01)

 Rubyに関しては、[RVM](https://rvm.io/)を使うのが好きです。これがあれば、Rubyの異なるバージョンのインストールと管理もとても簡単にできます。Windowsは、[Cygwin](https://cygwin.com/)などを使ってサポートすることもできますが、これもネイティブソリューションとはいいがたいので、私がいつもやっている方法で使うと問題にぶつかることもあります。

 問題なく使いこなせればどれもよくできたソリューションですが、そもそも本来はMacBookを使った場合と同じように仕事ができる方法を探すことが目的なので、もうちょっと探してみたいと思います。

## <a class="toc-target" id="terminal-velocity"></a>ターミナルベロシティ

 ターミナルを使うと、何でもコンパクトにテキパキと仕事がはかどるので、楽しくてしょうがないのですが、タブ、縦や横の分割線、Unixのコマンドユーティリティ、パイピング、出力のリダイレクションといった機能をサポートするターミナルを使うことは、私にとってはとても重要なことなのです。

 残念ながら、Windowsはこういった機能が苦手なようです。Windowsにはコマンドプロンプトがありますが、私が気に入っているUIの機能はどれもサポートしていません。しかし、私はWindowsシェルコマンドを使い慣れていないので、面倒だなと感じてしまうのです。また、PowerShellというものもあります。その名の通りパワフルなのですが、私にとっては新しいツールなので使い方を学ばなければなりません。結局、どれも以前のような仕事量をこなすには時間がかかります。面白いことにPowerShellのユーザーにとっては、現在のフォルダがGitステータスとなり、[posh-git](https://github.com/dahlbyk/posh-git)がターミナルのような効果を持ちます。これはOh-my-zshの機能のうちでも気に入っているところです。

 ![Windows上のPowerShellのposh-gitのスクリーンショット](https://images.ctfassets.net/23aumh6u8s0i/5onDW4obFAGbOnqIhzlD05/256515dafffb5900bc9d9f2b674f2ad4/working-on-windows_posh-git)

 Mac上の[iTerm2](https://www.iterm2.com/)は、タブ、ウィンドウの分割、プロファイル、テーマ設定などができるので大好きなのですが、それに近いものはないのでしょうか？

 [Hyper](https://hyper.is/)は、少なくともタブやウィンドウの分割などのUI機能はサポートしているターミナルエミュレータです。Electronにもとづいているのでクロスプラットフォームで、[テーマ](https://hyper.is/themes)や[プラグイン](https://hyper.is/plugins)といったもっと高度な機能にも対応しています。私は見た目がよくなるのでアプリケーションのテーマ設定をするのが好きなのですが、どうせ短期間のことなのでこうした些細なことは忘れようと思っていたところでした。

 でも、結局はただのエミュレータで、Windowsのシェルスクリプトを使っているだけのことです。もうちょっと基本的なことを変えていかなければ。

## <a class="toc-target" id="enter-the-windows-subsystem-for-linux"></a>Windows Subsystem for Linuxに入る

 [Windows Subsystem for Linux](https://docs.microsoft.com/en-us/windows/wsl/about)（WSL）は、既存のWindowsアプリケーションと一緒にネイティブのLinuxコマンドを実行するための手段です。仮想マシンは使わないので、ターミナルウィンドウを開くだけで簡単にアクセスできます。以下は、ドキュメントから直接引用してみました。

 > Windows Subsystem for Linuxは、開発者がGNU/Linux環境を直接Windows上で、変更せずにそのまま、仮想マシンのオーバーヘッドを伴うことなく実行するためものです。これには、ほとんどのコマンドラインユーティリティやアプリケーションが含まれます。

 すごいことです。理論上は、Windowsデスクトップ環境にいながら、使い慣れているコマンドラインツールをすべて使えるはずです。

 WSLをインストールするには、Windows 10 Fall Creator's Update（ビルド16215）が必要です。これさえあれば、Windowsの機能の有効と無効を切り替えるスイッチを使って、「Windows Subsystem for Linux」を有効にするだけです。

 ![Windowsの機能を追加するダイアログボックスのスクリーンショット](https://images.ctfassets.net/23aumh6u8s0i/4RFI6W9FLq7l2eZps2IeIH/1effca5d6fb069c6941631d38128e9d5/working-on-windows_installing-wsl)

 また、次のPowerShellコマンドを実行してインストールすることもできます。

```powershell
# Run this inside PowerShell to enable the WSL feature
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
```

> **注意**：WSLをインストールしたら、マシンを再起動する必要があります。

 たくさんある[Windows Store上のLinuxディストリビューション](https://www.microsoft.com/en-gb/search/shop/apps?q=linux&devicetype=pc&Price=0)の一つをWindowsのアプリケーションとしてインストールすることもできます。そこで私は、一番使い慣れている[Ubuntu](https://www.microsoft.com/en-gb/p/ubuntu-1804-lts/9n9tngvndl3q?activetab=pivot:overviewtab)をインストールすることにしました。Ubuntuアプリケーションはインストールすると使えるようになりますが、標準のWindowsコマンドプロンプトを代わりに使うこともできます。

 Linuxターミナルに入るには、コマンドプロンプト（または、好きなターミナルエミュレータ）を開き、`wsl`と入力して起動します。すると、Linuxコマンドプロンプトが表示されます。

```bash
# My WSL command prompt inside the Command Prompt application
/c/Users/steve >
```

 次に何をすればいいのでしょうか。多分、Ubuntuターミナルで普通にやっていることを始めればいいのではないでしょうか。そこで、Ubuntuのどのリリースを使っているかを調べてみましょう。

```bash
> lsb_release -a

No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.2 LTS
Release:        18.04
Codename:       bionic
```

`curl`を使ってみると…

```bash
> curl -i google.com

HTTP/1.1 301 Moved Permanently
Location: http://www.google.com/
Content-Type: text/html; charset=UTF-8
Date: Tue, 26 Feb 2019 10:42:51 GMT
Expires: Thu, 28 Mar 2019 10:42:51 GMT
Cache-Control: public, max-age=2592000
Server: gws
Content-Length: 219
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN

 ```

 Vimをインストールするには？

```bash
> sudo apt-get install vim

Reading package lists... Done
Building dependency tree
Reading state information... Done
The following package was automatically installed and is no longer required:
  libfreetype6
Use 'sudo apt autoremove' to remove it.
0 upgraded, 0 newly installed, 1 reinstalled, 0 to remove and 3 not upgraded.
Need to get 1152 kB of archives.
After this operation, 0 B of additional disk space will be used.
Get:1 http://archive.ubuntu.com/ubuntu bionic/main amd64 vim amd64 2:8.0.1453-1ubuntu1 [1152 kB]
Fetched 1152 kB in 0s (2468 kB/s)
(Reading database ... 39405 files and directories currently installed.)
Preparing to unpack .../vim_2%3a8.0.1453-1ubuntu1_amd64.deb ...
Unpacking vim (2:8.0.1453-1ubuntu1) over (2:8.0.1453-1ubuntu1) ...
Setting up vim (2:8.0.1453-1ubuntu1) ...
```

 ご覧の通り、`apt-get`があるので、Ubuntuのネイティブインスタンスと同じようにどんなソフトウェアでもこれを使ってインストールできます。

 では、Linuxのネイティブディストリビューション上と同じように、NVMなどもインストールできるのでしょうか？

 > 録画して時間を節約するため、すでに自分のマシンにNVMをインストールしてみました。ただし、Nodeそのものはしていません。どうなったか、見てみてください！

<AmpContent>
<amp-video controls
  layout="responsive"
  width="480" height="270">
  <source src="https://cdn.auth0.com/blog/working-on-windows:nvm-video.mp4"
    type="video/webm" />
</amp-video>

</AmpContent>

<NonAmpContent>

<video controls="controls">
  <source src="https://cdn.auth0.com/blog/working-on-windows:nvm-video.mp4">
</video>

</NonAmpContent>

 ラッキーなことに、目立ったハプニングは起こらず、ネイティブのUbuntuインストールと同じようにNode 10とNPMが幸せにインストールされました。さらに、RVMも完璧な姿でインストールできることを確認しました。私が使ったのは、普段からLinuxでやっている[このインストール手順](https://rvm.io/)です。

 さらに、ZSHとOh-my-zshも問題なく、Linuxの手順でインストールできました。ここまできたら、いつもMacBookでやっている仕事が普段通りにできるようになるまで、もうほんのわずかです。

## <a class="toc-target" id="developers-developers-developers"></a>デベロッパ、デベロッパ、デベロッパ

 ツールはインストールできましたが、開発作業そのものはどんな感じでしょうか。

 嬉しいことに、自分がWindowsマシンを使っていることさえ忘れるほど仕事がサクサクはかどっているではありませんか。WindowsのドライブはLinux環境に自動的にマウントされるので、Ubuntu環境からでもこれまで使っていたファイルやフォルダにアクセスできます。つまり、私が使い慣れているGitやその他のコマンドラインユーティリティをすべて使えうことができ、しかもホストWindowsマシン上にある好きなエディタを使ってそれらのファイルを操作ができるということを意味します。デフォルトでは、ホストドライブは`/mnt`フォルダにあります。このため、Windowsでのパス`D:\Development\auth0`が、Linux環境では`/mnt/d/Development/auth0`として使えます。

 現時点で、WindowsホストからLinuxファイルシステムにアクセスすることはできませんが、[Windows 10ビルド1903からはそれが変わります](https://blogs.msdn.microsoft.com/commandline/2019/02/15/whats-new-for-wsl-in-windows-10-version-1903/)。簡単に言うと、これからのWSLは <a href="https://en.wikipedia.org/wiki/9P_(protocol)">9Pファイルサーバー</a> をWindowsとともにブートアップ時にクライアントとして立ち上げ、Linuxのファイルを内部ネットワークプロトコル上でサーブするようになるのです。

### WindowsのUI機能

 私にとってオペレーティングシステムのシェルは、仕事に使っている開発ソフトウェアの一部でしかないのです。たとえば、私はかなり頻繁にOS Xの[スポットライト](https://support.apple.com/en-gb/HT204014)機能を使っており、シンプルなテキスト検索でオペレーティングシステムの中をナビゲートしています。`Cmd+Space`を押すだけで探し物ができるのはとても便利です。

 Windows 10にも同じような機能があって、オペレーティングシステム内を自由に動き回ることができます。Windowsは、プログラムを開くのも、何かを操作するのも、キーボードひとつでできるのです。`Windows Key`を押せばWindowsのスタートメニューが出てくるので、探しているものを入力するだけです。しかし、見た目だけではテキストボックスがハイライトされないので、検索したいことをすぐに入力できることが、ユーザーにとってわかりずらいという面はあるかもしれません。

<AmpContent>
<amp-video controls
  layout="responsive"
  width="480" height="270">
  <source src="https://cdn.auth0.com/blog/working-on-windows:startmenu-video.mp4"
    type="video/webm" />
</amp-video>

</AmpContent>

<NonAmpContent>

<video controls="controls">
  <source src="https://cdn.auth0.com/blog/working-on-windows:startmenu-video.mp4">
</video>

</NonAmpContent>

 私がよく使うOS Xのもう一つの機能は、_Spaces_（操作スペース）と呼ばれる[複数のデスクトップ](https://support.apple.com/en-gb/HT204100)です。これはMission Controlの中の機能で、アプリケーションをいくつかのスペースに分割し、スワイプするだけで簡単に行き来できます。私はよくこの機能を使って仕事を整理しています。例をひとつ挙げると、私は仕事中のプロジェクトのための作業ディレクトリでVisual Studio Codeで開いているすべてのインスタンスごとに、対応するiTerm2のインスタンスを開いておくようにしています。複数のデスクトップを使えば、これらのインスタンスをグループにまとめておけるので、プロジェクトごとに別々のデスクトップに開いておけます。デスクトップを切り替えるには、トラックパッドのジェスチャーを使うか、`Ctrl+Left/Right Arrow`を押します。

 嬉しいことに、Windows 10もこれと同じ機能をサポートしています。OS Xと同様に、複数のデスクトップを作ってそれぞれに実行しているアプリケーションの異なるインスタンスを開いておき、シンプルなキーボードコマンドで切り替えられるのです。`Windows Key+Tab`を押すとミッションコントロールのような画面が現れ、デスクトップやアプリケーションを選べます。しかも、すべてのデスクトップに一つのアプリケーションのインスタンスを指定することもできます（大好きなミュージックプレイヤーを用意しておくのにとても便利です）。

 ![Windowsの複数デスクトップ機能のスクリーンショット](https://images.ctfassets.net/23aumh6u8s0i/27p5Ty1oNdHUndxZFICkn/f843763eb99f42a17ab07e104773c3dd/working-on-windows_multi-desktops)

 <include src="TweetQuote" quoteText="WSLで私が気に入ったのは、私が使い慣れているコマンドラインツールをすべて用意しておけること、複数のデスクトップを使えること、検索できること、そして自分のお気に入りのデスクトップアプリケーションをすべて使える、ということです。"/>

### Dockerについてヒトコト

 このセットアップでDockerを使った経験について、ちょっとだけお話ししておきたいと思います。Windowsのホストマシンにはすでに[Docker Desktop](https://www.docker.com/products/docker-desktop)がインストールされていたのですが、WSLの中で作業をするにはいったんそれをアンインストールしなければいけないんじゃないかと心配していました。それともなければ、Windowsホストに1つ、WSLの中に1つと、Dockerのインスタンスが2つなければならず、貴重なハードドライブの容量を無駄に占領されるのではないか、とも思っていました。

 幸いどちらも気の回しすぎで、[この手順でDockerをセットアップ](https://nickjanetakis.com/blog/setting-up-docker-for-windows-and-wsl-to-work-flawlessly)すれば、WSLが（この記事にあるように、「スムーズに」）機能し、とても手軽で苦労のかけらもかかりませんでした。基本原則は、Windowsホスト上で実行するDockerは、WSLの中で実行するDockerクライアントでも使用できる、それは、この2つがREST APIで連結しているからです。この構成のカギとなるのは、WSLの中のDockerクライアントに、ホストがどこにあるのかを伝えておくことです。同じマシンで実行しているDockerインスタンスにデフォルトで接続しますが、この場合は、Windowsホスト上で実行しているインスタンスにポイントしておくことができます。

 自分でセットアップしたので、WSLの中のDockerは想定通りに機能すると確信を持って言えます。

### SSHキー

 このブログを読んでいただいた人はもう勘付いているかもしれませんが、SSHキーの生成もLinuxのどのディストリビューションとも同じように機能します。私は、この[GitHub.com上のSSHキーガイド](https://help.github.com/en/enterprise/2.14/user/articles/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent)の手順に従ってやってみましたが、問題なく機能しました。注意すべき点は、SSHキーがWSLインストールに対して生成されること。そのため、SSHキーが必要なサービスに追加する必要があります。

 私にとっては問題ではなかったのですが、WindowsプロファイルのためのSSHキーがすでにある場合は、[`.ssh`フォルダのシンボリックリンクをWSLインストールに作成](https://florianbrinkmann.com/en/3436/ssh-key-and-the-windows-subsystem-for-linux/)することで、同じキーを使えます。

## <a class="toc-target" id="ive-now-sold-my-macbook"></a>MacBookを売ってしまった！

 ウソです。MacBookはまだ持っています。でも、使い慣れている開発環境とほとんど同じような環境が作れたので、もうしばらくはMacBookを使わないでも生きていける自信はあります。私が気に入ったのは、私が使い慣れているコマンドラインツールをすべて用意しておけること、複数のデスクトップを使えること、検索できること、そして自分のお気に入りのデスクトップアプリケーションをすべて使える、ということです。

 これまでのところ、Windows Subsystem for Linuxに支障があって仕事ができなくなるという場面には遭遇していません。とはいえ、ここで紹介したユースケースは、ほかの人にしてみれば少しシンプルすぎるかもしれません。

 あなたはWSLを使っていますか？使い心地はどうですか？下のコメント欄にぜひあなたの意見を書き込んでください！

<include src="asides/AboutAuth0" />