77
87

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Windows10 HomeでLinuxに寄せた開発環境を整える

Last updated at Posted at 2019-08-11

LinuxというかUnixというかMac

※ WSL2が実用的なので、基本的に全てWSL2に委ねることを推奨できる => Windows10 WSL2にLinux居城を爆誕させる
本稿はPowerShellとかで頑張りたい人向けになってしまった。。。 :innocent:

対象者

  • 世の中はMac or Linuxだけど Windows10 Homeで開発したい
  • Unixコマンドがあっても Windows10 Homeで開発したい
  • Dockerが必要だけど Windows10 Homeで何とかしたい
  • Spacemacsを使いたいけど Windows10 Homeで何とかしたい
    • Clojure が必要だけど Windows10 Homeで何とかしたい
    • Scalaを使うこともあるけど Windows10 Homeで何とかしたい
  • Node.jsを使うことになったけど Windows10 Homeで何とかしたい
  • Terraformとかインフラ周りも使いたいけど Windows10 Homeで何とかしたい

目次

PowerShell (やWSLなど)を1つのウィンドウ内に複数タブで使う

Windows Terminal (Preview)を使う。

cf. Windows Terminalで色やフォントや画面サイズを設定する

Zipコマンドを使う

参考 => https://note.mokuzine.net/win-cmd-zip/

Windows10、GUIでは普通にZipできるしPowerShellには専用の Compress-Archiveコマンドが用意されているが、LinuxやMacでおなじみのZipコマンドはない :innocent:

Gitを使う

これ https://gitforwindows.org/

Git GUIは使ったことないけど、便利かもしれない。
Git Bashは必須の予感 (ssh-keygenで大活躍しそう (ついでにtfenvとterraformで大活躍した))

まずWindows上のgitで改行コードが自動変換される罠を外す

参考 => @uggds - 気をつけて!Git for Windowsにおける改行コード

初期設定のままだとpullしてきた時に改行コードが自動変換されるため、*.shを動かした時'\r': command not foundのように怒られることがある。

本稿にも書くが原因は~/.gitconfigにあるコレ。

[core]
    autocrlf = true

falseにしよう。罠を外したら思う存分pullしよう。

気づかず やってしまったらこちらで対処していく => https://qiita.com/t-kuni/items/1c5c7512ee0827f200de

Dockerを使う

Windowsで使えるDockerは大きく3種類

  • Docker Desktop for Windows
  • Docker Toolbox
  • WSL (Windows Subsystem for Linux) 2

まず、Docker Desktop for Windowsは仮想化技術としてhyper-vを使うので、Windows10 ProやEducationなどでしか使えない(Homeにはhyper-vが無い)。つらい。。。つらい。。。

Windows10 Homeで使える手段としては以下。

  • Docker Toolbox
    • 仮想化技術としてHyper-vではなくVirtualBoxを使っている
  • WSL2 + Ubuntu18.04LTS
    • ubuntuにdockerをインストール可能
  • Docker Desktop WSL2 Tech Preview (※ v2.2.2.0以降かな?)

以上3つのいずれかを使うことになりそう。
最近Docker Desktop WSL2 Tech Previewの成長がめざましいので、十分に実用できるかも。PowerShellではつらかった各種問題もWSL2では難なくクリアしてそう

Docker Toolbox

インストール

docker-composeを使うため、Docker Toolboxをインストールする。
https://docs.docker.com/toolbox/toolbox_install_windows/#step-2-install-docker-toolbox

Docker Toolboxインストールの参考:

手順通りにインストールすれば動く。
※VirtualBoxが既に入っている場合は、アンインストールしてDocker Toolboxでインストールすることを推奨。バージョンの壁なのかパスの壁なのか、動かないので…

ポートフォワーディングで繋げる

上記(インストール)の参考リンクにも書いてある。
例えばdockerのコンテナで0.0.0.0:8080->80/tcpのようなポート設定をしている場合、VirtualBoxのポートフォワーディングでは以下のように設定する。

