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

11

Como o Ubuntu atualiza perfeitamente para uma distribuição mais recente, enquanto o sistema operacional ainda está em execução? Estou atualizando da 10.10 para a 11.04, e já atualizei várias vezes antes, e é tão simples quanto executar o update-manager -d, fazer o download e instalá-los e depois reiniciá-los.

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

bbosak
fonte
Ok, adicionar minha pergunta no comentário de recompensa não foi uma boa ideia. Também não parece que eu possa editá-lo.
Oxwivi

Respostas:

3

Pela minha experiência, eu diria que, enquanto os pacotes e módulos estão em execução, 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 executar um programa no ubuntu e remover os pacotes relacionados enquanto estiver em execução. 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, apesar de terem sido removidos e substituídos pelos novos; portanto, quando são finalmente interrompidos na reinicialização do sistema, os novos pacotes assumem o controle.

Slipstream
fonte
Isso também explicaria por que noto novos recursos sendo adicionados a alguns menus à medida que a atualização avança.
bbosak
15

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

Minha experiência deriva do Debian, para o qual todo o sistema de empacotamento e atualização usado no Ubuntu foi originalmente inventado. As atualizações diárias de segurança do Ubuntu correspondem à execução, apt-get upgradeque normalmente não remove nenhum software. As atualizações de grande lançamento correspondem a um apt-get dist-upgradeperíodo 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 do initrd no diretório / boot. Isso ocorre porque, diferentemente dos programas, os componentes do kernel não são tão intercambiáveis. 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 atual atual lida com isso. Aqui é o BTW. a principal razão pela qual a imagem do kernel possui seu número de versão no nome do arquivo - para que você possa ter diferentes versões do 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, começando com os pacotes mais baixos na hierarquia de dependências. Normalmente, são bibliotecas de programas como libc e outras. A sequência na qual os pacotes são atualizados não é codificada, mas calculada dinamicamente à medida que as dependências do pacote são resolvidas. Na maioria dos casos, programas antigos podem funcionar com novas bibliotecas, portanto, não é tão problemático se essas bibliotecas forem substituídas primeiro.

Você precisa entender aqui que o sistema diferencia entre pacotes instalados manualmente (por exemplo, os pacotes cuja instalação você solicitou diretamente, por exemplo, chromium) e pacotes instalados automaticamente, que somente foram instalados para atender às dependências dos pacotes instalados manualmente (e dependências dessas dependências) )

Para cada programa instalado manualmente, o atualizador procura apenas uma versão mais recente. Freqüentemente esses programas são apenas meta-pacotes como "ubuntu-desktop", que não contém dados e apenas dependências. Novas versões de bibliotecas dependentes serão acessadas, pois são solicitadas por programas atualizados diretamente (solicitados manualmente). O atualizador sempre tentará instalar a versão mais nova utilizável de qualquer pacote dependente (durante qualquer atualização, não apenas as 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 o upgrade da biblioteca e antes do upgrade do próprio programa. Se esses programas já devem estar em execução antes da atualização da biblioteca, eles continuarão sendo executados, porque a versão antiga da biblioteca permanece na memória enquanto permanecer em uso. O mesmo vale para os programas que foram iniciados antes de serem atualizados. Esses 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 foram requeridas pelas versões antigas do programa, mas não são mais necessárias pelas novas versões. Como esses pacotes são marcados como instalados automaticamente, e como nenhum prgram instalado manualmente se relaciona com eles, esses pacotes podem ser facilmente localizados e removidos. Você pode até observar isso como a última etapa do processo de atualização (o atualizador diz "removendo pacotes obsoletos" ou algo semelhante).

Alguns pacotes serão instalados, que antes não eram instalados, essas são simplesmente novas dependências, marcadas como instaladas automaticamente e podem ser removidas, caso o requisito para eles desapareça no futuro.

Esse mecanismo ainda permite a troca de programas de usuários inteiros. Como, por exemplo, mudar do Gnome2 para o Unity. Como 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 solicitadas em primeiro lugar.

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

Além de tudo isso, suspeito que o atualizador Ubuntu libere algumas correções específicas e soluções alternativas para contornar situações em que essa teoria se rompe.

Como você pode ver durante a atualização, existem condições muito boas nas quais o sistema pode ser usado apenas por uma parte limitada. Se algo der errado durante a atualização você vai provavelmente ser deixado com um sistema quebrado. Muitas vezes, mesmo um que não pode ser reparado com facilidade, pois o programa de atualização também pode ser afetado. Lembre-se de que programas com dependências quebradas podem continuar funcionando, mas não podem ser reiniciados, desde que as dependências estejam quebradas, isso também vale para o atualizador.

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

Em uma configuração de software mais complexa, o Atualizador às 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 funcionar com o novo. Você terá que fazer sua escolha, para abandonar um desses programas ou abster-se de atualizar os dois. Como as dependências costumam ser complexas, isso pode ficar muito confuso muito rápido (você deve ter ouvido falar do termo "inferno das dependências").

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., tudo o que um usuário não interage diretamente), o que acontece com os binários preteridos?
    • OK ... eu já cobri esse
  2. O que acontece com um aplicativo que foi completamente reprovado? Por exemplo, o Unity 2D (ou qualquer outro software abandonado / sem mantenedores cujo pacote não esteja em novo repositório).
    • Se o aplicativo já foi instalado manualmente, ele permanecerá no sistema, causando muitas vezes a dependência que descrevi.
  3. O ubuntu-desktop é um metapacote que puxa aplicativos padrão do Ubuntu como dependências. Se eu removi o Firefox e instalei o Chrome, o Firefox continuará sendo usado 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, onde um software normalmente será instalado como uma dependência, mas poderá 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 na nova versão; o pacote-x será atualizado juntamente com o restante dos pacotes, apesar de órfão?
    • Não.

