SVX日記
2024-02-10(Sat) コンテナ上のリモートデスクトップ環境の実用化に成功・改
前回「最後、言語とタイムゾーンの設定の問題」をクリアしたかように書いたが、よく見れば、左上のメニューも、ターミナルのメニューも、「Applications」や「File」などの表記のままであり正しく日本語化できてはいない。別に実用上は問題ないのだけれど、ロケールを正しく設定しているにもかかわらず、なんでなの? という気持ちは残る。
# localectl
System Locale: LANG=ja_JP.UTF-8
VC Keymap: us
X11 Layout: us
X11 Model: pc105
# locale
LANG=ja_JP.UTF-8
LC_TIME="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_ALL=
# env | grep LANG
LANG=ja_JP.UTF-8
# ls -l
total 12
-rw-r--r-- 1 root root 2162 11月 26 16:48 anaconda-post-nochroot.log
-rw-r--r-- 1 root root 150 11月 26 16:48 anaconda-post.log
-rw------- 1 root root 3533 11月 26 16:48 original-ks.cfg
そこでフト、日本語化を含む、多言語化の方式について思い出した。多くのアプリケーションはgettextという共通の枠組みを使って、英語表記を望みの言語表記に置き換えている。その辞書に当たる「言語ファイル」が「.po」から作られる「.mo」ファイルだ。
# strace ls -l 2>&1 | grep '\.mo'
openat(AT_FDCWD, "/usr/share/locale/ja/LC_TIME/coreutils.mo", O_RDONLY) = -1 ENOENT (そのようなファイルやディレクトリはありません)
openat(AT_FDCWD, "/usr/share/locale/ja/LC_MESSAGES/coreutils.mo", O_RDONLY) = -1 ENOENT (そのようなファイルやディレクトリはありません)
ビンゴ。「ls」の実行時、探しに行っているものの見つかっていない。「言語ファイル」が入っていないことが原因だ。じゃ、その「言語ファイル」はどこに入っているのかというと「coreutils-common」パッケージだ。というか「言語ファイル」は、それを参照する「ls」コマンドと同じパッケージに入っている。つまり、各パッケージを横断して英語表記のままという症状が出ているということは、各パッケージの問題ではなくインストール機構の問題だということだ。
# rpm -qf /usr/share/locale/ja/LC_MESSAGES/coreutils.mo
coreutils-common-9.3-4.fc39.x86_64
# rpm -ql coreutils-common | grep ja
/usr/share/locale/ja/LC_MESSAGES/coreutils.mo
/usr/share/locale/ja/LC_TIME
/usr/share/locale/ja/LC_TIME/coreutils.mo
# rpm -qV coreutils-common
# rpm -qVv coreutils-common | grep ja
......... /usr/share/locale/ja/LC_MESSAGES/coreutils.mo (not installed)
......... /usr/share/locale/ja/LC_TIME (not installed)
......... /usr/share/locale/ja/LC_TIME/coreutils.mo (not installed)
そこでフト、コンテナ環境の特性について思い当たる。コンテナはイメージ化して持ち運んだりするので、余計なファイルは極力含まれないほうが望ましく、特にサーバ用途に利用する場合に必要度の低い言語ファイル等を含めないような機構があるのではないかと。
調べると、dnfには「tsflags」というパラメータがあり、これを指定するとドキュメント系のファイルのインストールがスキップされる仕組みがあるようだ。コンテナ内の「/etc/dnf/dnf.conf」を見ると、確かに「tsflags=nodocs」という記述がある。
# rpm -qVv coreutils-common
......... /usr/share/locale/ja/LC_MESSAGES/coreutils.mo (not installed)
......... /usr/share/locale/ja/LC_TIME (not installed)
......... /usr/share/locale/ja/LC_TIME/coreutils.mo (not installed)
:
......... d /usr/share/man/man1/ls.1.gz (not installed)
# diff /etc/dnf/dnf.conf.org /etc/dnf/dnf.conf
< tsflags=nodocs
> #tsflags=nodocs
# dnf reinstall coreutils-common
# rpm -qVv coreutils-common
......... /usr/share/locale/ja/LC_MESSAGES/coreutils.mo (not installed)
......... /usr/share/locale/ja/LC_TIME (not installed)
......... /usr/share/locale/ja/LC_TIME/coreutils.mo (not installed)
:
......... d /usr/share/man/man1/ls.1.gz
# dnf download --source coreutils
# rpm2cpio coreutils-9.3-5.fc39.src.rpm | cpio -div
# view coreutils.spec
:
%find_lang %name
# Add the %%lang(xyz) ownership for the LC_TIME dirs as well...
grep LC_TIME %name.lang | cut -d'/' -f1-6 | sed -e 's/) /) %%dir /g' >>%name.lang
:
%files common -f %{name}.lang
# strace -o dnf.str dnf reinstall coreutils-common
# cat dnf.str | grep open | grep -v NOENT | less
openat(AT_FDCWD, "/etc/rpm/macros.image-language-conf", O_RDONLY) = 3
# cat /etc/rpm/macros.image-language-conf
%_install_langs en_US
# rm /etc/rpm/macros.image-language-conf
# dnf reinstall coreutils-common
# rpm -qVv coreutils-common
......... /usr/share/locale/ja/LC_MESSAGES/coreutils.mo
......... /usr/share/locale/ja/LC_TIME
......... /usr/share/locale/ja/LC_TIME/coreutils.mo
:
......... d /usr/share/man/man1/ls.1.gz