目標
VirtualBox上OSで作業するとき、ホストOSとの画面の切り替えがめんどくさかったり、ゲストOS内でブラウザの処理が遅かったり、言語などのOS設定のカスタマイズが必要だったり、案外手間が多い。そこで、VirtualBoxからはバックグラウンドでOSを立ち上げ、puttyなどでゲストOSに接続する方法を紹介する。その際、ゲストOSがインターネット接続可能な設定を行う。また、最後に、ゲストOSを jupyter notebook のサーバとして動作させる例を挙げる。
設定の概略
ホストOS-ゲストOS間に二つのネットワーク設定を構築する.一つは,ホストOSからゲストOSにssh接続する用のネットワーク "Host-Only Adapter" ,もう一つは,ゲストOSからインターネットに接続するためのネットワーク "NAT" である.本ブログではこれらの設定の仕方を解説する.
実行環境
- ホストOS: Windows 10
- ゲストOS: Ubuntu18
- VirtualBox version 5.2.7
※ 今回はUbuntで設定しましたが,Linux系OS であればほぼ同様の操作で同じことができるはずです.
VirtualBox上の設定
(i) まず,VirtualBoxマネージャーの画面から,「ファイル」->「環境設定」->「ネットワーク」とたどり,"ホストオンリーネットワーク" のタブを開き,既に存在する "VirtualBox Host-only Ethernet Adapter" を右クリックし,「ホストオンリーネットワークを編集」を選択する.もし,存在しない場合は,右のアイコンから新しく作っておく.
(追記)新しい Virtual Box のバージョンでは,マネージャーを立ち上げて,右上のグローバルツールからホストネットワークマネージャーを開く.
次の二つの操作を行う.
- 「アダプター」タブの "IPv4" のアドレスをメモしておく.また, "IPv4 ネットマスク" が "255.255.255.0" になっていることを確認する.
- 「DHCPサーバ」タブを開き,「サーバーを有効化」のチェックを外す.これはゲストOSのネットワーク設定を手動で設定するときに,DHCPで設定されたIPアドレスと被ることを防止するために一応設定しておく.
(ii) 次に,VirtualBox でゲストOSのネットワーク設定を開く.Adapter 1のタブを開き,"NAT"にする.
(iii) 次に,Adapter 2のタブを開き, "ホストオンリーアダプター" に設定する。"高度" の項目は特に変更を加えていない。
ゲストOS上の設定
まずは,VirtualBox上で設定した二つのネットワークにつながっているゲストOS上のネットワークアダプタの名前を知る必要がある.
$ ip a
コマンドでネットワークデバイスの情報を確認する.
"enp0sx" のようなアダプタが二つあり,番号の若いほうが "NAT" で,大きいほうが"ホストオンリーアダプタ"と思ってよい.次は "ホストオンリーアダプタ" である "enp0s8" の設定を変更する.
今回は設定を変更する方法を三つ紹介する.どれかひとつをやればよい.
- GUI を使ってサクッと変更する.
- Ubuntu のバージョン16 以下の設定方法(/etc/network/interfaces)
- Ubuntu のバージョン17 以上の設定方法(/etc/systemd/network/nep0s8.network)
CentOSでは "/etc/sysconfig/network-scripts/ifcfg-enp0s8" を編集する方法があるらしい.
1: GUI でホストオンリーネットワーク設定
Ubuntu の場合,右上のメニューからネットワークインターフェース (この例ではenp0s8)を選択して,Address を変更する.Gateway は空で,DNS はホストネットワークマネージャーで見たアドレスにする.
設定を反映するためネットワークを再起動する.
$ sudo service networking restart # centOS の場合はsystemctl restart network.service
ip a
でネットワーク設定を確認してみて,まだ変わってない場合はシステムごと再起動する.
2: GUI 使わないでUbuntu 16 以上の設定
"/etc/network/interfaces" を次のように変更する.
ここでポイントとなるのは,
- address に設定したい IP アドレスを指定すること
- dns-nameservers にホストネットワークマネージャーでみたアドレスを設定すること
- gateway はあえて設定しない.デフォルトゲートウェイは NAT のenp0s3 の方を使いたいから.
- 他は適切に設定する
設定を反映するためネットワークを再起動する.
$ sudo service networking restart # centOS の場合はsystemctl restart network.service
ip a
でネットワーク設定を確認してみて,まだ変わってない場合はシステムごと再起動する.
3: GUI 使わないでUbuntu 17 以上の設定
"/etc/systemd/network/enp0s8.network" というファイルを作り,次のように記入する.
[Match]
enp0s8
[Network]
Address=192.168.151.100
DNS=192.168.151.1
設定を反映するためネットワークを再起動する.
$ sudo service networking restart # centOS の場合はsystemctl restart network.service
ip a
でネットワーク設定を確認してみて,まだ変わってない場合はシステムごと再起動する.
ネットワークが正しく設定できているか確認
最後にネットワークの設定を確認してみる.route
コマンドで,デフォルトゲートウェイが "NAT" ネットワークに接続している "eth03"のみになっていることを確認する.もしデフォルトゲートウェイが二つ以上ある場合,(特にeth08に設定されている場合)間違ったルーティングでパケットを送信してしまうため,インターネット接続が確立できない場合がある.
インターネット接続を試してみる.
ping google.com
等で接続を試す.ネットワークがつながってない場合,NAT 側のルーティングに問題があることが考えられる.
ssh 接続できるか試してみる.
Tera Term などの ssh アプリケーションでログインを試してみる.
ログイン先は,ネットワーク設定で変更したアドレスで,上の例では 192.168.151.100 に当たる.
もしもssh接続できない場合
- openssh-serverをインストールしてあるか確認する。
- SELinuxを無効にし,ファイアウォールの設定を無効にしてあるか確認する.下の「鍵認証で"refused"される場合」を参照
- ゲストOSのsshの認証設定(鍵認証orパスワード認証)が認識とあっているか確認する.
おまけ:鍵認証で"refused"される場合
puttyで鍵認証ログインするとき、正しく公開鍵を設定したにもかかわらず拒否される場合がある。getenforce
コマンドでEnforcing
となっている場合、SELinuxが原因となっている可能性がある。setenforce 0
コマンドでSELinuxを一時的に無効にしたり、
# vi /etc/selinux/config
SELINUX=disabled
で永続的に無効にしたりすると治る。
(参考:https://eng-entrance.com/linux-selinux、http://next49.hatenadiary.jp/entry/20140620/p1)
おまけ:ゲストOSをバックグラウンドで立ち上げる方法
ゲストOSはssh経由で操作するため、ゲストOSの画面は使わない。画面を起動するだけむだにグラフィック処理が走る。そこで、VirtualBoxでゲストOSの画面を立ち上げずにバックグラウンドでゲストOSを起動する。
「起動」の脇のメニューから、「ヘッドレス起動」を選択することで、バックグラウンドでOSを立ち上げることができる。
おまけ:Jupyter notebook を使う例
ゲストOSでjupyter notebook のサーバを立ち上げて、ホストOSのウェブブラウザから表示することができる。
まず、ゲストOS上で、8888ポートからの接続を受け付けるようにFireWallの設定を変更する必要がある。
$ sudo firewall-cmd --add-port=8888/tcp --zone=public --permanent
success
$ sudo firewall-cmd --reload
success
また,SELinuxをオフにすれば,FireWallもオフのままになるはず.基本的にオフっておけ.
ゲストOSでjupyter サーバを立ち上げる。
jupyter notebook --ip=[IP Address] --no-browser
すると、ホストOSから、http://[IP Address]:8888で接続できる。