localectlコマンドでLinuxのロケールとキーボードを設定する方法|文字化け対策と環境統一も

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxtips, Linuxサーバー構築(Rocky Linux/RHEL9) > localectlコマンドでLinuxのロケールとキーボードを設定する方法|文字化け対策と環境統一も
「サーバーにSSHで入ったら日本語が文字化けする」「チームメンバーの環境によってロケールがバラバラで、スクリプトが動かない」——こんな悩みを現場でよく聞きます。
原因の多くは、Linuxのロケール設定が適切に行われていないことです。

この記事では、systemdのロケール管理コマンド localectl の実践的な使い方を解説します。確認から変更・キーボードレイアウト設定・文字化けの原因特定まで、Rocky Linux / RHEL 9.4 / Ubuntu 24.04 LTS で動作確認した手順をそのままお伝えします。

この記事のポイント

・localectl status でロケールとキーボードの現在値を一括確認できる
・localectl set-locale LANG=ja_JP.UTF-8 でロケールを永続的に変更できる
・文字化けの原因はLC_ALL・LANG・LANGUAGE変数の優先順位にある
・チームの環境統一には /etc/locale.conf を直接配布する方法が確実


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

localectlとは何か:なぜ/etc/locale.confだけでは足りないのか

Linuxのロケール設定は、昔は /etc/locale.conf/etc/sysconfig/i18n を直接編集するのが主流でした。しかし systemd が標準になった RHEL 7 以降は、localectl コマンドを使うのが正しいやり方です。

理由は2つあります。

localectl は設定を適用するだけでなく、systemd-localed サービスを通じて反映状態を管理するため、再起動なしに設定が有効になります
キーボードレイアウトの設定(コンソールとX11の両方)も一元管理できるため、設定の抜け漏れが防げます

現場でよく見かける失敗は、/etc/locale.conf を手動で書き換えたのに「コンソールでの入力だけ変わらない」というパターンです。localectl を使えばこういった事故を避けられます。

現在のロケールとキーボード設定を確認する

1. localectl status で全体確認

引数なしで実行すると、ロケール・コンソールキーボード・X11キーボードの3つが一覧で確認できます。

# localectl status

以下は Rocky Linux 9.4 での実際の出力例です。

System Locale: LANG=ja_JP.UTF-8 VC Keymap: jp106 X11 Layout: jp X11 Model: jp106

System Locale:システム全体のデフォルトロケール(/etc/locale.conf に保存される)
VC Keymap:仮想コンソール(tty)のキーボードマップ
X11 Layout:デスクトップ環境のキーボードレイアウト

2. 利用可能なロケール一覧を確認する

設定前に、システムにインストールされているロケールを確認しておきましょう。

# localectl list-locales | grep ja ja_JP.EUC-JP ja_JP.UTF-8

ja_JP.UTF-8 が表示されない場合は、ロケールパッケージが未インストールです。後述のインストール手順を参照してください。

3. 利用可能なコンソールキーマップ一覧を確認する

# localectl list-keymaps | grep jp jp106

ロケールを変更する

1. 日本語UTF-8に変更する(最も使われるケース)

# localectl set-locale LANG=ja_JP.UTF-8

このコマンドを実行すると、/etc/locale.conf が自動的に書き換えられます。

# cat /etc/locale.conf LANG=ja_JP.UTF-8

重要:ログインしている現在のセッションには即座に反映されません。新しいセッション(SSH再接続)または再起動後から有効になります。

2. 英語環境に変更する(スクリプト実行用途)

cronやシェルスクリプトで英語のエラーメッセージを期待している場合、LANG=C(またはLANG=en_US.UTF-8)に統一するケースがあります。

# localectl set-locale LANG=C.UTF-8

現場では「ログは英語で出力させてgrepしやすくしたい」という要件でよく使います。

3. 複数のロケール変数を同時に設定する

ロケールは LANG だけでなく、LC_ALL・LC_TIME・LC_MESSAGES なども個別に制御できます。

# localectl set-locale LANG=ja_JP.UTF-8 LC_MESSAGES=C

これで「UIは日本語、システムメッセージ(ログ)は英語」という構成が作れます。スクリプト保守と運用の両立を求める現場でよく採用される設定です。

キーボードレイアウトを変更する

1. コンソールのキーボードマップを設定する

日本語キーボード(106/109キー)を使う場合の設定です。

# localectl set-keymap jp106

2. X11のキーボードレイアウトを設定する

GUIデスクトップ環境を使っている場合は、X11レイアウトも別途設定が必要です。

# localectl set-x11-keymap jp

--no-convert:コンソールマップとX11レイアウトを連動させたくない場合に指定します

# localectl set-keymap jp106 --no-convert

ロケールパッケージが未インストールな場合の対処

localectl list-locales で ja_JP.UTF-8 が表示されない場合、glibc-langpack-ja をインストールします。

1. Rocky Linux / RHEL / AlmaLinux の場合

# dnf install -y glibc-langpack-ja

2. Ubuntu / Debian の場合

# apt install -y language-pack-ja # locale-gen ja_JP.UTF-8 # update-locale LANG=ja_JP.UTF-8