Apenas me pergunte se você ainda tiver mais perguntas.

Paul Hänsch
fonte
Você pode vincular a mais documentos relacionados ao inferno de dependência (me lembra o termo DLL do inferno)? Eu uso instalações mínimas do Ubuntu e quero descobrir como a atualização funcionará para mim.
#
Acho que tudo o que você encontrará na internet sobre o inferno da dependência são reclamações. Leia suas páginas de manual do apt, como man apt-get. Acho que muitas vezes é útil usar a versão especificando sintaxe de comando como apt-get -t intrepid install foo/jaunty bar/oneiricetc ..., apenas exemplos. Na verdade, isso faz mais sentido com o Debian, onde você às vezes mistura lançamentos; no Ubuntu, isso é menos usual. Tópicos interessantes também podem ser apropriados para fixar e definir pacotes em espera.
Paul Hänsch
3
Você ganhou o prêmio pela resposta mais longa sem código que já vi na rede Stack Exchange.
22413 Patrick
3

No nível do sistema de arquivos, diferente 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 o conteúdo, para que qualquer programa que ainda tenha o arquivo aberto ainda possa acessá-lo até fechar o arquivo, e somente então os dados serão liberados.

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

Há um ou dois componentes que não podem ser reiniciados sem a reinicialização de todo o computador; portanto, após a atualização, você será solicitado a reinicializar para usar a nova versão.

psusi
fonte
2

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

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

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

Você pode substituir um arquivo executável enquanto estiver em 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 seu código já foi carregado na memória.

É por isso que no Linux, mesmo que você possa atualizar um aplicativo enquanto estiver em execução, a atualização não terá efeito até que o aplicativo que você atualizou 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ê atualizar o kernel, isso significa uma reinicialização.

A substituição dos arquivos de um programa enquanto ele está em execução interrompe alguns programas?

Alguns dos pacotes em uma distribuição Linux conterão instruções de instalação instruindo o gerenciador de pacotes a interromper certos serviços do sistema enquanto o pacote é atualizado e reinicie 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 serviço específico são atualizados e a versão em execução do serviço pode não ser capaz de lidar com a versão mais recente dos arquivos de configuração.

Em geral, os aplicativos regulares do usuário não requerem arquivos de configuração para serem executados, exceto os arquivos gerados por si próprios e colocados em locais como os diretórios pessoais dos usuários. Portanto, eles não serão tocados pelo gerenciador de pacotes durante a atualização.

thomasrutter
fonte
Já estou ciente de todos esses detalhes. Por favor, leia o comentário que fiz com minha recompensa. Quero saber exatamente como o Ubuntu, ou seja apt, lida com certos pacotes e dependências durante o processo de atualização.
Oxwivi 31/10/12
-2

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

Estou me referindo à capacidade de "alternar raiz" quando o sistema operacional é inicializado.

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

manipulado
fonte
1
Não, o mecanismo chroot não é usado durante a atualização do sistema. A atualização é realizada no sistema de arquivos ao vivo. Você pode até assistir os menus do seu programa sendo reconstruídos e os ícones do programa mudando à medida que são substituídos. Mas o mecanismo chroot é usado em uma instalação original do sistema, quando um sistema novo é "desbootado" em um ambiente raiz alterado em uma partição de disco recém-criada.
Paul Hänsch