事象
同じオプションでLinuxからWindows 11の共有フォルダをmount.cifs
でマウントしたとき、片方のLinuxでは日本語のファイル名が正しく表示されるのに、もう一台では文字化け(エスケープされた状態, $\123\456...
)で表示される。
環境
- Arch Linux (最新版)
- (Samba 4.19.2)
- Windows 11 (23H2)
原因と解法
文字化けするマシンのシステムロケール (/etc/locale.conf
) がLANG=C.UTF-8
のままだったので、# localectl set-locale LANG=ja_JP.UTF-8
で日本語ロケールに修正したら解決した。
効かなかったこと
- [ダメ]
mount.cifs
のオプションにiocharset=cp932
を指定 ... 表示は変わるがエスケープは解けない。 - [ダメ]
mount.cifs
のオプションにcodepage=cp932
を指定 ... そもそもcodepage
オプションはかなり前に廃止されている様子。
感想
ユーザのロケールはLC_ALL=ja_JP.UTF-8
になっていたので気が付かなかった…こんなこともあるのですね。ファイル名におけるロケールの取り扱いがどうなっているのか気になってきました。
- この記事によれば、カーネル(ファイルシステム)がファイルを操作する際にはファイル名のコードページ・ロケールは関係ない様子。
- となると、
ls
がファイル名を表示する際にロケールを見ながら変換しているのだろうが、そうするとなぜユーザのロケールが無視されたのだろうか…わからん。