Cygwinを捨ててバックグラウンドでLinuxを動かす

僕は普段Windowsを使っていて, 必要になるとCygwinを使っていたんですが, そろそろどうにかしたいと思い, バックグラウンドでLinuxを動かすことにしました

要件としては

  • メインはWindows
  • Linuxは表に出てこないで, SSHで操作する
  • LinuxWindowsのファイルにアクセスできる
  • Windowsの作業に支障が出ない程度に軽く
  • Linuxからインターネットに接続できる

取り敢えずそれっぽい感じになったので, 纏めておきます


以下ではWindows 8.1 x64 & CentOS 6.7 x64 Minimal & Virtual Box 5で行いました


まずテキトーにCentOSをVirtual Boxに入れましょう
GUIは使わないつもりなのでメモリは512MBくらいあれば大丈夫そう
容量もWindowsの領域を使う予定なので最低限で良いと思います(あまり少ないと落ちるので気を付けて下さい)
f:id:kkrnt:20160204012016p:plain

インストールが終わったらネットワークの設定をします
/etc/sysconfig/network-scripts/ifcfg-eth0を以下のようにします

DEVICE=eth0
HWADDR=xx:xx:xx:xx:xx:xx
TYPE=Ethernet
UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=dhcp
IPV6INIT=no

これでネットワークを再起動します

# service network restart

するとDHCPがIPを降ってくれると思います


※IPを固定した場合は以下の設定を行ってください
この後の設定で現在のIPとネットマスク, ゲートウェイをメモります

# ifconfig
# route

このままだとIPが変わってしまう可能性があり, 困ってしまうので固定します
さっきメモった情報を元に/etc/sysconfig/network-scripts/ifcfg-eth0を変更します

DEVICE=eth0
HWADDR=xx:xx:xx:xx:xx:xx
TYPE=Ethernet
UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=static
IPADDR=xx.xx.xx.xx
NETMASK=xx.xx.xx.xx
GATEWAY=xx.xx.xx.xx
IPV6INIT=no


これでIPが固定できるはずなので, ネットワークを再起動します

# service network restart


インターネットに接続出来ていることをping等で確認してみてください

繋がっていたらシステムのアップデートを行います

# yum -y update

アップデートが終わったら一度VMの電源を落とします

特に設定を弄っていないのであれば初期設定ではNATで接続しているはずです
f:id:kkrnt:20160204125948p:plain

NATはポートフォワーディングができるので, これでWindowsからVMSSHできるように設定しましょう
f:id:kkrnt:20160204130107p:plain

これでWindows側で127.0.0.1の22ポートにアクセスするとVMの22ポートに繋がります

VM側でもWindowsから接続できるようにiptablesの設定をしましょう
VMを起動し, iptablesにルールを追加します

# iptables -I INPUT -p tcp --dport 22 -j ACCEPT
# service iptables save
# service iptables restart


次にVirtual BoxのGuest Additionsをインストールします
ビルドに必要なものをインストールします

# yum -y groupinstall "Development Tools"

次にVMのメニューバーからデバイス→Guest Additions CDイメージの挿入を選択します
イメージをマウントし, インストールします

# mount /dev/cdrom /mnt
# cd /mnt
# ./VBoxLinuxAdditions.run
# umount /mnt

X Windows系のビルドは失敗しますが, 必要ないので無視します
VMを終了し, VMの設定から共有フォルダを追加します
(自動マウントにしたほうが良いでしょう)
f:id:kkrnt:20160204132243p:plain
これでLinux側から/mediaにアクセスすると, Windowsのファイルにアクセスすることが出来ます
f:id:kkrnt:20160204151138p:plain
以上でVMの用意は完了です

後はWindowsが起動(ユーザがログオン)したら, VMをバックグラウンドで起動させるように設定します
vboxmanage.exeに対して以下のような引数を渡すことでそれが可能です

vboxmanage startvm "vmの名前" --type headless

これをbatファイル等に保存し, スタートアップに登録します
batだとcmdが一瞬出てきてダサいかも
C#だとこんな感じ

using System.Diagnostics;

class Program
{
    static void Main()
    {
        var psi = new ProcessStartInfo();
        psi.FileName = "vboxmanage.exe";
        psi.Arguments = "startvm \"linux\" --type headless";
        psi.WindowStyle = ProcessWindowStyle.Hidden;
        psi.CreateNoWindow = false;
        var p = Process.Start(psi);
        p.WaitForExit();
    }
}

後はTera Term等からSSHで接続すれば完成です


ssh接続に関してですが, Tera Term等を使っても良いですが, 僕としてはGitに付属してるものを利用するのがオススメです
フツーにインストールすると

C:\Program Files\Git

あたりにインストールされると思うので, そこのbinのbash.exeに対して以下のようなコマンドを渡すと良いです

@echo off
bash -c "ssh -i vm.key root@127.0.0.1 -t 'cd C/Users/kkrnt/Desktop; /bin/bash'"

(Cドライブを共有フォルダとしてホームディレクトリにシンボリックリンクしていて, 公開鍵でsshできることを前提としています)

これを応用するとこんな感じに出来ます

ここが参考になります
qiita.com


使ってみた感じだとWindowsでの作業にも支障はなく, とても快適です