名前 プロトコル ホストIP ホストポート ゲストIP ゲストポート
okimochi TCP 127.0.0.1 8080 8080

おまけ:WSL1を入れてUbuntuのTerminalからdockerを動かせるようにする

Ubuntu16.04LTSではなく Ubuntuを入れていたので、Ubuntuのバージョンは18.04だったかもしれない。。。

まずWSLインストール
参考 => Windows Subsystem for Linuxをインストールしてみよう!

  • WSL上でCドライブは/mnt/c/にある。マウントしているとかなんとか。
  • PowerShellとWSLとではホームディレクトリが別々…すなわち.gitconfigも別々なので注意(WSLでcore.autocrlf=trueのままだとどうなっちゃうんだろう)

いよいよWSL1でDockerを使えるようにする
ラボラジアン - Windows 10 Home のための、Docker Toolbox をインストールして WSL から使う方法」を参考にして、WSL上の~\.bashrcに以下を追記する。

.bashrc
export DOCKER_HOST=tcp://192.168.99.100:2376
export DOCKER_CERT_PATH=/mnt/c/Users/okimochi/.docker/machine/certs # ユーザ名がokimochiの場合
export DOCKER_TLS_VERIFY=1
export COMPOSE_TLS_VERSION=TLSv1_2

最後のCOMPOSE_TLS_VERSION=TLSv1_2は、SSL error: [SSL: TLSV1_ALERT_PROTOCOL_VERSION] tlsv1 alert protocol versionを回避するために指定する。参考 => https://github.com/docker/compose/issues/6473

同じ目に遭っている人がいた。

WSL2 + Ubuntu18.04LTS

Windows Insider Previewアップデートをインストール

WSL2を使うにはInsider Previewにだけ存在するビルドが必要。公式が発表している前提条件はコレ。

WSL 2 は、Windows 10 ビルド18917以降でのみ使用できます。

  • WSL がインストールされていることを確認します (この手順についてはこちらを参照してください)。また、Windows 10ビルド 18917以降を実行していることを確認してください。
  • ビルド18917以降を使用していることを確認するには、Windows Insider プログラムに参加して、"高速" リングを選択してください。
  • Windows のバージョンを確認するには、コマンドプロンプトを開きver 、コマンドを実行します。
  • "仮想マシン プラットフォーム" のオプション コンポーネントを有効にする
  • コマンド ラインを使用して、WSL 2 によってサポートされるようにディストリビューションを設定する
  • 現在のディストリビューションが使用している WSL のバージョンを確認する

要するにWindowsの更新設定から Insider Programに参加して Fast状態でアップデートすれば18917以降のビルドが手に入る。
Insider Previewはちょっとリスクもある気がする。

僕がアップデートした時点では Build 18995だった。

WLS1とUbuntu18.04LTSをインストール

上記のおまけと同じ方法で WSL1Ubuntu18.04LTSをインストールする。
Insiderじゃなくてもできるので、こっちを先にやっても良い。

※Microsoftストアにある Ubuntu Ubuntu18.04LTS Ubuntu16.04LTSの違いは単にバージョンらしい
Ubuntuは最新バージョンに都度更新されていくとのこと。
勝手にやらないでのおきもちを込めて18.04LTSを使う。

WSL2へアップグレード

公式に従う

もしアップグレード中にエラーが出たら↓

カーネル更新

WSL 2 を実行するには、カーネル コンポーネントの更新が必要です

Linux カーネル更新プログラム パッケージを公式サイトからダウンロード・インストールすれば解決。
cf. https://docs.microsoft.com/ja-jp/windows/wsl/wsl2-kernel

PS C:\WINDOWS\system32> wsl -l -v
  NAME            STATE           VERSION
* Ubuntu-18.04    Stopped         1

PS C:\WINDOWS\system32> wsl --set-version Ubuntu-18.04 2
変換中です。この処理には数分かかることがあります...
WSL 2 との主な違いについては、https://aka.ms/wsl2 を参照してください
変換が完了しました。

PS C:\WINDOWS\system32> wsl -l -v
  NAME            STATE           VERSION
