ロケールとキーボードの設定 - Arch Linuxの最小限インストール直後の作業(1)

ロケールとキーボードの設定は、インストール時または[Arch Linuxの最小限インストール](https://qiita.com/j8takagi/items/235e4ae484e8c587ca92#_reference-3a1f60eef45deadcc6c8 "Arch Linuxの最小限インストール - Qiita")の完了直後に行うべき作業です。

ロケールとは、国や地域の設定のことで、使用する言語や、通貨の表示方法、タイムゾーンなどが含まれます。ここでは、日本国内で使うことを前提として設定方法を説明します。Arch Linuxでは、Systemdを用いてロケールを設定できます。

localectlコマンドで、現在のロケールとキーボードの設定を表示します。

```
[root@archlinux ~]# localectl
```

```:実行結果
   System Locale: LANG=C
       VC Keymap: n/a
      X11 Layout: n/a
```

## キーボードの設定

キーボードは、Arch Linuxインストール直後は英語キーボードが設定されます。日本語キーボードと英語キーボードでは主に、記号の配置が違います。たとえばShift+2キーを押した場合、日本語キーボードでは"、英語キーボードでは@が入力されます。キーボードの確認や変更は、localectlコマンドのサブコマンドでできます。

### 利用可能なキーボードの表示

list-keymapsサブコマンドで現在利用可能なキーボードレイアウトの一覧を表示できます。次のコマンドで、jpが含まれる、すなわち日本向けのキーボードレイアウトを表示します。

```
[root@archlinux ~]# localectl list-keymaps | grep jp
```

```:実行結果
jp106
```

### キーボードの変更

set-keymapサブコマンドでキーボードを変更できます。

```
[root@archlinux ~]# localectl set-keymap jp106
```

このコマンドで、現在のキーボードレイアウトを変更するloadkeysコマンドが呼び出されるとともに、設定ファイル`/etc/vconsole.conf`が更新されてキーボードレイアウトが永続的に（再起動後も）変更されます。

オプションを指定しない場合は、X環境でのキーボードレイアウトも一緒に変更されます。X環境でのキーボードは変更しない場合は、`-no-convert`オプションをつけます。

```:参考
[root@archlinux ~]# localectl set-keymap -no-convert jp106
```

英語キーボードに戻す場合は、次のコマンドを実行します。

```:参考
[root@archlinux ~]# localectl set-keymap us
```

## ロケールの設定

ロケールを設定するには、あらかじめロケールを設定しておく必要があります。ロケールは、Linuxの標準ライブラリであるglibcの機能です。

### ロケールの詳細設定の表示

`locale`コマンドで、ロケールの現在の設定詳細を表示できます。

```
[root@archlinux ~]# locale
```

```:実行結果
LANG=C
LC_CTYPE="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_COLLATE="C"
LC_MONETARY="C"
LC_MESSAGES="C"
LC_PAPER="C"
LC_NAME="C"
LC_ADDRESS="C"
LC_TELEPHONE="C"
LC_MEASUREMENT="C"
LC_IDENTIFICATION="C"
LC_ALL=
```

### 設定可能なロケール一覧の表示

`locale -a`コマンドで、現在設定可能なロケールの一覧を表示します。

```
[root@archlinux ~]# locale -a
```

```:実行結果
C
POSIX
```

CとPOSIXはともにPOSIXロケールをあらわします。POSIXロケールの場合、メッセージは英語で表示されます。

### 設定可能なロケールの生成

POSIXロケール以外のロケールを使うために、ロケールを生成します。`/etc/locale.gen`ファイルで生成するロケールを設定し、locale-genコマンドを実行します。

#### locale.genの編集

`/etc/locale.gen`にはコメントアウトされた形で多くのロケールが行ごとに記述されています。viなどのテキストエディタを使って、生成するロケールの行で先頭の`#`を削除してください。

```
[root@archlinux ~]# vi /etc/locale.gen
```

アメリカ地域・英語のロケールであるen_US.UTF-8と、日本地域・日本語のロケールであるja_JP.UTF-8の行で先頭の`#`を削除してください。ほかに利用したいロケールがあれば、そのロケールの行で先頭の`#`を削除してください。

編集完了後、生成するロケールは次のコマンドで確認できます。

```
[root@archlinux ~]# grep -v '^#' /etc/locale.gen
```

```:実行結果
en_US.UTF-8 UTF-8  
ja_JP.UTF-8 UTF-8  
```

#### ロケール生成の実行

ロケールの生成は次のコマンドで実行されます。

```
[root@archlinux ~]# locale-gen
```

生成実行後、現在の設定可能なロケールの一覧を表示します。

```
[root@archlinux ~]# locale -a
```

```:実行結果
C
POSIX
en_US.utf8
ja_JP.utf8
```

### ロケールのシステムへの適用
システム全体のロケールは、localectlコマンドのset-localeサブコマンドで適用できます。en_US.utf8を適用するには、次のコマンドを実行します。

```
[root@archlinux ~]# localectl set-locale en_US.utf8
```

コンソールで日本語を表示するのはむつかしいので、SSHやX環境を設定するまでは英語のロケールであるen_US.utf8を設定した方がいいと思います。

設定の変更は、localectlコマンドで確認できます。

```
[root@archlinux ~]# localectl
```

```:実行結果
   System Locale: LANG=en_US.utf8
       VC Keymap: n/a
      X11 Layout: n/a
```

なお、現在のセッションでは設定の変更は反映されず、localeコマンドの結果は以前と同じです。

```
[root@archlinux ~]# locale
```

```:実行結果
LANG=C
LC_CTYPE="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_COLLATE="C"
LC_MONETARY="C"
LC_MESSAGES="C"
LC_PAPER="C"
LC_NAME="C"
LC_ADDRESS="C"
LC_TELEPHONE="C"
LC_MEASUREMENT="C"
LC_IDENTIFICATION="C"
LC_ALL=
```

ログインし直すと、ロケールの変更がセッションに反映され、localeコマンドの結果も変わります。

```
[root@archlinux ~]# locale
```

```:実行結果
LANG=en_US.utf8
LC_CTYPE="en_US.utf8"
LC_NUMERIC="en_US.utf8"
LC_TIME="en_US.utf8"
LC_COLLATE="en_US.utf8"
LC_MONETARY="en_US.utf8"
LC_MESSAGES="en_US.utf8"
LC_PAPER="en_US.utf8"
LC_NAME="en_US.utf8"
LC_ADDRESS="en_US.utf8"
LC_TELEPHONE="en_US.utf8"
LC_MEASUREMENT="en_US.utf8"
LC_IDENTIFICATION="en_US.utf8"
LC_ALL=
```

## 参考資料
- [ロケール - ArchWiki](https://wiki.archlinux.jp/index.php/ロケール)
- [インストールガイド - ArchWiki](https://wiki.archlinux.jp/index.php/インストールガイド)
- [一般的な推奨事項 - ArchWiki](https://wiki.archlinux.jp/index.php/一般的な推奨事項)

## まとめ
今回実行したコマンドをまとめると、次のようになります。

- `localectl set-keymap jp106`
- `vi /etc/locale.gen`
- `locale-gen`
- `localectl set-locale en_US.utf8`