Vagrant と VirtualBox で CentOS 環境をサクッと作る

以前、Windows に VirtualBox をインストールして、Fedora 環境を作ったことがあった。

今回は VirtualBox を簡単に扱えるようにしてくれる Vagrant (ベイグラント) というツールを使って、より簡単に Windows 上に Linux 環境を構築してみようと思う (Vagrant は VirtualBox 専用ではないが、VirtualBox を組み合わせて使用するのがデフォルトになっている)。

環境は Windows10 64bit。導入する Linux ディストリビューションは、Red Hat Enterprise Linux のオープンソース版として広く使われている CentOS を導入してみようと思う。

目次

VirtualBox のインストール

上のサイトから「VirtualBox binaries」の「Windows hosts」をダウンロードし、インストールする。執筆時のバージョンは VirtualBox 5.1.18。

オプションは特に変更せず次へ次へで進めていく。

Vagrant のインストール

上のサイトから「Windows Universal (32 and 64-bit)」をダウンロードし、インストールする。執筆時のバージョンは Vagrant 1.9.3。

こちらもオプションは特に変更せず次へ次へで進めていく。

Vagrant Init で Vagrant を初期化する

ここからは GitBash For Windows のコンソールで作業する。コマンドプロンプトでも良いと思うが、GitBash を使うと色々楽なので…。

まず適当な場所に Vagrant 用のディレクトリを作る。

$ mkdir MyCentOS
$ cd !$

!$ は直前に実行したコマンドの引数を使えるというもの。

そしたら、以下のコマンドで Vagrant の初期化を行う。

$ vagrant init bento/centos-7.2

vagrant init の後ろの bento/centos-7.2 部分は、使用する Vagrant Box の名前。これは、Vagrant を提供する HashiCorp 社が同じく提供する、Atlas というサービスに登録されている Vagrant Box の名前を指定する。

ユーザ名/Vagrant Box 名 という規則になっており、bento は Chef 社がメンテナンスするオーガナイゼーション (ユーザ名)。Chef 社は「Chef」という構成管理ツールを展開している、信頼できる配布元といえる。

そのユーザが提供している、centos-7.2 という Vagrant Box を指定して、コレを使いますよと宣言しているワケである。

先ほどのリンク先が、Atlas の Vagrant Box を検索できるサイト。Bento が配布する CentOS だけでなく、別のユーザがカスタマイズした CentOS だったり、Ubuntu など他のディストリビューションも選べる。ある程度の雛形が最初から出来上がっていて、それを選んで使えるというワケだ。

今回選択した bento/centos-7.2 は、以下の URL で詳細が確認できる。インストールコマンドがまさに上述のとおりであることが分かるだろう。

Vagrantfile を書き換える

vagrant init すると、MyCentOS フォルダ内に Vagrantfile というファイルができている。これが Vagrant の設定ファイルになるのだが、いくつか書き換えておく。

  # Create a private network, which allows host-only access to the machine
  # using a specific IP.
  # config.vm.network "private_network", ip: "192.168.33.10"

上の行の「config.vm.network」の行のコメントアウトを外しておく。

  # Create a private network, which allows host-only access to the machine
  # using a specific IP.
  config.vm.network "private_network", ip: "192.168.33.10"

次に、以下を直しておくと、Vagrant 環境とホスト環境 (Windows 側) とでファイルを共有できるようになる。

  # Share an additional folder to the guest VM. The first argument is
  # the path on the host to the actual folder. The second argument is
  # the path on the guest to mount the folder. And the optional third
  # argument is a set of non-required options.
  # config.vm.synced_folder "../data", "/vagrant_data"

この部分の最終行のコメントアウトを外し、以下のように直してやる。

  # Share an additional folder to the guest VM. The first argument is
  # the path on the host to the actual folder. The second argument is
  # the path on the guest to mount the folder. And the optional third
  # argument is a set of non-required options.
  config.vm.synced_folder "./vagrant", "/vagrant"

そして、Vagrantfile があるディレクトリに vagrant フォルダを作っておく。

これで、vagrant フォルダ内が、Vagrant 環境では /vagrant/ でアクセスできるようになる。手軽に Windows 側と CentOS 側とでファイルが共有できるようになるわけだ。この設定は任意でディレクトリごとに複数指定したりもできる。

Vagrant Up で Vagrant 仮想環境を立ち上げる

Vagrantfile を書き換えたら、ターミナルで以下のコマンドを叩き、Vagrant Box を起動する。

$ vagrant up

最初に以下のようなエラーが出るかもしれないが、もう一度 vagrant up すると解消した。

$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Box 'bento/centos-7.2' could not be found. Attempting to find and install...
    default: Box Provider: virtualbox
    default: Box Version: >= 0
