Macに仮想OS入れてみたのでそのメモです。
友達がMacにbrewで色々入れて開発環境作ってたりするんですけど、redisとか入れてもPC用途じゃ使わないし、色んなものがごちゃごちゃ入ってきて訳分かんなくなるし。
さくっと丸ごと消したり手渡したりできる開発環境ってやつが、僕たちには必要なのです。
今回は無料のVirtualBoxでubuntu入れてみます。
VirtualBoxをインストールするところからはじまり、
仮想OSに「インターネットに繋がる動的なローカルIPアドレス」と「ホストOSからsshするための静的なIPアドレス」を振るところまで。
サーバそっくりの使い捨て環境で、がりがり開発しよう!
■ 聞かれたので追記 ■
仮想OSのeth0がLANのDCHPからIPアドレスもらう設定なので、同一の無線LANとかに繋げていると、他のPCやスマホからでもIP直打ちとかで仮想環境のウェブサイトが見れます。
Let’s 実機テスト!
目次
1. VirtualBoxのダウンロードとインストール
Oracleのホームページから”Mac OS X”用のVirtual Boxをダウンロード&インストールする。
2. 仮想OS作ってみる
VirtualBoxを起動して、左上の「作成」のとこからサクッと作成する。
Ubuntuの64bit版OSにRobinさんと名付けてみる。
メモリは1GBくらいにしてみる。
ハードドライブを作成する・・・にして。
ハードドライブのファイルタイプだとっ!?
色々あってよく分からない・・・。
ちょっと考え込んだが、長いので別エントリ参照。
VMDKにしました。
イメージファイルを可変サイズにするか固定サイズにするか聞かれる。
固定ファイルで10GBとかすると、こんな感じで10GBのイメージファイルができちゃう。
255GBのSSDなんで、ちょいきついですね・・・(多分)
(固定サイズで作ったときにできるファイル)
smokycat $ sudo /usr/libexec/locate.updatedb Password: smokycat $ locate Robin /Users/smokycat/VirtualBox VMs/Robin /Users/smokycat/VirtualBox VMs/Robin/Robin-flat.vmdk /Users/smokycat/VirtualBox VMs/Robin/Robin.vbox /Users/smokycat/VirtualBox VMs/Robin/Robin.vbox-prev /Users/smokycat/VirtualBox VMs/Robin/Robin.vmdk smokycat $ ls -lah /Users/smokycat/VirtualBox\ VMs/Robin total 20971560 drwxr-xr-x 6 smokycat staff 204B 7 20 18:57 . drwxr-xr-x 3 smokycat staff 102B 7 20 18:40 .. -rw------- 1 smokycat staff 10G 7 20 18:57 Robin-flat.vmdk -rw------- 1 smokycat staff 6.7K 7 20 18:57 Robin.vbox -rw------- 1 smokycat staff 6.5K 7 20 18:57 Robin.vbox-prev -rw------- 1 smokycat staff 466B 7 20 18:57 Robin.vmdk
ディスクイメージのファイルサイズは可変サイズにします。
これだと、50GBとかの仮想ディスク作っても、4MBだったりします。
(可変サイズで作ったときにできるファイル)
smokycat $ ls -lah /Users/smokycat/VirtualBox\ VMs/Robin total 7840 drwxr-xr-x 5 smokycat staff 170B 7 20 19:03 . drwxr-xr-x 3 smokycat staff 102B 7 20 19:01 .. -rw------- 1 smokycat staff 6.7K 7 20 19:03 Robin.vbox -rw------- 1 smokycat staff 6.5K 7 20 19:03 Robin.vbox-prev -rw------- 1 smokycat staff 3.8M 7 20 19:03 Robin.vmdk
というわけで、上限50GBとして可変サイズでディスクイメージを作ります。
可変サイズのハードドライブファイルは使用した分だけ(固定サイズを上限として)領域を消費しますが、スペースを解放しても自動的に縮小はしません。
とか書いてありますね・・・。
ファイルに書き込んで、 rm foobar とかしてファイル消しても、ディスクにはファイルの内容が丸々残ってたりします。
ホストOS側からだと、それが使ってる領域なのか使ってない領域なのか分からないから、デフラグのしようもない、っていうことかと解釈できる。
ゲストOS側でしかるべきデフラグを行い、うまいことやるとサイズが縮小したりするのかなーと、ちょっと気になるところです。
が、今回は「でかくなったら捨てよう」という心意気でいきます。ろくでなしのペットオーナーみたい。
だいたい設定済んだので、作成をポチる。
できた!Robinちゃんができたよ!起動だ!!
仮想OS起動すると、コンソールが立ち上がって、
仮想OSのウィンドウをクリックすると、マウスとかキーボードが自動的にキャプチャされるけど、hotkey押したらいつでも戻って来れるからね。
戻るためのホットキーはウィンドウの右下、[↓]ってアイコンの隣に書いてるよ。
今のhotkeyは左のCommandボタンだよ。
と出てくる。
親切ですなぁ。これ分からなくなったら確かに詰むよね。
さて、
FATAL: No bootable medium found! System halted.
と怒られたのであった。
3. UbuntuのインストールDISCの挿入
ディスクイメージ作るときに「ubuntu 64bit」って選択したが、選択したからといって勝手にubuntuがインストールされるわけでもないらしい。
ubuntuのサーバー版を入れるよ、僕は。
ubuntuのサイトからサーバー版 14.04 LTS のディスクイメージ(ubuntu-14.04-server-amd64.iso)をダウンロードしてくる。
インストーラディスク自体はしょっちゅう使うことになりそうなので、どこか分かりやすいところに置いておけばよさそう。
仮想OSへのDVDの挿入は、VirtualBoxの今作った仮想OSを選択して
- 設定 → ストレージ
コントローラー:IDEってところに、空のCDが入ってそうなアイコンがあるから、
- CDのアイコンを右クリック → 割当を除去
- コントローラー:IDEを右クリック → CD/DVDドライブを追加 → ディスクを選択 → さっき落としたisoファイル
とする。
これで起動すると、ubuntuのインストーラが立ち上がるが、それする前にまず、仮想OSのネットワークの設定をしなければならない。
4. ネットワークに繋ぐ
インストールディスクは挿入したものの、インストール途中にaptさんがネット上のリポジトリと通信する。
しかしこのままでは、仮想OSがネットと通信できない。
仮想ネットワークについてググったら色々出てくるけど、virtualbox.orgのマニュアルを普通に読んでみた。
以下、ざっと読んでみたメモ。
4.1. アダプタータイプ
- AMD PCNet FAST III : GRUBを含むほぼ全てのOSにサポートされてるので、デフォルトでこれを用いる。
- intel PRO/1000 系 : VistaなどはもはやPCNet用のドライバを持ってないので、そういうOS用にはこっちを使う。
- 準仮想化ネットワーク(virtio-net) : ゲストOS側に、仮想化環境でのネットワーキングのための特殊なドライバがあることを期待して、VirtualBoxはルータのシミュレートを行わないモード。Linuxカーネルはバージョン2.6.25以降、virt ioをサポートしている。
4.2. 割り当て
- 未割り当て : NICはあるけどLANケーブルが刺さっていない状態をゲストOSに通知する。これ使えば「LANケーブルが引っこ抜けた」という状況も再現できる。
- NAT : ゲストOSの中のファイル見たりメール読んだりしたいだけなら、NATで十分だから、これ以降読み飛ばしていいよ!と書いてある。
- NATネットワーク : なんかNATのネットワーク。NATとの違いが謎だが、深く読んでない。
- ブリッジアダプター : ホストOSのネットワークスタックを回避して、リアルNICを通して仮想OSが直接通信を行う。つまり、あたかも別のPCがルータに繋いでいるかのように振る舞う。
- 内部ネットワーク : 選択された仮想マシンからは見えるが、ホストOSのアプリケーションや他のPCからは見えないネットワークを作る。
- ホストオンリーアダプター : ホストOSと、仮想マシンの集合からなるネットワークを作る。このネットワークは、ホストマシンのリアルNICを使わない。その代わり、loopbackのような仮想インターフェースが作られ、仮想マシンとホストマシンを繋ぐ。
- 汎用ドライバー : UDPトンネルとかVDEとか難しいことしたいときに使う。
インストールの時点では、仮想OSがネットに繋がって欲しい。
ゆえに割り当ては「ブリッジアダプター」にして、アダプタータイプは「virtio-net」にしてみる。
Ubuntu12.04なんて、最近のLinuxだし、なにもしなくてもこれで繋がる。
ただしこれだと、仮想OSのIPアドレスがルータからDHCPで振られてしまうことになり、sshとかするときに不便。
仮想マシンは4つもNICを持っているという設定になっているので、静的なIPアドレスが欲しいときは、二番目のNICを、ホストオンリーアダプターなネットワークを繋いだ上で、手動でIPアドレスを設定すればよさそうに思う(後でやる)。
5. OSのインストール
あとは普通にubuntuをインストールする。
ホームディレクトリの暗号化はしない。sshでハマったことがあるから。
ディスクのパーティションも、特に何も考えず1パーティションでいってみる。
6. ホストオンリーネットワーク(仮想LAN)の設定
さて、OSもインストールし終わったことだし、仮想OSに静的IPアドレスを与えてみます。
以下のような感じでいきます。
- アダプター1(eth0)は、ブリッジアダプターを用いて、リアルマシンのNIC越しに外部と直接通信を行う。IPアドレスはDHCPで、ルータから自動的に割り振られる。
- アダプター2(eth1)は、ホストオンリーアダプターを用いて、仮想的なLANに接続する。ここに固定ローカルIPアドレスを使い、ホストOSからsshする際などに用いる。
ホストオンリーネットワークの作り方がややこしいが、
- メニューバー → VirtualBox → 環境設定
から作れる。
ホストオンリーネットワークを追加するボタンを押すと、「192.168.56.1」というIPアドレスでアダプターが作られる。
がしかし、たまたまスタバでドヤ顔しようとしたときに、DHCPが「192.168.56.x」というアドレスを振ってきたらどうなるのだろうか?という疑念がよぎらなくもない。
とりあえず、あんまり使われないであろう「10.255.0.1」とかで行ってみる。
ネットマスクは「255.255.255.0」で。
絶対に使われないであろうIPアドレスを使おうと、以下の二つを試したが、どっちもダメだったので断念。
- 127.1.*.*というアドレスをまず試してみたが、これはホストからゲストにpingを飛ばすときに怒られた。やはり自分自身にしか振ってはいけないアドレスのようだ。
- 次にクラスEのIPアドレス255.*.*.*を試してみたが、これはゲスト側でifconfigでアドレスを振ろうとしたときに怒られた。クラスEのアドレスは受理してくれないらしい。ケチンボである。
なお、ホストOSおよび仮想OSに静的なIPアドレスを割り振ることが目的なので、DHCPは切っておく。
これを作った瞬間に、ホストOSの方に新しいNICが認識される。
(ホストOSでの操作)
smokycat $ ifconfig vboxnet0 vboxnet0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 ether 0a:00:27:00:00:00 inet 10.255.0.1 netmask 0xffff0000 broadcast 10.255.0.255
これを仮想OSの設定→ネットワークから、アダプター2に刺した上で、仮想OSを起動する。
で、ifconfigでeth1(アダプター2)に10.255.0.2というIPアドレスを手動で振ってみる。
(ゲストOSでの操作)
smokycat@Robin:~$ ifconfig eth1 eth1 Link encap:Ethernet HWaddr 08:00:27:55:6d:6b BROADCAST MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) smokycat@Robin:~$ sudo ifconfig eth1 10.255.0.2 [sudo] password for smokycat: smokycat@Robin:~$ ifconfig eth1 eth1 Link encap:Ethernet HWaddr 08:00:27:55:6d:6b inet addr:10.255.0.2 Bcast:10.255.255.255 Mask:255.0.0.0 inet6 addr: fe80::a00:27ff:fe55:6d6b/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:4 errors:0 dropped:0 overruns:0 frame:0 TX packets:12 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:316 (316.0 B) TX bytes:964 (964.0 B)
その上で、ホストOSからpingを飛ばしてみると、通りました!
(ホストOS側での操作)
smokycat $ ping 10.255.0.2 PING 10.255.0.2 (10.255.0.2): 56 data bytes 64 bytes from 10.255.0.2: icmp_seq=0 ttl=64 time=0.493 ms 64 bytes from 10.255.0.2: icmp_seq=1 ttl=64 time=0.500 ms ^C --- 10.255.0.2 ping statistics --- 2 packets transmitted, 2 packets received, 0.0% packet loss round-trip min/avg/max/stddev = 0.493/0.496/0.500/0.003 ms
あとはゲストOS側で、静的IPアドレスの設定とか書き込んで、ネットワークについては完了。
(ゲストOS側での操作)
smokycat@Robin:/etc/network$ sudo vim /etc/network/interfaces
# This file describes the network interfaces available on your system # and how to activate them. For more information, see interfaces(5). # The loopback network interface auto lo iface lo inet loopback # The primary network interface auto eth0 iface eth0 inet dhcp # vboxnet0 auto eth1 iface eth1 inet static address 10.255.0.2 netmask 255.255.255.0
7. コンソール無しで仮想OSを立ち上げる
仮想OSを起動するたびにコンソールが立ち上がってめんどうだなーと思ってました。
コンソール無しで起動だけする方法について調べたんですが、VirtualBox Maniaによると
実はVirtualBoxマネージャーからも「Shiftキー」を押しながら起動アイコンをクリックすることで、Headlessで起動させることができます。
とのことで、これで解決。
以上で、内なるubuntuが手に入りました。
これでmacにredisとか入れずに開発できます。