Como a atualização de binários de aplicativos em execução durante uma atualização funciona?

20

Acabei de atualizar meu ubuntu lúcido para natty, durante a atualização substituiu a maior parte do executando aplicativos com uma versão mais recente.

  

Como isso funciona? (Os aplicativos não irão travar?)   O que acontecerá com o aplicativo se um arquivo lib tiver sido atualizado e um aplicativo em execução que estiver procurando por um lib mais antigo tentar carregá-lo?

    
por srinathhs 20.05.2011 / 16:21

3 respostas

28

Linux (e outros UNIXes) faz uma distinção entre o nome de um arquivo (o link ), o próprio arquivo (geralmente identificado com o inode ) e abra identificadores para o arquivo. Quando você vai apagar um arquivo, você chama o unlink() call - isso apaga o link ao arquivo (você também pode usar rename() para sobrescrevê-lo com um inode diferente). No entanto, se os identificadores abertos do arquivo (ou outros links - arquivos puderem ter vários hardlinks ) permanecerem, o inode permanecerá, assim como o conteúdo do arquivo, até todos os links e alças vão embora.

Portanto, executar programas usando a biblioteca ou qualquer outra coisa mantém o controle da versão antiga (geralmente implicitamente através de um mapeamento de memória), para que ela permaneça no disco. Ele simplesmente não tem mais um nome de arquivo e será limpo quando todos os programas que o utilizam desligar (ou na próxima reinicialização, durante a verificação do sistema de arquivos ou a reprodução do diário).

Além disso, observe que os programas que esperam a 'biblioteca antiga' funcionarão bem com as versões mais novas da biblioteca. As bibliotecas Linux recebem um nome de arquivo ('soname') que reflete a versão da ABI (Application Binary Interface) oferecida pela biblioteca. Por exemplo, a biblioteca C no meu sistema é libc.so.6 . Qualquer programa compilado com uma versão mais antiga da libc, mas ainda uma versão da libc implementando a versão 6 da ABI, funcionará bem com ela. Programas realmente antigos procurarão por libc.so.5 ou libc.so.4 ou algo assim; Nesse caso, você também precisaria manter a versão antiga - mas como o nome do arquivo é diferente, isso não é um problema.

    
por bdonlan 20.05.2011 / 16:33
8

Ao contrário do Windows, você pode excluir ou substituir um arquivo aberto; para dar uma explicação simplificada , novas solicitações para os arquivos abrem o novo arquivo, as alças existentes usam o arquivo que existia quando foram criadas. Em outras palavras, no Linux você pode ter versões de arquivos / arquivos que ainda existem, embora não haja mais um ponteiro para elas na estrutura de diretórios; aqueles que deixam de existir não há nenhum ponteiro para eles (fechados e todos).

Normalmente, um aplicativo em execução carrega as bibliotecas necessárias na frente, para que o problema descrito ocorra apenas em situações de tempo muito específicas enquanto o pacote está sendo instalado: os aplicativos em execução ainda usam a versão antiga da biblioteca, aplicativos recém-iniciados use o novo.

Isso é usado não apenas em atualizações de distro, mas acontece em cada atualização de pacote (o dist-upgrade apenas adiciona mais algumas etapas de automagic a esse processo).

    
por Piskvor 20.05.2011 / 16:29
0

Muitos processos do Linux continuam funcionando depois que os pacotes de onde eles vêm são atualizados - mas outros não. Na minha experiência, o KDE nunca funciona corretamente se você fizer o upgrade enquanto estiver rodando. É provável que você sofra falhas e / ou falhas no logout.

    
por Robin Green 20.05.2011 / 16:37

Tags