Como instalar o arquivo .deb de dentro do script preinst?

2

Eu tenho meu próprio aplicativo empacotado usando o dpkg. O aplicativo depende de vários arquivos .deb que estou tentando instalar a partir do script preinst do meu aplicativo. O script preinst verifica se um arquivo deb dependente está instalado, senão vai instalá-lo usando o comando dpkg -i . Isso é repetido para todos os arquivos deb dependentes do aplicativo principal.

Quando tento instalar o aplicativo principal usando dpkg -i , os comandos retornam uma falha ao tentar executar o script preinst. Abaixo está essa mensagem de erro:

dpkg: error: dpkg status database is locked by another process

Eu excluí o arquivo /var/lib/dpkg/lock e tentei instalar novamente o aplicativo. Mas sem sucesso. Se eu executar o script preinst separadamente, como qualquer outro script de shell, ele será executado sem nenhum problema. Todos os arquivos deb serão instalados corretamente. Então, o problema é apenas quando este script preinst está sendo executado automaticamente pelo dpkg -i command .

Estou perdido tentando determinar a causa raiz. Se alguém puder esclarecer qual seria o problema real, sua ajuda será muito apreciada.

Obrigado, ObsessiveSS0F pela sua resposta rápida.

Eu entendo o ponto que você está fazendo, mas isso não ajudará na minha situação. Deixa-me dizer-te porquê.

  1. Meu aplicativo principal (digamos mainapp.deb) depende de cinco outros arquivos .deb
    (digamos 1.deb, 2.deb e assim por diante).
  2. Os arquivos .deb dependentes são meus próprios pacotes / bibliotecas particulares. Então estes não são para download na web. Portanto, não posso usar o apt-get para instalá-los automaticamente.
  3. Eu faria o campo "Depends" no arquivo de controle para apontar para 1.deb, 2.deb..etc, mas como você sabe, o dpkg -i não instala automaticamente as dependências.
  4. Eu posso executar o dpkg -i, seguido do apt-get -f install, mas para o apt-get funcionar, eu tem que editar o arquivo /etc/apt/sources.list para adicionar uma referência ao diretório local no sistema onde os arquivos .deb dependentes são armazenados.
  5. Bem, o # 4 parece funcionar, mas não é uma opção para mim porque esse aplicativo será instalado em muitos servidores e o programa de instalação deve ser totalmente automatizado.

Continuei a investigar o motivo pelo qual o preinst não estava conseguindo instalar os arquivos .deb e acho que descobri o motivo.

  1. Quando executo o dpkg -i mainapp.deb, o processo do dpkg está criando o / var / lib / dpkg / lock
    e alguns arquivos no diretório / var / lib / dkpg / updates.
  2. Agora, o script preinst possui uma série de comandos dpkg -i para instalar o dependente. arquivos .deb. Então, assim que o primeiro comando dpkg -i no script preinst for executado, falha por causa dos bloqueios criados pelo comando dpkg anterior.
  3. Parece que dois comandos do dpkg não podem ser executados em paralelo por causa dos bloqueios.

Eu modifiquei o script preinst para fazer backup dos bloqueios criados pelo processo dpkg em um local temporário e excluí os bloqueios originais. (o comando lsof relatou que o bloqueios foram excluídos). Agora que os bloqueios foram eliminados, os comandos dpkg -i dentro do script preinst foram executados sem nenhum problema. Eu restaurei os bloqueios antes de sair do script preinst para que o comando primário dpkg -i pudesse continuar. Funcionou, mas tenho a sensação de que essa não é a abordagem correta.

Ainda estou tentando descobrir maneiras alternativas de instalar um arquivo .deb junto com suas dependências.

    
por Ashwin D 06.10.2012 / 01:46

2 respostas

1

Não é necessário usar um script preinst para instalar arquivos .deb. Você pode simplesmente adicionar dependências e, em seguida, empacotar usando um arquivo, e quaisquer dependências e pré-dependências serão instaladas automaticamente.

    
por hexafraction 06.10.2012 / 02:46
1

O pensamento de embaralhar arquivos de bloqueio me deixa desconfortável. Se é garantido não mexer com a instalação do aplicativo, então não parece que deve haver um problema, mas acredito que o script de pré-instalação é mais para coisas como parar os serviços que serão afetados pela instalação.

Parece que a causa raiz do problema é que o script de pré-instalação está sendo enviado pela operação do dpkg após o arquivo de bloqueio ter sido configurado. Parece provável que a maneira correta de fazer isso seja separar a instalação das dependências ou recompilar o aplicativo para que ele funcione com um ppa local e instale as dependências corretamente.

Eu estou querendo saber se não seria melhor configurar as dependências com --set-selection e processá-las com o dpkg antes ou depois de instalar o aplicativo. As dependências podem ser carregadas com:

sudo dpkg --set-selections & lt; dependency_files

Onde o dependency_files está no formato, por exemplo:

samba                   install
samba-common            install
samba-common-bin        install
samba-ldb-tools         install
samba4                  install
samba4-common-bin       install

Eu acredito que os arquivos podem ser instalados com

dpkg --selected-only

Pode até ser possível que o seu script de pré-instalação possa ser usado para a parte --set-selections da operação, pelo menos.

Quanto à re-embalagem, não posso ser de ajuda alguma, mas parece haver uma comunidade de mantenedores de pacotes que poderia ajudar:

link

link

    
por fabricator4 08.10.2012 / 16:10