* Ubuntu-18.04    Stopped         2

ファイルの圧縮/暗号化

システムの制限により、要求された操作を完了できませんでした。仮想ハードディスク ファイルの圧縮と暗号化が解除されている必要があります。また、仮想ハードディスク ファイルをスパースに設定することはできません。

これはWSL2のUbuntuディレクトリが圧縮されていると起こる。
この解決策に従い、Ubuntuディレクトリの圧縮を解除すれば良い(ディレクトリ以下すべて圧縮解除する)。

たとえばユーザ名 v2okimochiの場合、 C:¥Users¥v2okimochi¥AppData¥Local¥Packages¥CanonicalGroupLimited.Ubuntu18.04onWindows_79rhkp1fndgscみたいなディレクトリがあるはず。

なお解除中に以下のようなエラーが出たら 全て無視すればなんかいける。

属性の適用エラー
ファイルの属性の適用中にエラーが発生しました:
C:¥Users¥v2okimochi¥AppData¥Packages¥fsserver
ファイルにアクセスできません。

WSLと仮想化機能の有効化

Windowsホームボタンから Windowsの機能の有効化または無効化を開き、以下3つにチェックが入っていることを確認する。
ホームボタンの検索で日本語を入力できない場合は、 featureを入力すれば出ると思う。英語でもいいんだ(未知との遭遇)

  • Windows Subsystem for Linux
  • Windowsハイパーバイザー プラットフォーム
  • 仮想マシン プラットフォーム

features.png

WSLのインストールで度々出てくる 機能の有効化は恐らくこれ。

WSL2 (Ubuntu18.04LTS)にDockerを入れる

Docker Desktop for Windows v2.2.2.0以降

Docker Desktop for Windowsをインストールする。

Dockerの設定から、WSL2との連携にチェックを入れる。

Enable integration with my default WSL distroにチェックを入れてしまっても良いし、 Enable integration with additional distrosからディストリビューションにチェックを入れても良い。
image.png

Docker Desktop for Windows v2.2.2.0より前

Docker Desktop for Windowsをインストールできない :innocent: :innocent: :innocent:
Ubuntuに直接dockerを入れる。

Ubuntuなので apt-get apt update, apt installが使える。
aptapt-getの欠陥を克服しているらしい(ので apt-getより apt推奨)

公式に従いdockerインストール
https://docs.docker.com/install/linux/docker-ce/ubuntu/

docker-composeインストール
https://docs.docker.com/compose/install/

Dockerを動かす

Docker Desktop for Windowsを使えていれば不要。

PC起動する度に必要っぽい。

$ sudo /etc/init.d/docker start

ちな /etc/init.d/docker statusで起動状態がわかる。

※止まっているのを忘れてDockerを動かそうとすると、以下のようなエラーが出る。

ERROR: Couldn't connect to Docker daemon at http+docker://localhost - is it running?

If it's at a non-standard location, specify the URL with the DOCKER_HOST environment variable.

Dockerデーモンが動いてない的に怒られている。 docker info見るとこう。何このエラーみたいになった時これを思い出せたらいいな。。。

docker info
Client:
 Debug Mode: false

Server:
ERROR: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
errors pretty printing info

Dockerコンテナへの接続

Docker Desktop for Windowsを使えていれば不要。

実は Docker Toolboxのようにlocalhostでバシバシ接続できない。
たとえば mariadbコンテナを立ててそのDBに接続しようとするとlocalhostじゃダメ。 なんとWSL側もlocalhostでは繋がらない(WindowsもWSLも同じ存在という扱いだし当然か?)

Dockerコンテナには WSL側のeth0 IPアドレスを使って繋ぐifconfigとか ifconfig eth0とかやれば出る。 172.27.145.150みたいなアドレスだった。

このアドレス、厄介なことに PCを起動する度に変わる WSL2を起動する度に変わる
つまりAPIサーバなどからDBへ接続する際のホスト名 (IPアドレス)を毎回変えてやらねばならない。
そして static IPを無理やり付与した程度では直らないらしい。つらい。。。

