Translated message

A translation of this page exists in English.

Warning message

This translation is outdated. For the most up-to-date information, please refer to the English version.

RHEL7 のシステムロケールを変更する

Solution Verified - Updated -

Environment

  • Red Hat Enterprise Linux (RHEL) 7

Issue

  • システムワイド (または特定ユーザ) において、ローカルログインに対してロケールを変更するには
  • ssh ログインに対してロケールを変更するには
  • ssh クライアントのロケールが、ssh セッションに影響しないようにするには

Resolution

このナレッジでは、ローカルログインと ssh ログインに対して、システムロケールを変更するための手順を説明しています。

1) ローカルログインのために、システムロケールと、ユーザロケールを設定する方法
2) ssh ログインのためにユーザロケールを設定する方法
3) 上述のステップでの変更が正しいかを確認する方法

ログイン時に指定されるロケールを設定するには、異なる設定ファイルの知識が必要になります。変更が必要な内容は、ビジネス要件や最終的な結果として何を達成したいかということに依存します。したがって、達成したい最終的な結果が何であるかということを明確に定義することを最初に行うことが推奨します。このナレッジを読み、理解するまで、すべての構成変更を行わないことが推奨されます。

ローカルログインのために、システムロケールと、ユーザロケールを設定する方法

  • 技術的背景
    インタラクティブシェルが開かれると、/etc/profile.d ディレクトリ配下のスクリプトが実行されます。/etc/profile.d/lang.sh というスクリプトは、LANG ならびに他のロケール変数を以下に示すように設定します。

    # cat /etc/profile.d/lang.sh 
    # /etc/profile.d/lang.sh - set i18n stuff
    
    sourced=0
    
    if [ -n "$LANG" ]; then
        saved_lang="$LANG"
        [ -f "$HOME/.i18n" ] && ."$HOME/.i18n" && sourced=1
        LANG="$saved_lang"
        unset saved_lang
    else
        for langfile in /etc/locale.conf "$HOME/.i18n" ; do
            [ -f $langfile ] && .$langfile && sourced=1
        done
    fi
    

