[Buildroot] [PATCH v2 1/2] package/postgresql/postgresql.service: set locale for initdb to C

Peter Seiderer ps.report at gmx.net
Sun Nov 5 10:07:11 UTC 2023


Hello *,

On Thu,  2 Nov 2023 12:41:53 -0600, Adam Duskett <adam.duskett at amarulasolutions.com> wrote:

> From: Peter Seiderer <ps.report at gmx.net>
>
> Systemd creates a /etc/locale.conf file with LANG="C.UTF-8". On boot, systemd
> reads /etc/locale.conf and sets the LANG environment variable,
> (see the locale_context_load_conf method in local-setup.c.)
>
> When initdb.c is called, a check for the LANG environment variable is called,
> and if it is set to something other than "C" initdb attempts to load the
> corresponding LC_CTYPE file in /usr/lib/locale/. IE: If LANG is set to C.UTF-8,
> then initdb.c attempts to load /usr/lib/locale/C.UTF-8/LC_CTYPE. However, these
> files do not exist on a Buildroot system, and as such, initdb throws the
> following error on startup:
>
> ```
> initdb: error: invalid locale settings; check LANG and LC_* environment variables
> pg_ctl: database system initialization failed
> ```
>
> To fix this issue, add "Environment=LANG=C" to the package provided
> postgresql.service file to force Postgresql to use the C locale.
>
> Tested-by: Adam Duskett <adam.duskett at amarulasolutions.com>
> Signed-off-by: Adam Duskett <adam.duskett at amarulasolutions.com>
> ---
> v1 -> v2:
>   - Get to the root cause of the problem and provide a better explination of
>     what is happening.
>
>   - Use Environment=LANG=C isntead of -o --locale=C
>
>  package/postgresql/postgresql.service | 4 ++++
>  1 file changed, 4 insertions(+)
>
> diff --git a/package/postgresql/postgresql.service b/package/postgresql/postgresql.service
> index 539eea8964..c470c7181e 100644
> --- a/package/postgresql/postgresql.service
> +++ b/package/postgresql/postgresql.service
> @@ -16,6 +16,10 @@ StandardOutput=syslog
>  StandardError=syslog
>  SyslogIdentifier=postgres
>
> +# Overwrite the LANG variable to prevent systemd from passing the LANG
> +# environment variable set in /etc/locale.conf.
> +Environment=LANG=C
> +
>  ExecStartPre=/bin/sh -c "if [ ! -f /var/lib/pgsql/PG_VERSION ]; then /usr/bin/pg_ctl initdb -D /var/lib/pgsql; fi"
>  ExecStart=/usr/bin/postgres -D /var/lib/pgsql
>  ExecReload=/usr/bin/kill -HUP $MAINPID

And for the record the links to the original patch series/review comments:

	https://patchwork.ozlabs.org/project/buildroot/patch/20200920150659.7562-1-ps.report@gmx.net/
	https://patchwork.ozlabs.org/project/buildroot/patch/20200920150659.7562-2-ps.report@gmx.net/
	https://patchwork.ozlabs.org/project/buildroot/patch/20200920150659.7562-3-ps.report@gmx.net/

Regards,
Peter




More information about the buildroot mailing list