▼CentOS 7/RHEL 7 で コンソールのCapsLock を Ctrl にする▼

X11でのキーマップの入替えはわりとよく資料を見かけますが、 生コンソールでの話はあまり見ないので書いてみます。

Keywords: console Shift+Caps Lock to Ctrl Control loadkeys localectl systemd-vconsole-setup

$Id: c7-caps-to-ctrl.html,v 1.2 2016-06-19 15:48:43+09 kabe Exp $


▼そもそもキーマップ設定はどこに格納されているの?

コンソール(X11ではないほう) の設定は、 /etc/vconsole.confに 格納されています。

KEYMAP=jp
FONT=latacyrheb-sub16

で、ここの値は起動時に、systemd unit の systemd-vconsole-setup.service/usr/lib/systemd/systemd-vconsole-setupプログラムを起動し、 その中で /usr/bin/loadkeys をさらに起動して コンソールのキーマップが設定されます。

                                       /etc/vconsole.conf 
                                               ↓
    systemd-vconsole-setup.service → systemd-vconsole-setup → loadkeys

▼で、キーマップを変更するには? (一時的)

コンソールのキーマップを変更するには loadkeys(1)を 使います。


#!/bin/loadkeys

#include "jp106.map"
include "/lib/kbd/keymaps/legacy/i386/qwerty/jp106.map.gz"

# keymaps 0-1,4-5,8-9,12

# remap CapsLock to Control
keycode  58 = Control
	shift   keycode  58 = Caps_Lock

# map Shift+KP_9 to console scroll
	shift   keycode  73 = Scroll_Backward
	shift   keycode  81 = Scroll_Forward

# to increase scrollback buffer, add "fbcon=scrollback:128k" to kernel cmdline option

ファイルの書式についてはkeymaps(5)を見てください。

上記ファイルを jp106+.mapとでもで保存して、 sudo loadkeys jp106+.mapで適用します。 sudo が必要なのは、たぶんシステム挙動に深く関わるキー (SysRq とか Ctrl-Alt-Del) のマップを一般ユーザーにいじられたくないからかも。

上記例では、


▼ RHEL 7 でのキーマップと localectl

RHEL7では、コンソールとX11のキーマップを同期させたいためか、 設定を別々に行うのではなく、 localectl(1)コマンドと systemd-localed(8)が 間に挟まって動くようになっています。


localectl → [D-Bus] → systemd-localed → /etc/vconsole.conf → loadkeys
                                    \→ /etc/X11/xorg.conf.d/00-keyboard.conf

localectl status を行うと、X11をインストールしていなくても

$ localectl status
   System Locale: LANG=ja_JP.UTF-8
       VC Keymap: jp
      X11 Layout: jp
VC (Virtual Console; 生コンソール) と X11 の設定が出てきますが、 そういうことです。 X11の設定はX11をインストールしていなくても存在しています。

なので、キーマップを恒久的に変えたいときは /etc/vconsole.confを直接書き換えるのではなく、 localectl から変えるのが作法、ということになります。

systemd-localedは常駐せず D-Bus (org.freedesktop.locale1)にぶら下がっていて、 localectlを使うと systemd が systemd-localed.service から起動します。 しばらく使わなければ消滅します。

systemd-localedlocalectl(1)を使わなければ起動しないので、 OS起動時には使われません。 起動時は systemd-vconsole-setup がキーマップを設定します。

この辺の統一性のなさというか統合しようとしていろいろな要素が 追加されてしまうのが D-Busや systemd が嫌われる一因かも。

▼コンソールのキーマップを恒久的に変える

作法的には localectlで変えるのが正しいのですが、

とやってもコンソールについてはマップ替えができます。


おまけ:コンソールで ¥ を入力できるようにする

Linux コンソール では PrintScreen キーが Compose キーとして割り当てられているので、 たとえば [PrintScreen]-[’]-[e] で é が直接入力できます。

が、半角¥マーク (0xA5) を入力するシーケンスは定義されていないので、 他のOSのように Compose = Y で ¥ を入力するには、 keymaps に以下を追加します:

	compose '=' 'Y' to '¥'
問題は最後の¥はちゃんとファイル上でも 0xA5 になっていなければならないこと。 普通に vi jp106+.maps とすると UTF-8モードになってファイル保存したときに別のコードになってしまうので、 vim では :set fileencoding=latin1 として8ビットモードに する必要があります。 その上で、vim では ^V165 もしくは ^KYe で¥マークを挿入します。

Perl6で多用される半角セント記号¢(0xA2)も定義されていないので、使うなら

	compose '|' 'c' to '¢'
(頻用するなら旧OADGキーボードのように Alt-Shift-@ に割り当ててもよさそうですけど)


かべ@sra-tohoku.co.jp