注意:Ubuntu では localectl set-locale も使えますが、update-locale コマンドが従来から使われているため、どちらを使うか環境で統一しておくことを推奨します。

文字化けの原因特定と対処法

SSHで接続した際に日本語が「???」や「縺ゅ°縺」のような文字化けになる場合、以下の順で確認します。

1. 現在のセッションのロケールを確認する

$ locale 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=

2. ロケール変数の優先順位を理解する

Linuxのロケール変数には優先順位があります。この知識が文字化け解決の鍵です。

LC_ALL(最優先):全カテゴリを強制上書きする。空であれば他の変数が有効
LC_xxx(個別カテゴリ):LC_TIME・LC_MESSAGESなど、分野ごとの上書き
LANG(最低優先度):上記が設定されていない場合のデフォルト

よくある文字化けのパターン:LC_ALL=C がどこかで設定されている場合、LANG=ja_JP.UTF-8 を設定しても効かないことがあります。

# LC_ALLが設定されていないか確認 $ echo $LC_ALL # 環境変数を全て確認 $ env | grep -E "LANG|LC_"

3. SSHクライアント側のロケール送信が原因の場合

Mac や Linux の SSH クライアントは、デフォルトでローカルのロケールをサーバーに送信します。サーバー側でそのロケールが未インストールの場合、文字化けが発生します。

# /etc/ssh/sshd_configでロケール引き継ぎを無効化 # 以下の行をコメントアウト # AcceptEnv LANG LC_*

または SSH クライアント側(~/.ssh/config)で送信しない設定にします。

Host * SendEnv -LANG SendEnv -LC_*

チーム環境の統一:Ansible・手動展開の実践例

複数サーバーのロケールを統一する場合、/etc/locale.conf を直接配布するのが確実です。

Ansible での展開例

- name: Set system locale ansible.builtin.command: localectl set-locale LANG=ja_JP.UTF-8 when: ansible_distribution in ['RedHat', 'Rocky', 'AlmaLinux']

シェルスクリプトでの一括設定例

#!/bin/bash # RHEL/Rocky系サーバーのロケール統一スクリプト # 動作確認: Rocky Linux 9.4 set -euo pipefail # ロケールパッケージのインストール dnf install -y glibc-langpack-ja # ロケール設定 localectl set-locale LANG=ja_JP.UTF-8 # キーボード設定 localectl set-keymap jp106 # 確認 localectl status

ntpd 時刻同期設定と合わせて実施することで、新規サーバーの初期設定を一通りカバーできます。サーバー構築の初期作業として、ロケール・時刻同期・DNS設定をセットで行うのが現場の標準です。

トラブルシュート:よくあるエラーと対処法

「Failed to set locale」が出る場合

指定したロケールがシステムにインストールされていない場合に発生します。

# エラー例 Failed to set locale: Invalid locale or invalid file descriptor # 確認コマンド localectl list-locales | grep ja # 解決: ロケールパッケージをインストール dnf install -y glibc-langpack-ja

設定したのに反映されない場合

localectl で設定した値は、現在のセッションには反映されません。新しいSSHセッションで接続し直して確認してください。

# 現在のセッションに即座に反映させたい場合 $ export LANG=ja_JP.UTF-8 $ export LC_ALL=ja_JP.UTF-8 # bashrcに追記して次回ログイン時から自動適用 $ echo 'export LANG=ja_JP.UTF-8' >> ~/.bashrc

sudo実行時だけ文字化けする場合

sudo はデフォルトで環境変数をリセットするため、LANG が引き継がれないことがあります。

# /etc/sudoers に以下を追加(visudoで編集) Defaults env_keep += "LANG LC_ALL LC_MESSAGES" # または -E オプションで現在の環境を引き継ぐ sudo -E コマンド

Linux 基本コマンドの解説でも触れていますが、sudo 周りの環境変数の扱いは現場で意外と詰まるポイントです。

本記事のまとめ

やりたいこと コマンド
現在のロケール・キーボードを確認する localectl status
利用可能なロケール一覧を表示する localectl list-locales
ロケールを日本語UTF-8に設定する localectl set-locale LANG=ja_JP.UTF-8
ロケールを英語(スクリプト用)に設定する localectl set-locale LANG=C.UTF-8
コンソールのキーボードマップを設定する localectl set-keymap jp106
X11キーボードレイアウトを設定する localectl set-x11-keymap jp
現在のロケール変数を確認する locale
RHEL系でロケールパッケージをインストールする dnf install -y glibc-langpack-ja

ロケール設定は「一度やったら終わり」の作業ですが、チーム内で統一されていないと予期せぬ文字化けやスクリプトの誤動作を引き起こします。

localectl を正しく使いこなせると、Linux DNS 設定の基本や時刻同期と並んで、サーバー初期設定の基礎スキルとして現場で確実に評価されます。新しいサーバーを立ち上げる際には、localectl status を確認することを習慣にしてみてください。

localectlでロケール設定を習得したら、次はサーバー全体の構築スキルを体系的に固めませんか?

ロケール・タイムゾーン・ホスト名など、サーバー初期設定の各コマンドは点で覚えるより「型」として体系的に身につける方が現場で活きます。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。

「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として15年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。