OUCC Advent Calendar 2016 - Adventar 二日目の記事にしましたが特にOUCCは関係ありません. 他のadvent二日目の記事を偶然見かけて「いや, 明日やろwww」とか思ったら今日でした. 今日は九条カレンさんの生誕祭が終わってしまったという悲劇的な日です.
Windowsを利用していても, 結局のところUnixShellが必要になる. Anniversary updateでBash on Windowsが追加されるなどWindows上のUnixShell(モドキ含む)の発展が著しいが, ある程度自分用の環境が整ったので簡単にまとめる.
TL;DR
選択肢
ホスト型VM(VirtualBox)
任意のディストロを利用でき, スナップショットや共有ディレクトリ, USB等いろいろと小回りがきく. しかしながらホスト型であるが故に負荷が大きいため, Shell代わりに常用するにはあまり向かないとして見送った.
BoW
注目株. BoWはWindows上で唯一ネイティブで動く(若干語弊があるが)など確かに素晴らしい, が, 欠点が多すぎた. 思いついたものを少し列挙すると,
特に利用できないアプリがあることは致命的であり, 例えばDockerはDocker for Windows, その他利用できないアプリもWindowsで動く代替を探して利用するかなければ諦めることになる. このためBoWとPowerShellを行き来する必要性が出るなど非常に面倒であったため見送った.
Command prompt/PowerShell
つらい
…
つらい!!!
Cygwin/MinGW
触りたくない
…
触りたくない!!!
MSYS2
試してない…けどありかも?
(Client)Hyper-v
というわけでHyper-vに行き着いた. 先にメリットとデメリットを挙げると,
- メリット
- デメリット
構成
SSH経由でホストマシンのみから利用できる(=外部に晒さない)仮想マシンをHyper-v上に作成する.
- 仮想スイッチを作成
Internal
指定で作成する - Internet Connection Sharingの設定
仮想スイッチをInternal
にしたため, このままではインターネットにアクセスできない. のでICSを使ってインターネット側に繋ぐ. ホスト側で利用しているアダプタを右クリック -> Properties -> Sharing
でICS有効のチェックを入れ, 先ほど作成した仮想スイッチに対応する仮想NIC(vEthernet)を指定する. - 仮想マシンを作成
New -> Virtual Machine
から適宜設定を行う. このときネットワークに先ほど作成した仮想スイッチを指定する. - Linuxのインストール
今回はShell目的なのでGUIなしで適当なディストロをインストールする. 個人的にはfedoraが好き. Hyper-vマネージャのコンソールはつらいのでSSH serverを入れてリモートからの利用に備える. - VMのネットワーク設定
デフォルト状態でもVMからインターネットへのアクセスは正常にできるはずだがDHCPが噛んでいるため何かと不便である. そのためVMのIPを固定する. Windowsのデフォルト設定であればホストが192.168.137.1/24
になり, VMはこのネットワーク内のIPが払い出されるので, VMを192.168.137.x/24
内のアドレスに指定し, GWやDNSは192.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).
共有ディレクトリ
ホスト側のディレクトリを共有して利用する.
- [ホスト] 共有したいディレクトリを
右クリック -> Properties -> Sharing -> Advanced Sharing
から共有設定を有効化し, 更にPermissions
から必要な権限を追加する. - [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
ホストのWindowsとVMの両方のhosts
を書いておくと便利
TODO
- よりセキュアなファイル共有
- 有線/無線のようなアダプタ変更があった場合, Sharingの再設定をする必要がある
参考