localectl是systemd系统提供的区域设置控制工具,用于管理系统语言、键盘布局、区域设置等本地化配置,替代了传统的locale设置方法。
localectl主要用于管理系统本地化设置:
相对于传统方法:
# 检查localectl命令是否可用
which localectl
# 输出:/usr/bin/localectl
# 查看localectl版本
localectl --version
# 检查是否在systemd系统上
systemctl --version
# 如果localectl不存在,可能需要安装
# CentOS/RHEL/Fedora(通常已安装):
sudo yum install systemd
# 或
sudo dnf install systemd
# Debian/Ubuntu:
sudo apt-get update
sudo apt-get install systemd
localectl [选项] [命令]
# 常用选项
--no-ask-password # 不询问密码(脚本中使用)
-H, --host=[USER@]HOST # 操作远程主机
-M, --machine=NAME # 操作容器
--no-convert # 不转换键盘映射
-h, --help # 显示帮助信息
--version # 显示版本信息
# 常用命令
status # 显示当前状态(默认)
set-locale LOCALE... # 设置系统区域设置
list-locales # 列出可用区域设置
set-keymap MAP [MAP] # 设置键盘映射
list-keymaps # 列出可用键盘映射
set-x11-keymap LAYOUT [MODEL [VARIANT [OPTIONS]]] # 设置X11键盘映射
list-x11-keymap-models # 列出X11键盘模型
list-x11-keymap-layouts # 列出X11键盘布局
list-x11-keymap-variants # 列出X11键盘变体
list-x11-keymap-options # 列出X11键盘选项
# 1. 查看当前区域设置状态(最常用)
localectl status
# 或简写
localectl
# 输出示例:
# System Locale: LANG=zh_CN.UTF-8
# LC_TIME=en_US.UTF-8
# VC Keymap: us
# X11 Layout: us
# 2. 列出所有可用的区域设置
localectl list-locales
# 3. 搜索特定区域设置
localectl list-locales | grep -i china
localectl list-locales | grep -E "zh_CN|zh_TW"
localectl list-locales | grep -E "en_US|en_GB"
# 4. 设置系统区域设置
sudo localectl set-locale LANG=zh_CN.UTF-8
# 5. 设置多个区域变量
sudo localectl set-locale LANG=zh_CN.UTF-8 LC_TIME=en_US.UTF-8 LC_NUMERIC=en_US.UTF-8
# 6. 查看生效的配置
cat /etc/locale.conf
# 7. 重置为默认设置
sudo localectl set-locale LANG=
# 8. 查看特定区域设置的详细信息
localectl list-locales | grep zh_CN
LANG=zh_CN.UTF-8 locale -k LC_TIME
# 设置为中文(中国,UTF-8编码)
sudo localectl set-locale LANG=zh_CN.UTF-8
# 设置为英文(美国)
sudo localectl set-locale LANG=en_US.UTF-8
# 设置为英文(英国)
sudo localectl set-locale LANG=en_GB.UTF-8
# 设置为日语
sudo localectl set-locale LANG=ja_JP.UTF-8
# 混合设置:系统语言中文,时间格式英文
sudo localectl set-locale LANG=zh_CN.UTF-8 LC_TIME=en_US.UTF-8
# 设置最小locale(C/POSIX)
sudo localectl set-locale LANG=C
# 仅设置消息语言为中文
sudo localectl set-locale LC_MESSAGES=zh_CN.UTF-8
# 恢复默认(清空设置)
sudo localectl set-locale LANG=
# 1. 查看当前键盘设置
localectl status | grep "Keymap"
# 2. 列出所有可用键盘布局
localectl list-keymaps
# 3. 搜索特定键盘布局
localectl list-keymaps | grep -i us
localectl list-keymaps | grep -i china
localectl list-keymaps | grep -i japan
# 4. 设置控制台键盘布局
sudo localectl set-keymap us # 美式键盘
sudo localectl set-keymap us-acentos # 美式键盘(带重音符号)
sudo localectl set-keymap de # 德式键盘
sudo localectl set-keymap fr # 法式键盘
sudo localectl set-keymap jp106 # 日式键盘(106键)
sudo localectl set-keymap ru # 俄式键盘
# 5. 设置控制台键盘布局(指定两个映射)
sudo localectl set-keymap us us # 设置主键盘和备用键盘相同
sudo localectl set-keymap us de # 设置主键盘us,备用键盘de
# 6. 查看键盘映射文件
ls -la /etc/vconsole.conf
cat /etc/vconsole.conf
# 1. 查看X11键盘设置
localectl status | grep -A2 "X11 Layout"
# 2. 列出X11键盘相关选项
localectl list-x11-keymap-models # 列出键盘模型
localectl list-x11-keymap-layouts # 列出键盘布局
localectl list-x11-keymap-variants # 列出键盘变体
localectl list-x11-keymap-options # 列出键盘选项
# 3. 设置X11键盘映射
sudo localectl set-x11-keymap us # 美式键盘
sudo localectl set-x11-keymap de # 德式键盘
sudo localectl set-x11-keymap fr # 法式键盘
sudo localectl set-x11-keymap jp # 日式键盘
sudo localectl set-x11-keymap cn # 中式键盘
# 4. 设置完整的X11键盘映射(布局、模型、变体、选项)
sudo localectl set-x11-keymap us pc105 # 美式键盘,105键PC模型
sudo localectl set-x11-keymap us pc105 intl # 美式键盘,国际变体
sudo localectl set-x11-keymap de pc105 nodeadkeys # 德式键盘,无死键变体
# 5. 设置X11键盘选项
sudo localectl set-x11-keymap us pc105 "" ctrl:nocaps # 禁用Caps Lock,改为Ctrl
sudo localectl set-x11-keymap us pc105 "" terminate:ctrl_alt_bksp # 设置终止组合键
# 6. 同时设置控制台和X11键盘
sudo localectl set-keymap us
sudo localectl set-x11-keymap us
# 7. 查看X11键盘配置文件
ls -la /etc/X11/xorg.conf.d/*keyboard*
cat /etc/X11/xorg.conf.d/00-keyboard.conf
us - 美式键盘(默认)us-intl - 美式国际键盘us-altgr-intl - 美式AltGr国际键盘gb - 英式键盘de - 德式键盘fr - 法式键盘es - 西班牙式键盘it - 意大利式键盘ru - 俄式键盘jp - 日式键盘jp106 - 日式106键键盘kr - 韩式键盘cn - 中式键盘tw - 繁体中文键盘hk - 香港键盘in - 印度键盘ara - 阿拉伯键盘ir - 波斯键盘# 1. 区域设置配置文件
/etc/locale.conf
# 内容示例:
# LANG=zh_CN.UTF-8
# LC_TIME=en_US.UTF-8
# 2. 控制台键盘配置文件
/etc/vconsole.conf
# 内容示例:
# KEYMAP=us
# FONT=lat9w-16
# 3. X11键盘配置文件
/etc/X11/xorg.conf.d/00-keyboard.conf
# 或
/etc/X11/xorg.conf.d/10-keyboard.conf
# 4. 系统环境配置文件
/etc/environment
# 可以添加:
# LANG=zh_CN.UTF-8
# LC_ALL=zh_CN.UTF-8
# 5. 查看localectl影响的配置文件
localectl | grep -E "System Locale|VC Keymap|X11 Layout"
# 然后查看对应的配置文件
# 1. 手动编辑locale配置文件(不推荐,会被localectl覆盖)
sudo vi /etc/locale.conf
# 添加:
# LANG=en_US.UTF-8
# LC_CTYPE=zh_CN.UTF-8
# 2. 手动编辑vconsole配置文件
sudo vi /etc/vconsole.conf
# 添加:
# KEYMAP=us
# FONT=Lat2-Terminus16
# 3. 手动编辑X11键盘配置
sudo vi /etc/X11/xorg.conf.d/00-keyboard.conf
# 添加:
# Section "InputClass"
# Identifier "system-keyboard"
# MatchIsKeyboard "on"
# Option "XkbLayout" "us"
# Option "XkbModel" "pc105"
# Option "XkbVariant" ""
# Option "XkbOptions" "terminate:ctrl_alt_bksp"
# EndSection
# 4. 使配置生效(重启或重新加载)
# 对于区域设置,需要重新登录或重启
# 对于键盘设置,可能需要重启显示管理器(lightdm/gdm/sddm)
#!/bin/bash
# 配置完整的中文环境
# 文件名:setup_chinese_environment.sh
echo "开始配置中文环境..."
# 1. 检查是否支持中文locale
echo "检查中文locale支持..."
if ! localectl list-locales | grep -q "zh_CN.UTF-8"; then
echo "中文locale未安装,尝试安装..."
# 根据不同系统安装中文支持
if [ -f /etc/centos-release ] || [ -f /etc/redhat-release ]; then
# CentOS/RHEL
sudo yum install -y glibc-langpack-zh
elif [ -f /etc/debian_version ]; then
# Debian/Ubuntu
sudo apt-get update
sudo apt-get install -y language-pack-zh-hans
elif [ -f /etc/fedora-release ]; then
# Fedora
sudo dnf install -y glibc-langpack-zh
fi
fi
# 2. 设置系统locale为中文
echo "设置系统locale..."
sudo localectl set-locale LANG=zh_CN.UTF-8 LC_MESSAGES=zh_CN.UTF-8 LC_TIME=en_US.UTF-8
# 3. 设置键盘布局(中式键盘)
echo "设置键盘布局..."
sudo localectl set-keymap us # 控制台使用美式键盘(兼容性好)
sudo localectl set-x11-keymap cn # X11使用中式键盘
# 4. 安装中文字体(可选)
echo "安装中文字体..."
if [ -f /etc/centos-release ] || [ -f /etc/redhat-release ]; then
sudo yum install -y wqy-* google-noto-sans-cjk-fonts
elif [ -f /etc/debian_version ]; then
sudo apt-get install -y fonts-wqy-zenhei fonts-wqy-microhei
elif [ -f /etc/fedora-release ]; then
sudo dnf install -y wqy-zenhei-fonts google-noto-sans-cjk-fonts
fi
# 5. 配置输入法(如果使用GNOME/KDE)
echo "配置输入法框架..."
if command -v gnome-shell &> /dev/null; then
echo "检测到GNOME桌面,配置IBus输入法..."
gsettings set org.gnome.desktop.input-sources sources "[('ibus', 'pinyin')]"
fi
# 6. 显示配置结果
echo -e "\n配置完成!当前设置:"
localectl status
echo -e "\n区域设置文件内容:"
cat /etc/locale.conf
echo -e "\n注意:部分设置需要重新登录或重启才能生效。"
#!/bin/bash
# 配置多语言开发环境
# 文件名:setup_multilingual_dev.sh
echo "配置多语言开发环境..."
# 1. 安装常用语言支持
echo "安装多语言支持包..."
if [ -f /etc/centos-release ] || [ -f /etc/redhat-release ]; then
# CentOS/RHEL
sudo yum install -y glibc-langpack-{en,zh,ja,ko,fr,de,es,ru}
elif [ -f /etc/debian_version ]; then
# Debian/Ubuntu
sudo apt-get update
sudo apt-get install -y language-pack-{en,zh,ja,ko,fr,de,es,ru}
fi
# 2. 设置基础locale为英文(避免乱码)
echo "设置基础locale为英文..."
sudo localectl set-locale LANG=en_US.UTF-8
# 3. 设置特定locale变量
echo "配置特定locale变量..."
sudo localectl set-locale LC_CTYPE=en_US.UTF-8 # 字符分类
sudo localectl set-locale LC_NUMERIC=en_US.UTF-8 # 数字格式
sudo localectl set-locale LC_TIME=ja_JP.UTF-8 # 时间格式(日语)
sudo localectl set-locale LC_MONETARY=zh_CN.UTF-8 # 货币格式(中文)
sudo localectl set-locale LC_PAPER=fr_FR.UTF-8 # 纸张格式(法语)
sudo localectl set-locale LC_TELEPHONE=de_DE.UTF-8 # 电话格式(德语)
# 4. 安装多语言字体
echo "安装多语言字体..."
if [ -f /etc/debian_version ]; then
sudo apt-get install -y fonts-{noto,unifont,dejavu}
sudo apt-get install -y fonts-ipafont fonts-nanum fonts-arphic-uming
fi
# 5. 配置终端多语言支持
echo "配置终端..."
echo 'alias locale-test="echo \"中文测试 日本語テスト 한국어테스트 Français Español Русский\""' >> ~/.bashrc
echo 'export LESSCHARSET=utf-8' >> ~/.bashrc
# 6. 创建测试脚本
cat > ~/test-locale.sh << 'EOF'
#!/bin/bash
echo "=== 多语言测试 ==="
echo "系统locale: $LANG"
echo "日期: $(date)"
echo "数字: 1,234.56"
echo "测试文本:"
echo " 中文: 你好世界"
echo " 日文: こんにちは世界"
echo " 韩文: 안녕하세요 세계"
echo " 法文: Bonjour le monde"
echo " 德文: Hallo Welt"
echo " 俄文: Привет мир"
echo " 西文: Hola mundo"
EOF
chmod +x ~/test-locale.sh
# 7. 显示配置
echo -e "\n配置完成!"
echo "当前locale设置:"
localectl status | grep -A5 "System Locale"
echo -e "\n运行 ~/test-locale.sh 测试多语言支持"
#!/bin/bash
# 服务器标准化配置
# 文件名:server_standard_locale.sh
CONFIG_FILE="/etc/server_locale.conf"
BACKUP_DIR="/backup/locale"
echo "开始服务器locale标准化配置..."
# 1. 创建备份目录
mkdir -p "$BACKUP_DIR"
# 2. 备份当前配置
echo "备份当前配置..."
localectl status > "$BACKUP_DIR/localectl_backup_$(date +%Y%m%d_%H%M%S).txt"
cp /etc/locale.conf "$BACKUP_DIR/locale.conf.backup" 2>/dev/null || true
cp /etc/vconsole.conf "$BACKUP_DIR/vconsole.conf.backup" 2>/dev/null || true
# 3. 标准配置(生产服务器推荐)
echo "应用标准配置..."
# 3.1 区域设置:英文UTF-8(避免乱码)
sudo localectl set-locale LANG=en_US.UTF-8
sudo localectl set-locale LC_CTYPE=en_US.UTF-8
sudo localectl set-locale LC_TIME=en_US.UTF-8
sudo localectl set-locale LC_NUMERIC=en_US.UTF-8
sudo localectl set-locale LC_MONETARY=en_US.UTF-8
sudo localectl set-locale LC_MESSAGES=en_US.UTF-8
# 3.2 键盘设置:美式键盘
sudo localectl set-keymap us
sudo localectl set-x11-keymap us
# 3.3 设置时区(如果需要)
sudo timedatectl set-timezone Asia/Shanghai
# 4. 验证配置
echo "验证配置..."
if ! localectl status | grep -q "LANG=en_US.UTF-8"; then
echo "错误:区域设置未正确应用"
exit 1
fi
if ! localectl status | grep -q "VC Keymap: us"; then
echo "警告:键盘映射可能未正确设置"
fi
# 5. 保存配置到自定义文件
echo "保存配置到 $CONFIG_FILE ..."
cat > "$CONFIG_FILE" << EOF
# 服务器标准化locale配置
# 生成时间: $(date)
# 生成脚本: $0
# 区域设置
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8
export LC_CTYPE=en_US.UTF-8
# 键盘设置
export KEYMAP=us
# 时区设置
export TZ=Asia/Shanghai
# 字符集
export CHARSET=UTF-8
export LESSCHARSET=utf-8
EOF
# 6. 创建检查脚本
cat > /usr/local/bin/check-locale.sh << 'EOF'
#!/bin/bash
echo "=== 服务器locale检查 ==="
echo "检查时间: $(date)"
echo
echo "1. localectl状态:"
localectl status
echo
echo "2. 环境变量:"
env | grep -E "LANG|LC_|LANGUAGE" | sort
echo
echo "3. 配置文件:"
echo "/etc/locale.conf:"
cat /etc/locale.conf 2>/dev/null || echo "文件不存在"
echo
echo "/etc/vconsole.conf:"
cat /etc/vconsole.conf 2>/dev/null || echo "文件不存在"
EOF
chmod +x /usr/local/bin/check-locale.sh
# 7. 完成
echo -e "\n配置完成!"
echo "当前设置:"
localectl status
echo -e "\n备份文件保存在: $BACKUP_DIR"
echo "配置文件: $CONFIG_FILE"
echo "检查命令: check-locale.sh"
echo -e "\n建议重启服务器使所有设置生效。"
# 错误:bash: localectl: command not found
# 原因:未安装systemd或不在PATH中
# 解决方案:
# 1. 检查是否使用systemd
ps -p 1 -o comm=
# 输出应为systemd
# 2. 安装systemd(如果未安装)
# CentOS/RHEL:
sudo yum install systemd
# Debian/Ubuntu:
sudo apt-get update
sudo apt-get install systemd
# 3. 检查命令路径
which localectl
# 应为/usr/bin/localectl
# 4. 如果使用非systemd系统(如SysVinit)
# 需要手动编辑配置文件:
# /etc/locale.conf
# /etc/vconsole.conf
# /etc/environment
# 错误:Failed to set locale: Invalid or unsupported locale
# 原因:指定的locale未安装或格式错误
# 解决方案:
# 1. 列出可用的locale
localectl list-locales
# 2. 检查locale格式是否正确
# 正确格式:语言_地区.编码
# 示例:zh_CN.UTF-8, en_US.UTF-8
# 3. 安装缺少的locale
# CentOS/RHEL:
sudo yum install glibc-langpack-zh
# 或
sudo localedef -c -i zh_CN -f UTF-8 zh_CN.UTF-8
# Debian/Ubuntu:
sudo locale-gen zh_CN.UTF-8
# 4. 使用存在的locale
localectl list-locales | grep -E "zh|en"
sudo localectl set-locale LANG=en_US.UTF-8
# 5. 检查编码是否正确
# UTF-8是最常用的,确保系统支持
# 问题:设置键盘布局后,重启仍未生效
# 原因:配置文件未正确更新或服务未重启
# 解决方案:
# 1. 检查配置文件
cat /etc/vconsole.conf
# 应包含:KEYMAP=布局名
cat /etc/X11/xorg.conf.d/00-keyboard.conf
# X11键盘配置
# 2. 重启相关服务
# 对于控制台键盘:
sudo systemctl restart systemd-vconsole-setup
# 对于X11键盘:
# 重启显示管理器
sudo systemctl restart lightdm # lightdm
sudo systemctl restart gdm # gdm
sudo systemctl restart sddm # sddm
# 3. 检查当前活动键盘布局
# 控制台:
sudo kbd_mode -a
loadkeys -d
# X11:
setxkbmap -query
# 4. 手动加载键盘映射
# 控制台:
sudo loadkeys us
# X11:
setxkbmap us
# 问题:SSH连接后locale设置恢复默认
# 原因:SSH客户端传递了自己的locale环境变量
# 解决方案:
# 1. 在SSH服务器端配置
sudo vi /etc/ssh/sshd_config
# 添加或修改:
AcceptEnv LANG LC_*
# 重启SSH服务
sudo systemctl restart sshd
# 2. 在SSH客户端不发送locale
# 编辑~/.ssh/config或/etc/ssh/ssh_config:
Host *
SendEnv -LANG
SendEnv -LC_*
# 3. 在服务器上强制设置
# 编辑/etc/environment(对所有用户生效):
LANG=en_US.UTF-8
LC_ALL=en_US.UTF-8
# 4. 修改PAM配置
# 编辑/etc/pam.d/sshd,添加:
session required pam_env.so readenv=1 envfile=/etc/environment
# 5. 在用户shell配置中设置
# 编辑~/.bashrc或~/.profile:
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8
localectl - 查看当前状态localectl status - 详细状态localectl list-locales - 列出localelocalectl list-keymaps - 列出键盘布局set-locale LANG=xx - 设置区域set-keymap xx - 设置键盘set-x11-keymap xx - 设置X11键盘# 中文环境
sudo localectl set-locale LANG=zh_CN.UTF-8
sudo localectl set-keymap us
sudo localectl set-x11-keymap cn
# 英文环境
sudo localectl set-locale LANG=en_US.UTF-8
sudo localectl set-keymap us
sudo localectl set-x11-keymap us
en_US.UTF-8避免乱码问题localectl status > backup.txt.UTF-8)glibc-langpack-zh或相应语言包localectl仅适用于使用systemd的系统