Github上でも WSL2に静的IPアドレスを付けたいんだけど とか ポートフォワーディングで回避しようぜ とか色々言われている。 やり方を @v2okimochi に解説してくれ!!!

Webに localhostで接続

アドレスを固定化できないか探していたが、別件でこういう方法もあるらしい。
https://yukituna.com/2284/
https://devblogs.microsoft.com/commandline/whats-new-for-wsl-in-insiders-preview-build-18945/

Webはlocalhostでアクセスできた(設定のおかげかは不明)。

WSL2でもMacのHomebrewのようなパッケージ管理をする

MacではHomebrewを使うことで、特に何も考えなくてもスッとパッケージをインストールできる。

WSL2内のUbuntu (Linux)では、自力で頑張る必要があった。

現在、そんなWSL2内のUbuntuでもHomebrewが使えることを教わった。

cf. https://docs.brew.sh/Homebrew-on-Linux

既に色々な紹介記事もある。
Linuxbrew のススメ
【WSL】LinuxにHomebrewを導入する

これで、ドキュメントに brew installしろとしか書かれていないようなツールも気軽にインストールできる :tada:

sbtやtfenvもスッと入る。

Leiningenを入れてPowerShellからClojureを動かせるようにする

Leiningenをインストール

参考 => yohshiy - Clojure, Leiningen の Windows へのインストールと使い方

本稿でも補足をする。

  • まずJDKをProgram Files以外のディレクトリにインストールする
    • oracleがログイン必須みたいな状態なので、JDKはadoptopenjdkなどがおすすめ
    • スペースが含まれるディレクトリにインストールすると、Emacsからのrepl呼び出しが失敗するらしい
  • lein.bat推奨の予感
    • v2okimochiは参考リンクのleiningen-win-installerを使えなかった(JDKが認識されずインスコ止まる)
    • 予めWindowsの環境変数としてJAVA_HOME=C:\<jdkへのパス>\binを追加しておく
    • WindowsはWin32内のJavaなどを見に行く習性があるらしいので、環境変数の順番はWin32より上に置く
  • jenvは使えない…のでJDKへの環境変数pathを変えて疑似jenvっぽく頑張る

Spacemacsを入れてcider-jack-inからlein replを使えるようにする

Spacemacsインストール

公式にインストール方法がある => https://github.com/syl20bnr/spacemacs

Windows版は勝手が違うので補足する => v2okimochi - spacemacs.md: Windowsでのインストール

補足内容は以下のような感じ。

  • 公式のインスコ方法だと日本語インライン変換(入力中の文字を表示してくれる機能)が詰むよね
  • 環境変数を通す必要があるよね
  • 初回起動は--insecureオプションが必要だよね

あとはSpacemacsのいい感じの設定方法については「@lagenorhynque - Clojure/ClojureScript関連リンク集: Clojure開発全般」に全部載ってる。Clojure関連も全部載ってる。

環境変数を読み込めるようにする

SpacemacsがPCの環境変数を読む仕組みが微妙にアレ(悪いとは思わないけど、知ってないと罠なのでひどい。。。)
こういうやつなんだと知っていればおk。
https://qiita.com/v2okimochi/items/82c541ba67c81493976c

cider-jack-inでreplを起動する

ayato-p - SpacemacsでClojureを書くために僕が行った設定」を参考にして、.spacemacs(コマンド操作Space f e dで開ける)にCider関連の設定を加える。

あとはClojureファイル(*.clj)を開いた状態でSpace , 'すればnrepl serverが動き出し、少し待てばcider replが起動する。

JVM文字化け問題を何とかする

ClojureはJVMを使っているので、JVMの有名な日本語文字化け問題を引き起こす。
Leiningenではこうやって対処できる。
https://qiita.com/v2okimochi/items/40d0ebd2186657a44969

TypeScript Layerで自動整形をかける

spacemacsはTypeScript Layerで typescript-fmt-on-save tを設定すれば自動整形できる。
が、Windowsにおいては一筋縄ではいかないかもしれない。

