Я установил новый сервер Ubuntu 16.04, но когда я пытаюсь навсегда изменить настройки локали, он не работает и возвращается обратно в локаль POSIX.
Набрав locale
, вы получите следующее:
LANG=
LANGUAGE=
LC_CTYPE="POSIX"
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
LC_COLLATE="POSIX"
LC_MONETARY="POSIX"
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT="POSIX"
LC_IDENTIFICATION="POSIX"
LC_ALL=
Насколько мне известно, это означает, что языковой стандарт не был установлен вообще, так как в документации говорится, что POSIX - это " запасной вариант, кодировка ASCII, такая же, как C ".
Чтобы убедиться, что локали de_AT.utf8
и en_US.utf8
присутствовали в моей системе, я запустил locale -a
, что привело к:
C
C.UTF-8
POSIX
de_AT.utf8
en_AG
en_AG.utf8
en_AU.utf8
en_BW.utf8
en_CA.utf8
en_DK.utf8
en_GB.utf8
en_HK.utf8
en_IE.utf8
en_IN
en_IN.utf8
en_NG
en_NG.utf8
en_NZ.utf8
en_PH.utf8
en_SG.utf8
en_US.utf8
en_ZA.utf8
en_ZM
en_ZM.utf8
en_ZW.utf8
Обратите внимание на несоответствия с C.UTF-8
, но de_AT.utf8
! Что еще меня беспокоит, так это то, что POSIX - третья запись, а в другой работающей системе - последняя в списке.
Чтобы сменить язык на en_US.utf8
, я набрал sudo update-locale LANG=en_US.utf8
. Команда locale
все еще показывала локаль POSIX. После выхода из системы и нового входа в систему locale
все еще показывал локаль POSIX. После перезагрузки locale
все еще показывал локаль POSIX.
Однако, когда я печатаю export LANG=en_US.utf8
, он работает временно, но только до выхода из системы. Таким образом, я почти уверен, что локали были сгенерированы правильно.
/etc/default/locale
просто игнорируется.
Ради завершения, /etc/default/locale
содержит только строку LANG=en_US.utf8
ОБНОВЛЕНИЕ: // Я попытался запустить sudo localectl set-locale LANG=en_US.UTF-8
, и localectl
также показал мне, что он устанавливает локаль, но даже после перезагрузки locale
по-прежнему показывает POSIX, а символы, не входящие в ASCII, по-прежнему отображаются неправильно.
Выполните следующие команды:
locale-gen en_US.UTF-8
dpkg-reconfigure locale
dpkg-reconfigure keyboard-configuration
localedef -i en_US -c -f UTF-8 en_US.UTF-8
reboot
locale
Ответ был действительно связан с PAM, как Gunnar Hjalmarsson упомянул в комментарии. PAM был отключен через sshd_config
, хотя я честно не помню делать так меня.
Для суммирования: Если /etc/default/locale
кажется быть проигнорированным, проверьте, включен ли PAM.
То, что я в конечном счете сделал, является комбинацией вышеупомянутых методов
, я сначала сделал
dpkg-reconfigure locales
и chosed английский язык, utf8, затем:
localedef -i en_US -c -f UTF-8 en_US.UTF-8
Также отредактировал /etc/default/locale для сходства с:
LANG=en_US.UTF-8
LC_ALL=en_US.UTF-8
LANGUAGE=en_US.UTF-8
И после перезагрузки, когда я локаль типа это теперь похоже на это:
LANG=en_US.UTF-8
LANGUAGE=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=en_US.UTF-8
И больше никаких предупреждений...
В развертывании некоторых новых 16.04.5 VMs я столкнулся с этой точной проблемой, но с xrdp
вместо SSH. Я решил это путем добавления следующего к /etc/pam.d/common-session
:
session required pam_env.so readenv=1 user_readenv=1 envfile=/etc/default/locale
, Если Вы чувствительны к дополнительным языкам и культурам через методы входа в систему, Вы могли бы поместить это в /etc/pam.d/xrdp-sesman
(или другой конфигурационный файл PAM) вместо этого. Это может быть то, почему это не там по умолчанию? Это находится в следующих конфигурациях PAM по умолчанию на наших новых установках VM:
крон, lightdm*, вход в систему, polkit-1, sshd, su, и sudo.
Hope это помогает кому-то с этой проблемой, данной методы входа в систему кроме SSH.
кто-либо знает лучшие практики для конфигурации/модификации PAM общих -*? Если бы существует лучший способ получить это движение, было бы хорошо снизить это.