问题描述

在 Proxmox VE (PVE) 主机上执行命令时出现 Perl locale 警告:

perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
        LANGUAGE = (unset),
        LC_ALL = (unset),
        LC_CTYPE = (unset),
        LC_NUMERIC = "zh_CN.UTF-8",
        LC_COLLATE = (unset),
        LC_TIME = "zh_CN.UTF-8",
        LC_MESSAGES = (unset),
        LC_MONETARY = "zh_CN.UTF-8",
        LC_ADDRESS = "zh_CN.UTF-8",
        LC_IDENTIFICATION = "zh_CN.UTF-8",
        LC_MEASUREMENT = "zh_CN.UTF-8",
        LC_PAPER = "zh_CN.UTF-8",
        LC_TELEPHONE = "zh_CN.UTF-8",
        LC_NAME = "zh_CN.UTF-8",
        LANG = "en_US.UTF-8"
    are supported and installed on your system.
perl: warning: Falling back to the standard locale ("en_US.UTF-8").

环境信息

  • PVE 版本: 基于 6.17.2 内核
  • 主机: 192.168.114.10
  • 影响: qm、pvesm 等命令输出大量警告信息

问题原因

系统环境变量设置了 zh_CN.UTF-8 locale,但该 locale 未在系统中生成。只有 en_US.utf8 被安装。

检查命令:

# 查看已安装的 locale
locale -a

# 查看当前 locale 设置
locale

修复步骤

1. 检查当前状态

# 检查已安装的 locale
locale -a | grep -E 'zh_CN|en_US'

# 预期结果(修复前):
# en_US.utf8

2. 启用中文 Locale

编辑 /etc/locale.gen,取消注释中文 locale:

# 方法1: 使用 sed 自动取消注释
sed -i 's/# zh_CN.UTF-8 UTF-8/zh_CN.UTF-8 UTF-8/' /etc/locale.gen

# 方法2: 手动编辑
vi /etc/locale.gen
# 找到并取消注释这一行:
# zh_CN.UTF-8 UTF-8

3. 生成 Locales

locale-gen

预期输出:

Generating locales (this might take a while)...
  en_US.UTF-8... done
  zh_CN.UTF-8... done
Generation complete.

4. 设置默认 Locale

# 设置默认语言为英文
update-locale LANG=en_US.UTF-8

# 或设置为中文
# update-locale LANG=zh_CN.UTF-8

5. 验证修复结果

# 检查已安装的 locale
locale -a | grep -E 'zh_CN|en_US'

# 预期结果(修复后):
# en_US.utf8
# zh_CN.utf8

# 检查默认 locale 配置
cat /etc/default/locale

# 预期结果:
# LANG=en_US.UTF-8

# 测试命令(不应再有警告)
qm list
pvesm status

修复结果

项目状态
zh_CN.UTF-8已安装
en_US.UTF-8已安装
默认 localeen_US.UTF-8
Perl 警告已消除

其他解决方案

方案 A: 仅使用英文 Locale

如果不需要中文支持,可以只设置英文 locale:

# 删除中文 locale 引用
update-locale --unset LC_NUMERIC
update-locale --unset LC_TIME
update-locale --unset LC_MONETARY
update-locale --unset LC_ADDRESS
update-locale --unset LC_IDENTIFICATION
update-locale --unset LC_MEASUREMENT
update-locale --unset LC_PAPER
update-locale --unset LC_TELEPHONE
update-locale --unset LC_NAME

# 设置默认为英文
update-locale LANG=en_US.UTF-8

方案 B: 用户级 Locale 配置

如果不想修改系统全局配置,可以在用户 shell 配置中设置:

# 添加到 ~/.bashrc 或 ~/.profile
echo 'export LANG=en_US.UTF-8' >> ~/.bashrc
echo 'export LC_ALL=en_US.UTF-8' >> ~/.bashrc
source ~/.bashrc

故障排查

问题: locale-gen 后仍报错

解决: 检查 /etc/locale.gen 中对应行是否已取消注释,然后重新运行 locale-gen

问题: SSH 连接后仍有警告

解决: 可能是 SSH 客户端传递了 locale 设置。在客户端 ~/.ssh/config 添加:

Host *
    SendEnv LANG LC_*

或在服务器端 /etc/ssh/sshd_config 注释掉:

# AcceptEnv LANG LC_*

然后重启 sshd: systemctl restart sshd


参考资料