Não é possível fazer atualização de lançamento no Ubuntu 14.04

27

Atualmente estou tentando atualizar uma caixa do ubuntu 14.04 para o xenial. Eu estou tentando fazer release update, e sua falha com erros como UnicodeDecodeError: 'utf-8' codec não pode decodificar byte 0x96 na posição 382: byte de início inválido

Parece um bug conhecido - já tentei isso e não tive sorte em encontrar o pacote ofensivo, e desabilitei / removi meus dois arquivos package.lst não padrão para os repositórios de nodesource e veeam.

O traceback lê algo como isto

Traceback (most recent call last):
  File "/tmp/ubuntu-release-upgrader-woadaq_z/xenial", line 8, in <module>
    sys.exit(main())
  File "/tmp/ubuntu-release-upgrader-woadaq_z/DistUpgrade/DistUpgradeMain.py", line 242, in main
    if app.run():
  File "/tmp/ubuntu-release-upgrader-woadaq_z/DistUpgrade/DistUpgradeController.py", line 1876, in run
    return self.fullUpgrade()
  File "/tmp/ubuntu-release-upgrader-woadaq_z/DistUpgrade/DistUpgradeController.py", line 1757, in fullUpgrade
    if not self.doPostInitialUpdate():
  File "/tmp/ubuntu-release-upgrader-woadaq_z/DistUpgrade/DistUpgradeController.py", line 943, in doPostInitialUpdate
    self.tasks = self.cache.installedTasks
  File "/tmp/ubuntu-release-upgrader-woadaq_z/DistUpgrade/DistUpgradeCache.py", line 806, in installedTasks
    for line in pkg._pcache._records.record.split("\n"):
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x96 in position 382: invalid start byte
Error in sys.excepthook:
Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/problem_report.py", line 416, in add_to_existing
    self.write(f)
  File "/usr/lib/python3/dist-packages/problem_report.py", line 369, in write
    block = f.read(1048576)
  File "/usr/lib/python3.4/codecs.py", line 319, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8b in position 1: invalid start byte

Original exception was:
Traceback (most recent call last):
  File "/tmp/ubuntu-release-upgrader-woadaq_z/xenial", line 8, in <module>
    sys.exit(main())
  File "/tmp/ubuntu-release-upgrader-woadaq_z/DistUpgrade/DistUpgradeMain.py", line 242, in main
    if app.run():
  File "/tmp/ubuntu-release-upgrader-woadaq_z/DistUpgrade/DistUpgradeController.py", line 1876, in run
    return self.fullUpgrade()
  File "/tmp/ubuntu-release-upgrader-woadaq_z/DistUpgrade/DistUpgradeController.py", line 1757, in fullUpgrade
    if not self.doPostInitialUpdate():
  File "/tmp/ubuntu-release-upgrader-woadaq_z/DistUpgrade/DistUpgradeController.py", line 943, in doPostInitialUpdate
    self.tasks = self.cache.installedTasks
  File "/tmp/ubuntu-release-upgrader-woadaq_z/DistUpgrade/DistUpgradeCache.py", line 806, in installedTasks
    for line in pkg._pcache._records.record.split("\n"):
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x96 in position 382: invalid start byte
=== Command terminated with exit status 1 (Mon Apr  3 09:31:21 2017) ===

E não há nada realmente útil nos registros. Como eu conseguiria atualizar o release para funcionar?

    
por Journeyman Geek 03.04.2017 / 04:57

1 resposta

44

O que você tem aí é o próprio script de atualização tropeçando em dados inválidos em algum lugar. Você precisa encontrar e remover os dados inválidos.

Nesse caso, foi o pacote veeamsnap . Remover esse pacote deve consertá-lo. Mas como isso é diferente para cada caso, descreverei os passos dados para chegar a essa conclusão. É um processo bastante complicado.

É divertido, porque as strings de python3 devem estar todas em UTF-8. O que você tem aqui (descoberto depois do fato) é um módulo C ( apt_pkg ) de alguma forma inserindo dados não-UTF-8 em uma string python3, portanto quebrando todas as tentativas de ler a string - observe como o manipulador de erro lançou uma exceção também?

Para o desconhecido depurador , vamos!

A melhor maneira de diagnosticar problemas como este é fazer com que o depurador pause antes da linha falhar. Com o Python, quando você tem uma série de chamadas aninhadas como essa, a maneira mais fácil de adicionar uma pausa do depurador é editá-lo.

  1. Usando seu exemplo, podemos ver que a falha em questão está no arquivo /tmp/ubuntu-release-upgrader-woadaq_z/DistUpgrade/DistUpgradeCache.py line 806, então vamos abrir um editor de texto e ir para essa linha. O caminho temporário será diferente para cada execução, portanto, certifique-se de usar aquele da sua saída de erro!

  2. Apartirdaqui,podemosprimeiro adicionar uma simples pausa no depurador , inserindo import pdb; pdb.set_trace(); na linha 806 apenas antes do erro. Porque este é o Python, o recuo é importante!

  3. Agoraprecisamosexecutaroprogramamodificado.Nãoexecutedo-release-upgradenovamente;Issoprovavelmenteirábaixarumnovo.Vejanoslogsdeerro,aprimeiralinhadepoisde"exceção original"? Aquele com /tmp/ubuntu-release-upgrader-woadaq_z/xenial ? É esse que você quer correr. Então, execute esse arquivo, como root (ou sudo).

    Em execução, você deve entrar no depurador (pdb):

  4. Apartirdaqui,descobrimosquantospacotesexistemnototal.A maneira fácil de fazer isso é executar sum(1 for _ in self) . Espere um pouco (isso pode demorar um pouco) e vai imprimir um número. Nesse caso, foi 76028 .

    Agora, como o erro provavelmente não acontece nos primeiros passos, não queremos passar manualmente pelos pacotes > 75000, e não podemos adicionar um manipulador de exceções (porque o erro é tão ruim que quebra o próprio Python), precisamos de uma alternativa.

  5. Remova a linha adicionada no passo 4. Edite o código para imprimir um número incremental para cada pacote. Por exemplo, adicione foo = 0 acima do loop na linha 802 e foo += 1; print(foo) na linha 807 (logo antes da linha de erros).

  6. Executeocódigonovamente,usandoomesmocomandodaetapa3.Eleimprimiráumagrandelistadenúmeros.Deixe-ocontinuaratéqueoerrosejaimpressonovamente.Podesernecessárioampliarsuajanela:

    Esseúltimonúmerodeveseropacoteemqueelecaiu.Fiqueatentoaessenúmero.

  7. Agoraquevocêsabequalpacote/númerocausaafalha,éhoradeadicionarapausadodepuradorcomumacondiçãoparaserexecutadaapenasnessepacote.Porexemplo,sevocêfalharnopacote72285,adicioneiffoo==72285:importpdb;pdb.set_trace()logoapósalinhaqueimprimefoo:

  8. Executeocódigonovamente.Agora,quandovocêentrarempdb,eledeveestarnopacotequecausaafalha.Vocêpodedigitaronomedavariávelpkgparaimprimirseuvalor,queinformaráonomedopacoteatual:

    Mais geralmente, digitar o nome de qualquer variável imprimirá sua saída.

  9. Remova o pacote ofensivo e tente a atualização novamente (a partir de uma atualização de desbloqueio limpa).

por 03.04.2017 / 05:26

Tags