Como funciona o processo de atualização do Ubuntu?

9

Como o Ubuntu faz upgrade sem problemas para uma nova distribuição, enquanto o sistema operacional ainda está em execução? Estou atualizando de 10.10 para 11.04, e atualizei várias vezes antes, e é tão simples quanto executar o update-manager -d, baixá-los e instalá-los, depois reinicializar.

Como exatamente isso funciona? Como o gerenciador de atualização pode atualizar o sistema operacional enquanto ainda está em uso?

    
por IDWMaster 12.04.2011 / 01:50

5 respostas

3

Da minha experiência, eu diria que, enquanto os pacotes e módulos estão sendo executados, eles são mantidos na memória e não se referem muito à sua cópia no disco rígido. Você pode ver isso se você executar um programa no Ubuntu e, em seguida, remover os pacotes relacionados enquanto ele está sendo executado. Ele continuará funcionando, mas se você fechá-lo, não poderá reiniciá-lo.

Eu diria que o mesmo acontece com uma atualização de distribuição. Todos os pacotes relacionados à versão original do ubuntu ainda estão em execução, mesmo que tenham sido removidos e substituídos por novos, portanto, quando eles forem finalmente interrompidos em uma reinicialização do sistema, os novos pacotes assumem o controle.

    
por Slipstream 12.04.2011 / 01:55
12

Aqui, uma descrição mais detalhada do processo. Desculpe o texto ficou tão longo.

Minha experiência vem do Debian, para o qual todo o sistema de empacotamento e atualização usado no Ubuntu foi originalmente inventado. Os upgrades diários de segurança do Ubuntu correspondem à execução de apt-get upgrade , que normalmente não remove nenhum software. Os grandes upgrades de lançamento correspondem a um apt-get dist-upgrade durante o qual os pacotes de software podem ser trocados completamente.

Na verdade, os componentes de nível muito baixo normalmente não são trocados durante uma atualização de versão. Imediatamente após a atualização, você deve encontrar duas imagens do kernel e initrd no diretório / boot. Isso ocorre porque, ao contrário dos componentes do kernel, os programas não são intercambiáveis tão bem. Se surgir a necessidade de carregar novos drivers de dispositivo durante a atualização, eles devem ser compatíveis com o kernel em execução. Após o sistema inicializar com o novo kernel, o antigo pode ser removido. A última vez que verifiquei que uma coisa tinha que ser feita manualmente, não sei como o atualizador atual lida com isso. Isso é BTW. a principal razão, porque a imagem do kernel tem seu número de versão no nome do arquivo - assim você pode ter diferentes versões de kernel instaladas ao mesmo tempo. O mesmo para o caminho do módulo (/ lib / modules /...)

Os pacotes de software são atualizados um por um, iniciando com os pacotes mais baixos na hierarquia de dependências. Essas são normalmente bibliotecas de programas como libc e outras. A seqüência na qual os pacotes são atualizados, no entanto, não é codificada, mas é calculada dinamicamente à medida que as dependências de pacotes são resolvidas. Na maioria dos casos, os programas antigos podem funcionar com novas bibliotecas, por isso não é tão problemático se essas bibliotecas forem substituídas primeiro.

Você tem que entender aqui, que o sistema diferencia entre pacotes manualmente instalados (isto é, os pacotes que a instalação você solicitou diretamente, por exemplo, chromium) e pacotes instalados automaticamente, onde instalados apenas para atender dependências de pacotes instalados manualmente (e dependências dessas dependências).

Para cada programa instalado manualmente, o atualizador procura apenas uma versão mais recente. Frequentemente, esses programas são apenas pacotes meta, como o "ubuntu-desktop", que não contém dados e apenas dependências. Novas versões de bibliotecas dependentes serão inseridas, pois são solicitadas por programas atualizados diretamente (manualmente solicitados). O atualizador sempre tentará instalar a versão mais recente utilizável de qualquer pacote dependente (durante qualquer atualização não apenas para liberar atualizações).

