コンテンツ [hide]
背景 / WindowsでLinuxを動かす
私は自作PCが好きなのでWindwosを使っているのですが、正直なところ、プログラミングをする上ではバックにLinuxがあるMacに分があると言えるでしょう。これまで、Windows環境でLinuxを動かすには、マルチブートや仮想化、(bashが使えればいいなら)Git BashやCygwinなどがありましたが、いずれもWindows公式の機能ではありませんでした。
しかし、Windows Subsystem for Linux(WSL)の登場によって、そのような問題は大きく解決へと向かいます。完璧ではないもののWindows標準の機能として、Linux (主にUbuntu)を動かすことができるようになったのです。
今回は、そのWSLを用いて、Linux上のnode環境を構築し、VSCodeから利用できるようにするまでに行った操作を説明します。(単なるクックブックではなく少し原理も交えていきます。)
WSLの導入
既にわかりやすい記事があるので、省略します。(ここはハマりポイントもないです。)なお、2018年の秋頃に行われたFall Creators Updateで手順が若干変わっているので、最近書かれた記事を参考にすることを推奨します。
https://qiita.com/Aruneko/items/c79810b0b015bebf30bb
以降は、WSLのターミナルが起動するようになった前提で話を進めます。
node
nodeをインストールしましょう。 node -v
を叩くと、apt install
するようにと指示が出ると思いますが、それは罠です。(バージョンが古いため、エラーが出る)
nodebrew
というツールを用います。pyenv
みたいなものです。複数のバージョンのnodeを切り替えて使えるようにするツールですが、今回は最新バージョンのnodeを入れるためにnodebrew
を使います。
-
curl -L git.io/nodebrew | perl - setup
: nodebrewをダウンロードし、セットアップする -
export PATH=$HOME/.nodebrew/current/bin:$PATH
: nodebrewにパスを通す -
source ~/.bashrc
先程追加した環境変数を即座に反映させる -
nodebrew install-binary latest
: 最新版をインストールする nodebrew use latest
: 最新版に切り替えるnode -v
で確認
ホームディレクトリの切り替え
デフォルトでは、Windowsのファイルは/mnt/c 以下にマウントされています(Cドライブの場合)。これを、ホームディレクトリにすることで、 ~/Documents
みたいな感じでアクセスできるようにしようという話です。
デフォルトでは~
は/home/<username>
になっています。これを変更することで、何らかの不具合が出るかもしれません。Windowsのファイルを触ることがあまりない方はそのままにしておいたほうが良いかもしれません。
やり方は簡単で、 /etc/passwd
の中にある/home/your_username
を /mnt/c/Users/your_username
に変えるだけです。ls -l ~
で確認してみましょう。
git
gitは既に入っているので、設定は必要ない…と思いきや、そのままだと上手くいきません。問題は2点あります。
- ~/.ssh内のファイルのpermission
- 改行コード(?)
~/.ssh内のファイルのpermission
リモートリポジトリに接続するときの認証方法としては公開鍵暗号方式を使っている(=ssh)と思うのですが、その際に鍵は~/.ssh
に保存するのが一般的ですよね。WSLのGitもデフォルトで~/.ssh
を読みに行きます。先程の設定で、~
を/mnt/c/Users/hoge
にしていれば、特に手間なく鍵を読めるはずです…が、ここで出てくるのがpermissionの問題です。
WindowsのファイルパーミッションはWSL(すなわちLinux)から見ると、全てのファイルが777
に見えます。この状態でgitコマンドを叩くとpermissionが強すぎると怒られてしまいます。よって、chmod 600 ~/.ssh/*
する必要があります。しかし、WSLからファイルパーミッションを変更するためには、一工夫必要です。
metadataの利用
ファイルパーミッションを変更するにはmetadataを変更する必要がありますが、そのためにはdrvfs
をmountするときに-o metadata
を指定する必要があります。このマウントは、WSLの起動時に自動で行われるのですが、デフォルトではこのオプションはついていないので、umount
してからオプションつきでmount
します。
素直にやるなら、sudo umount /mnt/c
してから
となります。しかし、これを毎回やるのは面倒ですので、sudo mount -t drvfs C: /mnt/c -o metadata
/etc/wsl.conf
に以下を書き込みます。これによって、自動マウントのときにオプションをつけられます。
これで、chmod
によるpermission変更が有効になりました。
改行コードの問題
改行コードとして、WindowsではCRLF
、LinuxではLF
が使われます。共同開発では不便なので、リモートリポジトリでは普通、LF
が使われます。Windows環境では、pullするときにLF→CRLFの変換が行われ、pushするときにCRLF→LFの変換が行われます。これはGitのcore.autocrlf
で有効/無効にできます。
今までWindowsで開発していたディレクトリをWSLで開き、git status
を実行すると、なぜか大量のmodifiedが表示されるにもかかわらず、diffは何もないという奇妙な現象に遭遇しました。私は、これを改行コードの問題と考えました。
Windowsで何らかの方法でGitをインストールすると、core.autocrlf
がtrue
になっていますが、本来、デフォルトではfalse
のようです。 まだまだWindowsからファイルを触る機会が多いと思ったので、これをtrue
にしました。(git config --global core.autocrlf true
)
それだけでは問題が解決されなかったので、キャッシュを削除したところ問題は解消されました。(git rm -r --cached . && git add .
)
VSCodeで使えるようにする
これは簡単です。やりたいことは、Ctrl + @
で出てくるターミナルのデフォルトをWSLにすること。そのためには、VSCodeの設定で、terminal integrated shell windows
などと検索し、(おそらく、C:/hogehoge/cmd.exe
となっているところを)C:/Windows/System32/wsl.exe
に書き換えます。VSCodeを再起動すれば、Ctrl + @
で開くターミナルがWSLになっているはずです。
感想
私が昔、試したときは全然使えない子だったのですが、いつの間にか使える子になっていました。Microsoftもしっかりと力を入れて開発してくれたようです。これで、みんなMacのチームに一人だけWindows使いが入って、「それ、私だけ動きません…」と申し訳ない気持ちにならなくて済みますね。(といっても、まだ罠がありそうですが…)