LANG が設定されている場合は、この変数のコピーが保存され、ユーザのホームディレクトリ配下の .i18n が呼び出されます。ただし、LANG の設定は保存されている値に戻されます。これにより、LANG が既に設定されている場合には、ホームディレクトリに存在する .i18n ファイルで LANG の値を変更することができません。一方、LC_ALL の値は LANG 環境変数よりも優先されるため、LC_ALL を設定する事は可能です (http://pubs.opengroup.org/onlinepubs/7908799/xbd/envvar.html を参照)。同様に、他の LC_* 環境変数も LANG 変数より優先されます。ただし、LC_ALL がその他すべての LC_* 環境変数よりも優先されます。

したがって、LANG の値が設定されていない場合や NULL 値である場合、/etc/locale.conf と、ユーザーのホームディレクトリの .i18n は、これらのファイルが存在する場合には (先に記載した順序で) 呼び出されます。これは、ユーザの .i18n ファイルが存在している場合に、システムワイドの設定ファイル (/etc/locale.conf) で設定される値を上書きすることを意味しています。

  • システムワイドレベルでロケールを設定するには、/etc/locale.conf を編集する必要があります。
  • ユーザ単位でロケールを設定するには、$HOME/.i18n を編集する必要があります。

注意: これらの設定は次回のログイン時に有効になるため、/etc/profile.d/lang.sh が実行される前に LANG が既に設定されている場合は、標準の RHEL のログインスクリプトでは変更することができません。次のセクションで議論している非ローカルアクセス (ssh) においては、このことを理解していることが重要となります。

ssh セッションに対してロケールを設定する方法

  • 技術的背景
    デフォルトでは、RHEL7 システムは、ssh クライアントからロケール環境変数を受け入れるようになっています。以下のロケール環境変数を ssh クライアントが渡している場合には、ログインスクリプトが実行されるよりも前に設定されます。

    # Accept locale-related environment variables
    AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
    AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
    AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
    

    上記は、sshd_config の内容です。LANG は渡される環境変数の 1 つで、ログインプロセスの中で変更されないものです。理由については、前述の「ローカルログインのために、システムロケールと、ユーザロケールを設定する方法」 を参照してください。
    たとえば、コンソールを例として、直接 RHEL7 サーバへログインする場合の LANG の値は次のように設定されます (これは参考の値であり、実際のシステムによって異なります)。

    $ env |grep -e LANG -e LC
    LANG=en_US.UTF-8
    

    別のロケールへ変更するために、LANG を変更します (変数は、必ず export されている必要があります)。そして、ssh クライアントを利用してこのシステムへ接続します。

    $ export LANG=ja_JP.UTF-8
    $ ssh localhost
    user@localhost's password:
    ...
    $ echo $LANG
    ja_JP.UTF-8
    

    クライアントから渡された LANG の値が維持されます。したがって、ユーザの .i18n ファイル、/etc/locale.conf (この例では、en_US.UTF-8) に基づいて設定されていません。これは期待される動作となります。

  • もし、上述のデフォルトの挙動が見られず、ssh クライアントからのロケールを利用する必要がある場合には、以下を実行する必要があります。

    1. サーバー側の sshd_config ファイルの AcceptEnv に LANG が記載されていることを確認します。
      注意: sshd_config 値を変更した場合には、その変更を有効にするために sshd サービスを再起動する必要があります。

      デフォルトの設定は以下になります。

      # Accept locale-related environment variables
      AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
      AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
      AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
      
    2. ssh コマンドを実行する前に、クライアント側で LANG 環境変数をエクスポートします。

      export LANG=ja_JP.UTF-8
      
    3. ssh を利用して、クライアントサーバからサーバへ接続します。
      注意: ここでは、ロケール環境変数を変更するために、ログイン時に実行される全てのスクリプトを編集してないことを前提としています。
  • サーバ上で、ssh セッションに対して特定の初期ロケールを強制したい場合には、以下に示す内容のいずれかを用いて、設定を変更する必要があります。

    1. ssh クライアントから渡される LANG 変数 (ここでは LANG が利用されていますが、全てのロケール変数に適用される内容です) を sshd が設定することを防ぐために、設定する LANG そして他のロケール変数をサーバの sshd_config 内の AcceptEnv オプションから削除します。
    2. 異なるロケール環境変数をユーザに利用させることを強制するために、/etc/profile.d/ 配下に新しいスクリプトを作成します。/etc/profile が /etc/profile.d 配下のスクリプトを探す方法の実装により、作成するスクリプトは、lang.sh よりもアルファベット順で低位に位置している必要があります。たとえば unset_lang.sh という名前にすると、lang.sh よりも後に呼ばれるようになります。
      注意: /etc/profile.d/lang.sh は設定ファイルではありません。つまり、/etc/profile.d/lang.sh を提供する frpm がインストールされた場合には、行なった変更が上書きされます。したがって、/etc/profile.d/lang.sh を編集することは推奨されません。
      重要: /etc/profile.d の中にスクリプトを追加する場合は、 念の為、デバッグのために以下のいずれかの方法を実施することが推奨されます。
      1. システムへログインできないというような問題に対処するため、念の為、アクティブな root セッション (コンソールを利用することが推奨されます) を開きます。このセッションによって、追加した新しいスクリプトを削除することができます。
      2. プロダクションシテムへ適用する前に、テスト環境でその変更をテストします。
        注意: /etc/profile は、/etc/profile.d 内のスクリプトを呼び出します。しかし、/etc/profile.d 配下のスクリプトで exit を利用しないようにしてください。exit を利用すると、追加したスクリプトが、呼び出したスクリプト (/etc/profile) を終了させることになります。

ロケールの変更を確認する方法

  1. 現在のセッションをログアウトします。ロケールはログイン時に設定されますので、いかなる変更も次回のログイン時に反映されます。
  2. ロケールコマンドを利用して、変更を確認します。

    # locale
    

    または

    env |grep -e LANG -e LC_
    
  3. ロケールが期待しているものと異なった場合には、上述の手順にきちんと従っているかどうか確認してください。このナレッジでは、ユーザの .bash_profile、.bash_login、.profile .bashrc といったファイルには、ロケール環境変数を変更するための変更を加えていないことを前提としています。

追加情報

  • サーバを再起動する必要はありません。ログアウトし再度ログインすることで、ロケールの変更を有効にすることができます。
  • 以前の RHEL のバージョンに対する情報は、 How to change the system locale in RHEL? を参照してください。
  • putty といったターミナルエミュレーターを利用してサーバに接続している時には、そのターミナルエミュレーターが ssh セッションを開いたときに渡すことのできる環境変数を定義できます。環境変数を渡すことで、ログインセッションのロケールを上書きすることができます。putty やその他のターミナルエミュレータを利用してシステムへ直接アクセスしており、環境変数がターミナルエミュレータによって提供されている場合には、環境変数の変更または削除について、ターミナルエミュレーターのドキュメントを参照してください。

Root Cause

  • 複数の設定ファイルと、システムへのアクセス方法が、ユーザーのロケールに影響を与えます。
  • グローバルなロケール設定ファイルは、以前の RHEL バージョン (/etc/sysconfig/i18n) から RHEL7 の /etc/locale.conf へ変更されました。
  • デフォルトでは、ssh セッションは、ssh コマンドを実行したクライアントからロケール環境変数を受け取ります。これは、サーバ側の設定内容を上書きできます。

This solution is part of Red Hat’s fast-track publication program, providing a huge library of solutions that Red Hat engineers have created while supporting our customers. To give you the knowledge you need the instant it becomes available, these articles may be presented in a raw and unedited form.

Comments