読者です 読者をやめる 読者になる 読者になる

light log

学んだこととか

Linux(CentOS)でlocaleのエラーが出た

出たので調べた。

環境

OS X 上の Vagrant/VirtualBox 上の CentOS

$ cat /etc/redhat-release 
CentOS release 6.5 (Final)
$ arch
x86_64
$ uname -a
Linux vagrant-centos65.vagrantup.com 2.6.32-431.3.1.el6.x86_64 #1 SMP Fri Jan 3 21:39:27 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

参考:CentOSのバージョン確認コマンドとアーキテクチャ確認コマンド | mawatari.jp

事象

yumコマンドとか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のLC_*に設定されているja_JP.UTF-8がシステムに無い。

Macではデフォルトでssh時にMac上のLC_*の設定を接続先に送るようになってる(/etc/ssh_config内のSendEnv LANG LC_*)ため、Mac上でja_JP.UTF-8になってると上記のようになる。

参考:Mac から Ubuntu に ssh ログインするとなんかロケール云々で怒られるやつ - 休刊 ボルシチは食べ物です。

対策

以下で解決した。

$ sudo yum update glibc-common

参考:開発機の仮想マシンで locale が怒られる - @Konboi memo

上のエラー文字列で調べるといろいろヒットして、

  • Macssh_configの内容をいじってLC_*を送信しないようにする
  • CentOS上のLC_ALLに"C"や"en_US.UTF-8"を設定する($ export LC_ALL="C")

とかいくつか解決法が見つかって、確かにこれらでも解決する(下だけ試した)んだけど、なんとなく本来的な解決法じゃないような気がした。(好みの問題かもしれない)

で、どうしよっかなーと思ってたら上のglibc-commonをアップデートしたらいいというページを見つけたのでこれだ!って思った。

要は最初からsudo yum update -yしとけばよかったんだな。

そもそもlocaleって?

ちゃんと調べたことなかったので、この際に調べてみた。

ロケールとは、ソフトウェアに内蔵される、言語や国・地域ごとに異なる単位、記号、日付、通貨などの表記規則の集合。または単に、利用する言語や国・地域の指定。多くのソフトウェアやプログラミング言語は、使用する言語とともにロケールを設定し、ロケールで定められた方式に基づいてデータの表記や処理を行う。

ロケール - IT用語辞典 e-Words

LC_ALLを設定するとLC_CTYPEなどの個別の設定を全部上書きする。LC_ALLも個別のLC_CTYPEなども設定されていない場合、LANGの値が使用される。

LC_CTYPEとかLC_NUMERICとかのそれぞれ意味は以下のリンクを参照。

Linux Hacks:環境変数によるロケールの管理 (1/2) - ITmedia エンタープライズ

ロケール名は以下の形式になる。

language(_territory)(.encoding)(@modifier)

ja_JP.UTF-8だと、languageがja、territoryがJP、encodingがUTF-8になる。@modifierが何かとかは上のリンク参考。

"C"ロケールは、

Cロケールとしてもよく知られているPOSIXロケールは、伝統的なUNIX環境を設定するもので、ASCIIエンコーディングPOSIX文字クラス、米国英語の日時、数、通貨の書式を用いる。

とのこと。

localeコマンドの簡単な使い方は以下の通り。

ほか

今回自分はやらなかったけど、manの内容とかも日本語化したければ以下のページが参考になりそう。

VagrantのCentOSを日本語化してみる - yk5656 diary

Linuxシステム[実践]入門 (Software Design plus)

Linuxシステム[実践]入門 (Software Design plus)

新Linux/UNIX入門 第3版 (林晴比古実用マスターシリーズ)

新Linux/UNIX入門 第3版 (林晴比古実用マスターシリーズ)