水底

ScalaとかC#とかネットワークとか

私的WindowsのUnixShell環境(暫定)

OUCC Advent Calendar 2016 - Adventar 二日目の記事にしましたが特にOUCCは関係ありません. 他のadvent二日目の記事を偶然見かけて「いや, 明日やろwww」とか思ったら今日でした. 今日は九条カレンさんの生誕祭が終わってしまったという悲劇的な日です.

Windowsを利用していても, 結局のところUnixShellが必要になる. Anniversary updateでBash on Windowsが追加されるなどWindows上のUnixShell(モドキ含む)の発展が著しいが, ある程度自分用の環境が整ったので簡単にまとめる.

TL;DR

Hyper-v上の仮想マシンを使う

選択肢

ホスト型VM(VirtualBox)

任意のディストロを利用でき, スナップショットや共有ディレクトリ, USB等いろいろと小回りがきく. しかしながらホスト型であるが故に負荷が大きいため, Shell代わりに常用するにはあまり向かないとして見送った.

BoW

注目株. BoWはWindows上で唯一ネイティブで動く(若干語弊があるが)など確かに素晴らしい, が, 欠点が多すぎた. 思いついたものを少し列挙すると,

  • ネットワーク周りが不安定
  • 現状利用できないアプリ多数(Docker, scalaインタプリタ, sbt, etc.)
  • Ubuntu only(一応変えられはするが…)
  • そもそも遅い

特に利用できないアプリがあることは致命的であり, 例えばDockerはDocker for Windows, その他利用できないアプリもWindowsで動く代替を探して利用するかなければ諦めることになる. このためBoWとPowerShellを行き来する必要性が出るなど非常に面倒であったため見送った.

Command prompt/PowerShell

つらい

つらい!!!

Cygwin/MinGW

触りたくない

触りたくない!!!

MSYS2

試してない…けどありかも?

(Client)Hyper-v

というわけでHyper-vに行き着いた. 先にメリットとデメリットを挙げると,

  • メリット
    • ハイパーバイザ型なので比較的動作が早い
    • 当然ながら仮想マシンとしての機能・特徴を利用できる
      • 任意のディストロを利用できる
      • ホストマシンを再起動してもShellが保持される
      • スナップショット
    • Windows標準という謎の安心感(ホスト型VM比)
  • デメリット
    • 共有ディレクトリ・USB接続等がホスト型VMほど整備されていない
    • (当然だが)Windowsから直接コマンドを利用できない. 例えばIDEのデバッガはリモートのデバッガを使う必要がある.

構成

SSH経由でホストマシンのみから利用できる(=外部に晒さない)仮想マシンHyper-v上に作成する.

  1. 仮想スイッチを作成
    Internal指定で作成する
  2. Internet Connection Sharingの設定
    仮想スイッチをInternalにしたため, このままではインターネットにアクセスできない. のでICSを使ってインターネット側に繋ぐ. ホスト側で利用しているアダプタを右クリック -> Properties -> SharingでICS有効のチェックを入れ, 先ほど作成した仮想スイッチに対応する仮想NIC(vEthernet)を指定する.
  3. 仮想マシンを作成
    New -> Virtual Machineから適宜設定を行う. このときネットワークに先ほど作成した仮想スイッチを指定する.
  4. Linuxのインストール
    今回はShell目的なのでGUIなしで適当なディストロをインストールする. 個人的にはfedoraが好き. Hyper-vマネージャのコンソールはつらいのでSSH serverを入れてリモートからの利用に備える.
  5. VMのネットワーク設定
    デフォルト状態でもVMからインターネットへのアクセスは正常にできるはずだがDHCPが噛んでいるため何かと不便である. そのためVMのIPを固定する. Windowsのデフォルト設定であればホストが192.168.137.1/24になり, VMはこのネットワーク内のIPが払い出されるので, VM192.168.137.x/24内のアドレスに指定し, GWやDNS192.168.137.1を参照させることで固定する.

あとはSSHで固定したIPに接続して思うがまま. 例えばDockerデーモンもここで動かす.

[opt] その他

コンソール

つまるところどうやって作成したVMのShellを開くのかというお話. 個人的着地点はcmder+BoWとなった(あれ?BoW使ってるジャン). 素のPowerShellやRLogin等からSSHも可能だがいろいろと不便な点が多いので, 拡張性の高いコンソールとしてcmderを, 実際にSSHするShellとしてBoWを利用する. BoW上で.ssh/configが利用できないのチョット悲しい. そのうち対応されるかな? ちなみにPowerShellを利用するにも素のものよりcmder上のほうが使いやすい(IMO).

共有ディレクト

ホスト側のディレクトリを共有して利用する.

  1. [ホスト] 共有したいディレクトリを右クリック -> Properties -> Sharing -> Advanced Sharingから共有設定を有効化し, 更にPermissionsから必要な権限を追加する.
  2. [VM] SSHでログインし, mount -t cifs {Network path} {Mount point} -o user={User},ip=192.168.137.1,uid=$USER,gid=$USERでマウントする(uid, gidは任意). この際cifs-utilsのインストールが必要かも.

hosts

ホストのWindowsVMの両方のhostsを書いておくと便利

TODO

  • よりセキュアなファイル共有
  • 有線/無線のようなアダプタ変更があった場合, Sharingの再設定をする必要がある

参考

www.adventar.org

f:id:amaya382:20161202001109j:plain