Os programas que não podem funcionar com as novas versões da biblioteca não podem ser iniciados durante o tempo após a atualização da biblioteca, e antes que o próprio programa seja atualizado também. Se esses programas já estiverem em execução antes da atualização da biblioteca, eles continuarão a ser executados, porque a versão antiga da biblioteca permanece na memória enquanto permanecer em uso. O mesmo vale para programas que foram iniciados antes de serem atualizados. Aqueles não fornecerão novos recursos até que sejam finalizados e reiniciados.

Após a atualização, algumas bibliotecas (ou dependências em geral) ficarão órfãs. Essas são bibliotecas que eram requeridas por versões antigas do programa, mas não são mais requeridas pelas novas versões. Como esses pacotes são marcados como instalados automaticamente e como nenhum prgram instalado manualmente está relacionado a eles, esses pacotes podem ser facilmente localizados e removidos. Você pode até observar isso como o último passo do processo de atualização (o updater sais "removendo pacotes obsoletos" ou algo similar).

Alguns pacotes serão instalados, os quais, quando não instalados antes, são simplesmente novas dependências, que são marcadas como instaladas automaticamente e podem ser removidas, caso a necessidade para elas desapareça no futuro.

Esse mecanismo permite até mesmo a troca de programas de usuários inteiros. Como, por exemplo, mudar do Gnome2 para o Unity. Já que ambos são apenas dependências automáticas do ubuntu-desktop, que é um dos poucos pacotes, para os quais novas versões são realmente requisitadas em primeiro lugar.

Os programas normalmente não dependem de uma versão específica do kernel do SO, então eles normalmente funcionam bem com o kernel em execução.

Além de tudo isso, eu suspeito que o atualizador do Ubuntu lança algumas correções e soluções específicas na mistura, para contornar situações em que essa teoria é quebrada.

Como você pode ver durante a atualização, há condições muito boas em que o sistema só pode ser usado para uma parte limitada. Se algo der errado durante a atualização, você provavelmente ficará com um sistema quebrado. Frequentemente, mesmo um que não pode ser facilmente reparado, já que o programa de atualização também pode ser afetado. Lembre-se, programas com dependências quebradas podem continuar a funcionar, mas não podem ser reiniciados, desde que as dependências sejam quebradas, isto também vale para o atualizador.

Você pode usar o programa de linha de comando apt-mark para descobrir quais pacotes estão marcados como instalados manualmente e quais foram instalados automaticamente. Você também pode trocar essas marcas usando o mesmo programa. Isso afetará diretamente o processo de atualização.

Em uma configuração de software mais complexa, o atualizador algumas vezes solicita que você resolva uma dependência manualmente. Ou seja quando um programa instalado manualmente é atualizado e solicita uma nova versão de uma biblioteca, enquanto outro programa instalado manualmente depende da versão antiga da mesma biblioteca e não pode trabalhar com a nova. Você então terá que fazer sua escolha, seja para renunciar a um desses programas ou para evitar a atualização de ambos. Como as dependências costumam ser complexas, isso pode ficar muito confuso muito rápido (você pode ter ouvido falar do termo "inferno da dependência").

Agora, para as perguntas específicas:

  1. Quando a infraestrutura de baixo nível é alterada (de baixo nível, como no kernel, drivers, bibliotecas, etc., qualquer coisa com a qual um usuário não interage diretamente), o que acontece com os binários obsoletos?
    • OK ... eu já cobri esse aqui
  2. O que acontece com um aplicativo que foi totalmente suspenso? Por exemplo, Unity 2D (ou qualquer outro software abandonado / nenhum mantenedor cujo pacote não esteja em um novo repositório).
    • Se o aplicativo tiver sido instalado manualmente, ele permanecerá no sistema, muitas vezes causando a dependência que descrevi.
  3. ubuntu-desktop é um metapacote que puxa os aplicativos padrão do Ubuntu como dependências. Se eu removi o Firefox e instalei o Chrome, o Firefox ainda será puxado como parte das atualizações?
    • Desde que seja o navegador padrão da nova versão, sim. O Chromium também será atualizado. Não tenho certeza se você pode remover o Firefox sem remover o ubuntu-desktop. Observe que, além das dependências estritas, o sistema de pacotes também conhece o conceito de recomendações, em que um software normalmente é instalado como uma dependência, mas pode ser desinstalado posteriormente sem afetar nada além de suas próprias dependências.
  4. Além disso, o que acontece se um único aplicativo costumava depender do pacote-x e não o faz mais em uma nova versão; O pacote-x será atualizado junto com o resto dos pacotes, apesar de ser órfão?
    • Não.