==> default: Loading metadata for box 'bento/centos-7.2'
    default: URL: https://atlas.hashicorp.com/bento/centos-7.2
==> default: Adding box 'bento/centos-7.2' (v2.3.1) for provider: virtualbox
    default: Downloading: https://atlas.hashicorp.com/bento/boxes/centos-7.2/versions/2.3.1/providers/virtualbox.box
    default: Progress: 100% (Rate: 4129k/s, Estimated time remaining: --:--:--)
==> default: Successfully added box 'bento/centos-7.2' (v2.3.1) for 'virtualbox'!
==> default: Importing base box 'bento/centos-7.2'...
==> default: Matching MAC address for NAT networking...
==> default: Checking if box 'bento/centos-7.2' is up to date...
==> default: Setting the name of the VM: MyCentOS_default_1492313509410_19491
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
    default: Adapter 2: hostonly
==> default: Forwarding ports...
    default: 22 (guest) => 2222 (host) (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: vagrant
    default: SSH auth method: private key
    default: Warning: Remote connection disconnect. Retrying...
    default: Warning: Remote connection disconnect. Retrying...
The guest machine entered an invalid state while waiting for it
to boot. Valid states are 'starting, running'. The machine is in the
'unknown' state. Please verify everything is configured
properly and try again.

If the provider you're using has a GUI that comes with it,
it is often helpful to open that and watch the machine, since the
GUI often has more helpful error messages than Vagrant can retrieve.
For example, if you're using VirtualBox, run `vagrant up` while the
VirtualBox GUI is open.

The primary issue for this error is that the provider you're using
is not properly configured. This is very rarely a Vagrant issue.

# もう一回叩くとうまく起動した
$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Checking if box 'bento/centos-7.2' is up to date...

Vagrant の起動でコケるのは色々と理由があって、根本の問題としては BIOS の設定で「仮想環境支援機能」を有効にしていない場合がある。これは有効にしておかないといけないものなので、BIOS 設定を変更しておく。

その他、バージョンごとにバグがあったりなんだりするので、VirtualBox・Vagrant を再インストールしたり再起動したりして試行錯誤が必要かもしれない。

自分の場合は、「初回の vagrant up はエラーが出る」だけで、以降の vagrant up ではスムーズに起動している。

Vagrant Box が正しく起動しているか確認するには、vagrant status を使う。

$ vagrant status
Current machine states:

default                   running (virtualbox)

The VM is running. To stop this VM, you can run `vagrant halt` to
shut it down forcefully, or you can run `vagrant suspend` to simply
suspend the virtual machine. In either case, to restart it again,
simply run `vagrant up`.

running になっているので正常に起動している。

CentOS 環境にログインしてみる

vagrant up が上手く行ったら、既に仮想環境は起動しているので、CentOS 環境にログイン (SSH 接続) してみる。

ターミナルで vagrant ssh と打つと、サクッと CentOS 環境にログインできる。デフォルトのユーザは vagrant で、パスワードも vagrantsudo とかもそのままできる。

$ vagrant ssh
[vagrant@localhost ~]$

# コンソールが上のようになったら OK

これで Linux 環境が出来上がった。

Linux 環境構築

初めにパッケージを更新しておく

# アップデートできるパッケージの確認
$ sudo yum check-update
# システム全体のアップグレード
$ sudo yum upgrade

日本語環境を整える

# 日本語関連パッケージを入れる
$ sudo yum -y install ibus-kkc vlgothic-*

# システムの文字セットを変更する
$ localectl set-locale LANG=ja_JP.UTF-8
# パスワードを聞かれたら vagrant と入れる
$ source /etc/locale.conf

これで、システムが使う言語が日本語になる。

# 反映されていることを確認
[vagrant@localhost vagrant]$ echo $LANG
ja_JP.UTF-8

# 日本語で表示される
[vagrant@localhost vagrant]$ sl
-bash: sl: コマンドが見つかりません

タイムゾーンを直す

このままだとタイムゾーンがズレているので直す。

# タイムゾーンがズレている
[vagrant@localhost vagrant]$ date
2017416日 日曜日 04:34:18 UTC

# 以下で直る
$ sudo cp /usr/share/zoneinfo/Japan /etc/localtime

# 直った
[vagrant@localhost vagrant]$ date
2017416日 日曜日 13:35:17 JST

Man Pages を日本語化する

# man の日本語化。全部が日本語になるわけじゃなさそう
$ sudo yum install -y man-pages-ja

Vim を入れる

# 最初は Vim がないので入れる。Vimtutor もこれで入る
$ sudo yum install -y vim-enhanced

その他コマンド

以上

これでひとまずは遊んで使える CentOS 環境が作れただろう。