Bug#1107636: cloud.debian.org: use /etc/locale.conf instead of /etc/default/locale
Package: cloud.debian.org
Followup-For: Bug #1107636
X-Debbugs-Cc: neitsab@archlinux.org
Indeed, getting the desired locale to work properly is a pretty annoying aspect of Debian cloud images.
>From your suggestion I thought of using `locale_configfile: /etc/locale.conf` from [1], but it didn't work:
```
$ cat /var/log/cloud-init.log | grep locale
2025-06-17 12:51:01,492 - subp.py[DEBUG]: Running command ['localectl', 'set-x11-keymap', 'fr', 'pc105', '', ''] with allowed return codes [0] (shell=False, capture=True)
2025-06-17 12:51:01,548 - modules.py[DEBUG]: Running module locale (<module 'cloudinit.config.cc_locale' from '/usr/lib/python3/dist-packages/cloudinit/config/cc_locale.py'>) with frequency once-per-instance
2025-06-17 12:51:01,548 - handlers.py[DEBUG]: start: modules-config/config-locale: running config-locale with frequency once-per-instance
2025-06-17 12:51:01,548 - util.py[DEBUG]: Writing to /var/lib/cloud/instances/iid-local01/sem/config_locale - wb: [644] 24 bytes
2025-06-17 12:51:01,548 - helpers.py[DEBUG]: Running config-locale using lock (<FileLock using file '/var/lib/cloud/instances/iid-local01/sem/config_locale'>)
2025-06-17 12:51:01,548 - util.py[DEBUG]: Reading from /etc/default/locale (quiet=False)
2025-06-17 12:51:01,548 - util.py[DEBUG]: Read 13 bytes from /etc/default/locale
2025-06-17 12:51:01,548 - cc_locale.py[DEBUG]: Setting locale to fr_FR.UTF-8
2025-06-17 12:51:01,548 - debian.py[DEBUG]: Generating locales for fr_FR.UTF-8
2025-06-17 12:51:01,548 - subp.py[DEBUG]: Running command ['locale-gen', 'fr_FR.UTF-8'] with allowed return codes [0] (shell=False, capture=False)
2025-06-17 12:51:01,553 - debian.py[DEBUG]: Updating /etc/locale.conf with locale setting LANG=fr_FR.UTF-8
2025-06-17 12:51:01,553 - subp.py[DEBUG]: Running command ['update-locale', '--locale-file=/etc/locale.conf', 'LANG=fr_FR.UTF-8'] with allowed return codes [0] (shell=False, capture=False)
2025-06-17 12:51:01,567 - handlers.py[DEBUG]: finish: modules-config/config-locale: FAIL: running config-locale with frequency once-per-instance
2025-06-17 12:51:01,567 - util.py[WARNING]: Running module locale (<module 'cloudinit.config.cc_locale' from '/usr/lib/python3/dist-packages/cloudinit/config/cc_locale.py'>) failed
2025-06-17 12:51:01,567 - util.py[DEBUG]: Running module locale (<module 'cloudinit.config.cc_locale' from '/usr/lib/python3/dist-packages/cloudinit/config/cc_locale.py'>) failed
File "/usr/lib/python3/dist-packages/cloudinit/config/cc_locale.py", line 70, in handle
cloud.distro.apply_locale(locale, locale_cfgfile)
File "/usr/lib/python3/dist-packages/cloudinit/distros/debian.py", line 132, in apply_locale
update_locale_conf(locale, out_fn, keyname=keyname)
File "/usr/lib/python3/dist-packages/cloudinit/distros/debian.py", line 374, in update_locale_conf
Command: ['update-locale', '--locale-file=/etc/locale.conf', 'LANG=fr_FR.UTF-8']
```
Indeed, it doesn't exist in the version of cloud-init used in Debian Bookworm[2].
Currently the best workaround I've found[0] is to configure the following in `user-data.yaml` :
```yaml
locale: fr_FR.UTF-8
bootcmd:
- cloud-init-per once setlocales sed -i '/fr_FR.UTF/s/^# //' /etc/locale.gen
```
This allows the regular locale-setting process to work out of the box :
```
debian@debcloud:~$ localectl
System Locale: LANG=fr_FR.UTF-8
(...)
debian@debcloud:~$ cat /etc/default/locale
LANG=fr_FR.UTF-8
debian@debcloud:~$ locale
LANG=fr_FR.UTF-8
LANGUAGE=
LC_CTYPE="fr_FR.UTF-8"
LC_NUMERIC="fr_FR.UTF-8"
LC_TIME="fr_FR.UTF-8"
LC_COLLATE="fr_FR.UTF-8"
LC_MONETARY="fr_FR.UTF-8"
LC_MESSAGES="fr_FR.UTF-8"
LC_PAPER="fr_FR.UTF-8"
LC_NAME="fr_FR.UTF-8"
LC_ADDRESS="fr_FR.UTF-8"
LC_TELEPHONE="fr_FR.UTF-8"
LC_MEASUREMENT="fr_FR.UTF-8"
LC_IDENTIFICATION="fr_FR.UTF-8"
LC_ALL=
```
After that, there is the related issue of getting the virtual console keymap to match the `keyboard:` config, which requires
the `console-setup` package to be installed (bug report impending).
See also cloud-init bug #4195[3].
Cheers,
[0]: based upon https://old.reddit.com/r/devops/comments/1gjo37e/cloudinit_am_i_setting_wrong_my_locale_config/lvfmxsf/
[1]: https://cloudinit.readthedocs.io/en/latest/reference/yaml_examples/locale_and_timezone.html#set-the-locale-via-config-file
[2]: https://cloudinit.readthedocs.io/en/22.4.2/reference/yaml_examples/locale_and_timezone.html
[3]: https://github.com/canonical/cloud-init/issues/4195
Reply to: