Erro do debconf no sistema com systemd

2

Encontrei o seguinte problema ao usar debconf para configurar um pacote no Ubuntu 16.04 durante a instalação.

Mais precisamente, o pacote usa debconf para salvar arquivos de configurações e, logo após, no script postinst , um serviço é iniciado. Esse serviço também usa um módulo debconf para carregar as configurações salvas na etapa anterior.

No entanto, o serviço iniciado com systemd falha com o erro:

debconf: DbDriver "config": /var/cache/debconf/config.dat is locked by another process: Resource temporarily unavailable

Pelo que pude encontrar, dpkg ainda está acessando este arquivo com o frontend debconf , e o serviço falha quando tenta iniciar outro frontend (a variável de ambiente DEBIAN_HAS_FRONTEND não é passada para o serviço). Eu tentei forçar a variável de env DEBIAN_HAS_FRONTEND no script, mas outros erros aparecem.

Acho que devo forçar o início do daemon depois que o processo dpkg terminar e debconf já tiver concluído alguma idéia?

    
por joacomug 01.07.2016 / 15:32

2 respostas

1

Então, finalmente encontrei o problema, vou postá-lo caso seja útil para alguém no futuro.

Como eu disse, estava tentando iniciar um serviço a partir do script postinst , e o serviço estava tentando usar debconfig para buscar alguns parâmetros de configuração, mas houve um erro com debconf , pois já havia uma vez instância em execução (embora toda a configuração tenha sido feita no arquivo config , e não em postinst ).

O problema era, então, que havia um frontend debconf ativo durante a execução do script postinst , enquanto eu não estava usando debconf . Eu tinha, no entanto, comentado a linha que carrega o confmodue :

# . /usr/share/debconf/confmodule

Aparentemente, dpkg-reconfigure (e eu acho que dpkg também) considera que confmodule é carregado se eles corresponderem à string "confmodule" nos arquivos ( config , postinst e prerm ). Então, enquanto eu não estava carregando o confmodule efetivamente, o dpkg-reconfigure não estava lançando o frontend, e é por isso que o serviço não pôde iniciar outra debconf instance. A solução foi simplesmente excluir essa linha.

    
por 01.07.2016 / 21:25
1

Para começar, usar o debconf em um programa independente parece errado. Para citar man debconf-devel , seção OUTROS Scripts:

You can also use debconf in other, standalone programs. The issue to watch out for here is that debconf is not intended to be, and must not be used as a registry. This is unix after all, and programs are configured by files in /etc, not by some nebulous debconf database (that is only a cache anyway and might get blown away). So think long and hard before using debconf in a standalone program.

A mesma página de manual também ajuda com o seu problema real na seção anterior (THE POSTINST SCRIPT):

If your postinst launches a daemon, make sure you tell debconf to STOP at the end, since debconf can become a little confused about when your postinst is done otherwise.

Isto é, emita db_stop antes de lançar seu daemon (mesmo que ele não use o próprio debconf).

    
por 03.07.2016 / 15:20