O que o apt-get install faz sob o capô?

54

O que o comando apt-get install ... faz?

Quando eu digito o comando apt-get install ... , há alguns textos aparecendo na tela, mas isso não tem informações suficientes para mim. Eu quero saber se algum arquivo é criado / editado, qualquer serviço é iniciado e outras atividades ...

Existe algum arquivo .sh executado quando o apt-get install ... é executado? Se sim, como posso ver o conteúdo desse arquivo sh ?

O motivo desta pergunta é recentemente tentei instalar o tomcat7 com apt-get install tomcat7 . Tudo funciona bem até que eu instale o tomcat7-admin (aplicativo web do gerenciador), o servidor não responde a nenhum pedido. Eu tentei isso muitas vezes, e isso sempre acontece.

    
por TrungDQ 24.10.2014 / 12:20

4 respostas

46

Principalmente, apt-get faz o seguinte:

  • verifica as dependências (e pede para instalá-las)
  • baixa o pacote, verifica e informa ao dpkg para instalá-lo.

dpkg :

  • extraia o pacote e copie o conteúdo para o local correto e verifique se há arquivos e modificações pré-existentes neles,
  • executar scripts do mantenedor de pacotes : preinst , postinst , (e prerm , postrm antes disso, se um pacote estiver sendo atualizado)
  • execute algumas ações com base nos acionadores

Você pode estar interessado nos scripts do mantenedor, que geralmente estão localizados em /var/lib/dpkg/info/<package-name>.{pre,post}{rm,inst} . Geralmente, são scripts de shell, mas não há regras rígidas. Por exemplo:

$ ls /var/lib/dpkg/info/xml-core.{pre,post}{rm,inst}
/var/lib/dpkg/info/xml-core.postinst
/var/lib/dpkg/info/xml-core.postrm
/var/lib/dpkg/info/xml-core.preinst
/var/lib/dpkg/info/xml-core.prerm
    
por muru 24.10.2014 / 12:30
29

Resumindo : apt-get install faz tudo o que é necessário para que seu sistema possa executar com êxito o novo aplicativo de software instalado.

Mais longo:

Preliminares:

Na página de manual :

  

Todos os pacotes requeridos pelo (s) pacote (s) especificado (s) para instalação   também será recuperado e instalado.

Esses pacotes são armazenados em um repositório na rede. Portanto, apt-get faz o download de todos os necessários em um diretório temporário ( /var/cache/apt/archives/ ). Eles serão baixados de um servidor web ou FTP. Eles são especificados no chamado sources.list ; uma lista de repositórios. A partir de então, eles são instalados um a um processualmente.

Os primeiros são os que não têm mais dependências; então nenhum outro pacote deve ser instalado para eles. Através disso, outros pacotes (que tinham dependências anteriormente) não têm mais dependências. O sistema continua fazendo esse processo repetidamente até que os pacotes especificados sejam instalados.

Cada pacote é submetido a um procedimento de instalação.

Instalação do pacote:

Em distribuições Linux baseadas no Debian, como o Ubuntu, esses pacotes estão em um formato padronizado especificado chamado: deb - The Formato do pacote binário Debian .

Esse pacote contém os arquivos a serem instalados no sistema. Além disso, eles contêm um arquivo de controle . Esse arquivo contém scripts que o sistema de empacotamento deve executar em uma situação específica; os chamados scripts do mantenedor . Esses scripts são divididos em:

  • preinst : antes da instalação dos arquivos na hierarquia de arquivos do sistema
  • postinst : após a instalação
  • prerm : antes da desinstalação
  • postrm : após a desinstalação

Existe uma imagem interessante, mostrando o procedimento de uma instalação de um novo pacote:

Existem também mais arquivos de controle, os mais importantes são os seguintes:

  • control : Uma lista das dependências e outras informações úteis para identificar o pacote
  • conffiles : Uma lista dos arquivos de configuração (geralmente aqueles em /etc )
  • debian-binary : contém a versão do pacote deb, atualmente 2.0
  • md5sums : Uma lista de md5sums de cada arquivo no pacote para verificar
  • templates : Um arquivo com descrições e diálogos de erros durante a instalação
por chaos 24.10.2014 / 13:44
10

Para o material abaixo do capuz , você precisará pegar a fonte do Apt. Bastante simples se você tiver repositórios de origem ativados:

apt-get source apt

O comando apt-get vive em cmdline/apt-get.cc . É difícil de ler, mas a maior parte das ações do apt-get está escrita extensivamente lá. No entanto, a instalação é mapeada por meio de uma função DoInstall , que vive em apt-private/private-install.{cc,h} .

Você deve se lembrar que o apt-get é apenas um lado da moeda.
dpkg está lidando com a instalação real, mas DoInstall não sabe sobre dpkg diretamente. O apt-get é surpreendentemente agnóstico do gerenciador de pacotes. Toda a funcionalidade é abstraída através de apt-pkg/package-manager.cc

Estou apenas observando brevemente, mas mesmo assim não consigo ver onde isso realmente é anexado aos sistemas dpkg . Parte disso parece ser autoconfigurada através de apt-pkg/aptconfiguration.cc , mas esse é um poço profundo. Você poderia passar dias desvendando isso.

A documentação de origem é boa. Você pode fazer coisas piores do que percorrer cada arquivo e ler o cabeçalho para descobrir o que realmente está acontecendo.

    
por Oli 24.10.2014 / 13:04
6

Existem algumas respostas fantásticas aqui que são melhores que esta curta, mas algo que você pode considerar para ajudá-lo a entender melhor as mudanças feitas por um gerenciador de pacotes é Docker Você pode diferenciar as alterações feitas em um contêiner usando docker diff <container> e ele mostrará todas as alterações. Isso é especialmente útil para dar uma olhada sob o capô para ver o que o apt-get install faz em um sistema. Uma pesquisa rápida fará com que você vários recursos para ajudar a implementar isso.

    
por L0j1k 25.10.2014 / 22:52