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?
Respostas:
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 poderename()
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 umlibc.so.5
oulibc.so.4
ou algo; nesse caso, você também precisará manter a versão antiga - mas como o nome do arquivo é diferente, isso não é um problema.fonte
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).
fonte
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.
fonte