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


23

Acabei de atualizar meu ubuntu lucid para natty, durante a atualização ele substituiu a maioria dos aplicativos em execução por uma versão mais recente.

Como é que isso funciona? (Os aplicativos não travam?) O que acontecerá com o aplicativo se um arquivo lib for atualizado e um aplicativo em execução que estiver procurando por uma lib mais antiga tentar carregá-lo?


Boa pergunta, mas provavelmente melhor perguntou aqui: unix.stackexchange.com (eu sei o URL diz Unix, mas eles responder perguntas de Linux também!)

Compreender a funcionalidade substituir-enquanto-aberto de Linux parece que ele ainda está programando (mas apenas mal :)
— bdonlan

2
@dondonlan: Se você estiver carregando dinamicamente bibliotecas durante a vida útil do seu processo, você deve estar muito ciente disso, caso contrário, ele poderá mordê-lo. Isso é especialmente importante se você está tentando fazer algo incomum, por exemplo, código auto-modificador etc. Mas sim, é limítrofe.
— Piskvor

1
Não é realmente relevante para o código modificado automaticamente, mas certamente é algo que alguém que escreve bibliotecas para Linux deve saber, sim. :)
— bdonlan

1
@Piskvor, soa um pouco como o processo de compilação de vários estágios para o gcc :) Mas basicamente apenas os compiladores fazem algo assim, e normalmente você não atualiza o sistema enquanto o faz (mesmo que o faça, desde que não 't rebaixamento nada enquanto ele está em processo, você está bem, uma vez que estará usando as suas cópias compilados privada de qualquer coisa onde importa)
— bdonlan

Respostas:


31

O 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 os identificadores abertos para o arquivo. Ao excluir um arquivo, você faz a unlink()ligação - isso apaga o link para o arquivo (você também pode rename()substituí-lo por um inode diferente). No entanto, se os identificadores abertos para o arquivo (ou outros links - os arquivos podem ter vários links físicos ), o inode permanece e o conteúdo do arquivo permanece, até que todos os links e identificadores desapareçam.

Portanto, a execução de programas usando a biblioteca ou qualquer outra forma mantém a versão antiga (geralmente implicitamente por meio de um mapeamento de memória), para que ela permaneça no disco. Ele simplesmente não possui mais um nome de arquivo e será limpo quando todos os programas que o utilizarem forem desligados (ou na próxima reinicialização, durante a verificação do sistema de arquivos ou a repetição do diário).

Além disso, observe que os programas que esperam a 'biblioteca antiga' se sairão bem com as versões mais recentes 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 em uma versão mais antiga da libc, mas ainda assim uma versão da libc que implementa a ABI da versão 6, funcionará bem com ele. Programas realmente antigos procurarão um libc.so.5ou libc.so.4ou algo; nesse caso, você também precisará manter a versão antiga - mas como o nome do arquivo é diferente, isso não é um problema.


9

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, os identificadores existentes usam o arquivo que existia quando eles foram criados. Em outras palavras, no Linux você pode ter arquivos / versões de arquivos que ainda existem, embora não exista mais um ponteiro para eles na estrutura de diretórios; aqueles que deixam de existir, não há nenhum indicador para eles (fechado e tudo).

Normalmente, um aplicativo em execução carrega as bibliotecas necessárias com antecedência, portanto o problema que você descreveu ocorreria apenas em situações de tempo muito específicas enquanto o pacote está sendo instalado: os aplicativos em execução ainda estão usando a versão antiga da biblioteca, os aplicativos recém-iniciados usam o novo 1.

Isso é usado não apenas nas atualizações de distribuição, mas acontece em todas as atualizações de pacotes (a dist-upgrade apenas adiciona mais algumas etapas de automagia nesse processo).


0

Muitos processos Linux continuam funcionando depois que os pacotes de onde eles vêm foram atualizados - mas alguns não. Na minha experiência, o KDE nunca funcionará corretamente se você o atualizar enquanto estiver em execução. É provável que você sofra falhas e / ou falhas no logout.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.