もし "No such file or directory diff"的なエラーが出たらコレで解決できるかもしれない。
https://qiita.com/v2okimochi/items/f3f4361d7842271454c6

Scala Layerで定義ジャンプや補完機能を使う

Scalaには定義ジャンプや補完機能をもつバックエンド (Language Server?)としてEnsimeやMetalsが挙げられる。

Ensimeを利用する方法Metalsを利用する方法もあるが、Spacemacs上ではEnsimeの定義ジャンプ機能が怪しいのでMetalsに軍配が上がりそう。

他にも色々あるが、

Windows10でspacemacs関連はもう面倒なのでspacemacsメモとトラブルシューティングにまとめた。

PowerShellでSBTの文字コード問題を解決する

PowerShellを使っていると、SBTの起動や実行まわりでやはり文字コードの問題が起こる(単純なScalaコード上においても)。

文字化けやjava.nio.charset.MalformedInputExceptionエラーを倒した例はこちら

nvm経由でnpmを入れて複数のnodeを切り替えられるようにする

参考 => @rapando - nvm-windows 導入
以上。シンプル。はや~い

補足
Program Filesなど スペースが入ったディレクトリ内にインストールしてはいけない
参考 https://github.com/coreybutler/nvm-windows/wiki/Common-Issues

また、バージョンは1.1.7でないとダメっぽい。 Could not download npm for nodeエラーが出てnpmを使えない。

この議論で示されているように v1.1.7 Maintenance Releaseで修正されている。
https://github.com/coreybutler/nvm-windows/issues/373

ここでも同じことが言われている。 https://one-it-thing.com/2294/

WSLを使うならUbuntuに入れれば良かったり

tfenv経由でterraformを入れて無双する

AWSやGCPなどに用意されたCLIサービスをいい感じに使うためのterraformを、tfenvでバージョン管理する。

WSL2にHomebrew (for WSL)を入れて brew tfenvすれば勝ち。完

以下はWSLを使わず頑張る場合↓

tfenvのインストール

公式はこちら https://github.com/tfutils/tfenv

そしてやはりMac基準… :innocent: (インストール手順にはbrewが描かれている)

曰く、

Support
Currently tfenv supports the following OSes

  • Mac OS X (64bit)
  • Linux
     - 64bit
     - Arm
  • Windows (64bit) - only tested in git-bash - currently presumed failing due to symlink issues in git-bash

Windows 64bit版は Git Bashでしかテストされていない
(テストしてないだけで動くんでしょと思ったらコマンド認識すらされなかった :innocent: :innocent: :innocent: )

しかも状況によっては失敗することが想定されているらしい………………


ひとまず、Windowsの場合は手動インストールとなる => 参照 https://github.com/tfutils/tfenv#manual

インストールだけならPowerShellでもいけた。

公式はMacやLinuxを想定してこう書いているが、

git clone https://github.com/tfutils/tfenv.git ~/.tfenv

PowerShellでcloneする場合は、 ~が認識されず ~ディレクトリを作成されて放り込まれる ( :innocent: )ので、ホームディレクトリで直接 .tfenvディレクトリを作ってもらうのが良さそう。

git clone https://github.com/tfutils/tfenv.git .tfenv

環境変数を通す

binディレクトリまでの絶対パス (たとえば C:\Users\v2okimochi\.tfenv\bin)をWindows10の環境変数 Pathに追加する。

terraformのインストールと実行

環境変数を追加した以降にGit Bashを立ち上げると、Tabキーで tfenvコマンドが補完できるはず。
※ PowerShellだとコマンド認識されない :innocent:

.terraform-versionファイルでバージョン指定しておき、そのディレクトリで tfenv installコマンドを実行すれば、指定したバージョンのterraformをインストールしてくれる。

そして terraformコマンドも動作するはず :tada:

ちなみに Git Bashでは動いたのにWSLでは動かなかった。。。どうして。。。。。無双できない

77
87
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
77
87

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?