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.