Vagrant では、Vagrantbox.es というサイトで様々な Box が提供されていますが、そこで提供されている Box を取り込んで起動させてみると、ゲストマシンの時計が日本時間でなかったりコマンド結果の表記が英語であることに気が付きます。 本稿では Vagrantbox.es から取得した CentOS 6 を日本対応させる手順について解説したいと思います。
Boxの事前準備
今回は Vagrantbox.es で提供されている CentOS 6.5 x86_64 という名前の Box を利用して手順を説明していきます。 まずは vagrant box add {name} {url} コマンドで Box を追加し、vagrant init コマンドで初期化、vagrant up コマンドでゲストマシンを起動します。
$ vagrant box add centos65_x86_64 https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box
$ mkdir centOS65_x86_64
$ cd centOS65_x86_64
$ vagrant init centOS65_x86_64
$ vagrant up
起動が完了したら、ゲストマシンにログインして時計時刻を調べてみましょう。 日時が英語で表示され、時刻は日本時間ではないものが表示されると思います。
$ date
Sun Nov 2 16:34:53 UTC 2014
date コマンドの実行結果に UTC と表示されている通り、標準時のタイムゾーンで動いていることが分かりました。
タイムゾーンを変更する
それでは CentOS 6.5 の時刻のタイムゾーンを日本時間に変更しましょう。 CentOS 6 のタイムゾーンの設定は /etc/localtime です。 現在はこの /etc/localtime が標準時(UTC)の設定になっています。 タイムゾーンの設定はこの設定ファイルの中身を編集するのではなく、OS にもともと /usr/share/zoneinfo/Japan という日本のタイムゾーンの設定が記述されてある置き換えのためのファイルが存在する為、/etc/localtime を /usr/share/zoneinfo/Japan で上書きすれば良いです。
# cp /usr/share/zoneinfo/Japan /etc/localtime
また /etc/sysconfig/clock にシステムクロックの設定があります。 この設定が UTC になっていますので、日本の時刻 Asia/Tokyo に変更してあげます。
[修正前]
ZONE="Etc/UTC"
[修正後]
ZONE="Asia/Tokyo"
これでタイムゾーンの設定は完了です。 もう一度 date コマンドを実行してみましょう。 今度は日本時間が表示されるはずです。
$ date
Mon Nov 3 02:38:26 JST 2014
JST (Japan Standard Time : 日本標準時) と表示されたので、日本時間になったことがわかりました。
表記を日本語に変更する (locale の変更)
次にコマンドの結果が日本語で表示されるように設定をします。
Linux では locale という仕組みで様々な言語に対応を行っています。 locale では、言語・通貨単位などといった情報が設定されています。 現在 OS がどこの国の locale で動いているのかは、locale コマンドで調べることができます。
$ locale
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=ja_JP.UTF-8
LC_CTYPE="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_PAPER="ja_JP.UTF-8"
LC_NAME="ja_JP.UTF-8"
LC_ADDRESS="ja_JP.UTF-8"
LC_TELEPHONE="ja_JP.UTF-8"
LC_MEASUREMENT="ja_JP.UTF-8"
LC_IDENTIFICATION="ja_JP.UTF-8"
LC_ALL=
何やらエラーが出ています。 どうやら設定しようとしている locale が無いようです。 locale コマンドの -a オプションで、現在定義されている locale を確認することができます。
$ locale -a
locale: Cannot set LC_CTYPE to default locale: No such file or directory
locale: Cannot set LC_MESSAGES to default locale: No such file or directory
locale: Cannot set LC_COLLATE to default locale: No such file or directory
C
POSIX
en_US
en_US.iso88591
en_US.iso885915
en_US.utf8
3行のエラーの後に、インストールされている locale が一覧で表示されました。 設定しようとしている ja_JP.utf8 の locale が定義されていないことが分かりました。 ということで、locale を定義していきます。 locale の定義は localedef コマンドで行います。 -f オプションには文字コードを、-i オプションでは元となる locale を指定します。 CentOS 6 の場合は実は locale 自体は /usr/share/i18n/locales に既に様々なものがインストールされていて、今回利用するのは /usr/share/i18n/locales/ja_JP というファイルです。 ですので、このファイルを ja_JP.utf8 として定義してあげれば良いのです。
# localedef -f UTF-8 -i ja_JP ja_JP.utf8
もう一度 locale -a コマンドで現在の locale の定義状態を確認してみましょう。
# locale -a
C
en_US
en_US.iso88591
en_US.iso885915
en_US.utf8
ja_JP.utf8
POSIX
エラーがでなくなり、新しく定義した ja_JP.utf8 が追加されたことが確認できました。
最後に定義した ja_JP.utf8 を locale として設定します。 locale の設定は /etc/sysconfig/i18n ファイルです。
# vi /etc/sysconfig/i18n
[修正前]
LANG="en_US.UTF-8"
SYSFONT="latarcyrheb-sun16"
[修正後]
LANG="ja_JP.utf8"
SYSFONT="latarcyrheb-sun16"
修正後、ゲストマシーンを再起動してください。 再起動後、date コマンドを実行してみると locale の設定が反映された為、日本語で時間を表示してくれるようになりました。
$ date
2014年 11月 3日 月曜日 12:31:42 JST
おわりに
本稿では Vagrant で起動した CentOS 6 のタイムゾーンの変更と日本語化について解説しました。 アプリケーションのログの時刻が UTC で出力されてしまい困る場合に必要になる設定だと思います。 仕組みを理解すれば特に難しい設定ではないので、是非覚えておきたいですね。