glibc更新時のカスタムロケールについて


脆弱性が見つかったなどglibcを更新する機会があり、カスタムロケールが元に戻ってしまったためメモしておきます。

似たような事象情報
https://access.redhat.com/ja/node/1335543

glibcはご存知の通りlinux系OSの根幹をなすプログラム群で、さまざまなパッケージに対して被依存関係があります。予想外の場所も影響がありました。。

内容

ロケールに文字コード(sjisなど)を追加して運用しているシステムにおいて、glibcを更新した場合、ロケール情報が追加前(デフォルト)に戻った

glibcの依存関係
以下のようにglibcを更新する場合、common/devel/headersも更新となります。

Dependencies Resolved
Updating:
 glib
Updating for dependencies:
 glibc-common
 glibc-devel
 glibc-headers

更新前と後のロケール情報比較
ロケールにsjisを追加していた場合

$ localedef -f SHIFT_JIS -i ja_JP ja_JP.SJIS
$ locale -a | grep ja
ja_JP
ja_JP.eucjp
ja_JP.sjis <==入ってる
ja_JP.ujis
ja_JP.utf8
japanese
japanese.euc

$ sudo yum update glibc
(1/4): glibc-2.17-196.el7.x86_64.rpm
(2/4): glibc-common-2.17-196.el7.x86_64.rpm
(3/4): glibc-devel-2.17-196.el7.x86_64.rpm
(4/4): glibc-headers-2.17-196.el7.x86_64.rpm
・・・中略・・・
Complete!

$ locale -a | grep ja
ja_JP
ja_JP.eucjp
ja_JP.ujis
ja_JP.utf8
japanese
japanese.euc

更新後、追加済みのsjisが消えました。これはロケール情報の実体である「/usr/lib/locale/locale-archive」がglibc-commonに含まれていて、rpmの更新時に現行OSのファイルを上書きしたためと思われます。
(ロケール追加時に利用したlocaledefコマンドによってlocale-archiveが作り直されたことも合わせて確認しました)

参考)glibc-commonに含まれているファイル

$ rpm -ql glibc-common | grep locale-archive
/usr/lib/locale/locale-archive

glibc-common更新時にロケール情報戻りを許容するのか
sjisの定義をlocale-archiveではなく外に出力した場合glibc-commonを更新した場合であっても追加したロケール情報は保持されたままでした。きちんと検証できていませんが、追加時には以下のようにしておくのがより良いのかもしれません。後日glibcの更新ポリシーや、ドキュメントをもう少し確認してみようと思います。

localedefコマンドの引数と結果

$ date
2017年 9月 21日 木曜日 00:00:55 JST
$ localedef -f SHIFT_JIS -i ja_JP /usr/lib/locale/ja_JP.SJIS
$ ls -lh /usr/lib/locale/locale-archive
-rw-r--r-- 1 root root 102M  9月 20 23:55 /usr/lib/locale/locale-archive
$ ls -lh /usr/lib/locale/ja_JP.SJIS
-rw-r--r-- 1 root root  107  9月 21 00:01 LC_ADDRESS
-rw-r--r-- 1 root root 294K  9月 21 00:01 LC_COLLATE
-rw-r--r-- 1 root root 511K  9月 21 00:01 LC_CTYPE
-rw-r--r-- 1 root root  345  9月 21 00:01 LC_IDENTIFICATION
-rw-r--r-- 1 root root   27  9月 21 00:01 LC_MEASUREMENT
drwxr-xr-x 2 root root 4.0K  9月 21 00:01 LC_MESSAGES
-rw-r--r-- 1 root root  294  9月 21 00:01 LC_MONETARY
-rw-r--r-- 1 root root   79  9月 21 00:01 LC_NAME
-rw-r--r-- 1 root root   58  9月 21 00:01 LC_NUMERIC
-rw-r--r-- 1 root root   38  9月 21 00:01 LC_PAPER
-rw-r--r-- 1 root root   55  9月 21 00:01 LC_TELEPHONE
-rw-r--r-- 1 root root 4.9K  9月 21 00:01 LC_TIME