Pergunte-me se ainda tem mais alguma questão.

    
por Paul Hänsch 31.10.2012 / 05:16
3

No nível do sistema de arquivos, ao contrário do Windows, em um sistema Unix, você pode excluir os arquivos que estão abertos. A exclusão apenas remove o nome do arquivo, não seu conteúdo, portanto, qualquer programa que ainda tenha o arquivo aberto ainda poderá acessá-lo até que ele feche o arquivo, e somente então os dados serão liberados.

Portanto, o processo de atualização simplesmente remove os arquivos antigos, substitui-os pelos novos e, para determinados serviços do sistema, os reinicia para que a nova versão seja executada.

Há um ou dois componentes que não podem ser reiniciados sem a reinicialização de todo o computador, portanto, depois de atualizá-los, você será solicitado a reinicializar para usar a nova versão.

    
por psusi 12.04.2011 / 03:07
2

Como o Linux pode se atualizar enquanto ainda está em uso?

Principalmente porque o Linux (e com isso, a maioria das distribuições) é simplesmente projetado dessa maneira. Ser capaz de atualizar um pacote em um sistema em execução é uma meta para a maioria das distribuições baseadas em Linux.

No Linux, não há nada que impeça o processo do gerenciador de pacotes de gravar em um arquivo no disco, mesmo que esse arquivo esteja aberto no momento por um aplicativo ou o arquivo seja uma biblioteca de códigos executável ou compartilhada atualmente em execução . Em um nível muito baixo, há bloqueios que protegem o acesso a um arquivo durante uma única operação de gravação / leitura, mas eles nunca são projetados para serem mantidos por mais de uma questão de milissegundos e qualquer outro aplicativo que tente gravar no mesmo arquivo vai simplesmente esperar os milissegundos.

Você pode substituir um arquivo executável durante a execução e ele não fará nada no processo em execução, porque o processo não precisa mais do arquivo no disco - todo o código já foi carregado na memória.

É por isso que no Linux, mesmo que você possa atualizar um aplicativo enquanto ele está em execução, a atualização não entrará em vigor até que o aplicativo atualizado seja reiniciado. No caso de atualizar um processo em segundo plano, como um serviço do sistema, esse serviço precisaria ser reiniciado. No caso de você ter atualizado o kernel, isso significa uma reinicialização.

Não substituirá os arquivos de um programa enquanto ele estiver executando alguns programas?

Alguns dos pacotes em uma distribuição Linux conterão instruções de instalação instruindo o gerenciador de pacotes a parar determinados serviços do sistema enquanto o pacote é atualizado, e reiniciar esses serviços após a conclusão da atualização. Isso evita situações em que, por exemplo, os arquivos de configuração de um determinado serviço são atualizados e a versão em execução do serviço talvez não consiga lidar com a versão mais recente dos arquivos de configuração.

Em geral, aplicativos de usuário regulares não exigem a execução de arquivos de configuração, exceto os arquivos que ele gera e coloca em locais como os diretórios iniciais dos usuários. Então, eles não serão tocados pelo gerenciador de pacotes durante a atualização.

    
por thomasrutter 31.10.2012 / 05:49
-2

Isso é semelhante a outro recurso. Espero que isso ajude a entender o processo básico.

Estou me referindo à capacidade de "mudar a raiz" quando o sistema operacional inicializa.

Quando o sistema operacional está inicializando, o sistema de arquivos raiz (leia-se: "/") está inicialmente disponível apenas na RAM. Enquanto este processo de inicialização está em execução, ele alterna / da RAM para o / filesystem no disco rígido.

    
por rigved 12.04.2011 / 09:25