Este comando para remover kernels antigos é seguro?


21

Ao navegar na Internet por artigos do Ubuntu, deparei-me com este comando:

sudo dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d' | xargs sudo apt-get -y purge

O autor disse que este é um comando de linha única que excluirá todas as versões anteriores do Linux, deixando apenas a atual !

Na verdade, estou procurando por um comando desse tipo, mas não tenho tanta certeza de como isso é seguro. Eu gostaria de saber:

  • Se é seguro executar este comando?
  • Como esse comando funciona? ou seja, explicação de pequenas partes de um comando tão grande
  • Se esse comando servir a algum propósito diferente, qual seria o comando correto para alcançar o que o autor afirma que ele deve fazer?

Fico muito confuso e frustrado quando tento deduzir tudo sozinho. Como isso funciona de comando para que ele contém numerosos /, |, \, *, e ^personagens que são difíceis de Google para.

Estou procurando uma tradução e explicação passo a passo para este comando que não consegui encontrar na Internet!


1
Este não parece ser o mesmo comando que você citou, mas eu tenho usado o comando em tuxtweaks.com/2010/10/… para remover kernels antigos sem problemas. Esta página também explica o que o comando faz.
user68186

4
@UriHerrera apt-get autoremovenão sugere remoções de kernels antigos para mim. Se eu não excluí-los, eles simplesmente se acumularão até que meu /bootespaço acabe e as atualizações falhem. Você tem uma referência sobre isso que deve fazer isso?
gertvdijk

1
Faz isso para mim, sempre que há uma nova atualização para o kernel, diz depois que os seguintes pacotes etc não são mais necessários e lista o kernel anterior que eu tinha.
Uri Herrera

Minha resposta foi excluída por um moderador, por isso comento aqui: Consulte este artigo para obter explicações sobre o script. Não vejo por que uma parte do script é, e s/^[^ ]* [^ ]* \([^ ]*\).*/\1/não simplesmente s/^[^ ]* \([^ ]*\).*/\1/. O script não é muito robusto ou elegante. Por exemplo, por que verificar o kernel atual antes de extrair o nome do pacote da saída? Como alternativa, sudo apt-get autoremove --purgeelimina a maioria dos kernels antigos em uma versão mais recente do Ubuntu, como o Xubuntu 15.10.
24415 jarno

Respostas:


27

Eu diria: não use no formulário atual

  1. Faz alterações sem perguntar. A apt-get -y purgepeça permite que o one-liner comece a executar os pacotes de limpeza, sem a sua confirmação. Se houver algum erro no script, você poderá ser ferrado .

  2. Nenhuma fonte, nenhum autor fornecido. A fonte disso faz a diferença aqui. Caso venha de um pacote de sistema completamente testado, podemos rastrear os testes que estão sendo feitos nele. De uma fonte aleatória, não podemos confiar nela.

  3. dpkg -lcorre bem sem sudo. Não vejo por que o autor original achou que isso era necessário.

Use o senso comum

Remova as partes prejudiciais e deixe de fora qualquer coisa que corra como raiz.

Por exemplo, reduza para isso:

dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d'

que apenas produz coisas e roda com permissões de usuário regulares . Depois de concordar com a remoção desses kernels, você pode se anexar | xargs sudo apt-get purge . É sem a -yopção, intencionalmente, portanto, você será solicitado a confirmar as alterações a serem feitas no seu sistema.

Explicação

  • dpkg -lMostra a lista de todos os pacotes. Nesse caso, ele listará apenas os pacotes que começam com linux-o nome.
  • |(um canal) canaliza a saída do comando à esquerda (chamamos isso stdout) à entrada do comando à direita (chamamos isso stdin).
  • sedé uma ferramenta para manipular strings usando expressões regulares . Nesse caso, ele manipula a saída do comando à esquerda do pipe e filtra os pacotes instalados (dependendo do iique é fornecido por dpkg). Ele está sendo aninhado neste caso. Seria muito difícil explicar todo o uso sedaqui, pois seu uso é muito complicado com as complexas expressões regulares. ( \(.*\)-\([^0-9]\+\)"é um exemplo de expressão regular.
  • Expressões regulares são muito usadas para encontrar correspondências com base na expressão que representam. \1é a referência de substituição para fazer uma espécie de pesquisa e substituição universal (referenciando o primeiro 'hit' com 1). A própria expressão regular não pode causar nenhum mal. No entanto, se eles manipularem a entrada de maneira errada, poderão remover os pacotes errados ou até mesmo fazer a injeção do shell. Nesse caso, parece uma maneira de encontrar o nome do pacote do kernel com base na versão fornecida por uname -r.
  • uname -r gera a versão atual do kernel em execução.
  • xargsanexa as linhas da entrada esquerda do canal como argumentos ao comando. Nesse caso, as versões do kernel em cada linha são convertidas em uma lista separada por espaço horizontal e anexadas ao sudo apt-getcomando.
  • sudo apt-get -y purge [packagename] limpa (remove tudo) dos pacotes fornecidos (como argumentos).

Alternativas

Provavelmente já são feitas algumas perguntas sobre isso. Relevantes que encontrei até agora:


1
qual deve ser o rompimento do nó assustador deste comando, que é algo como isto /(.*)-([^0-9}\+)/\1/")"'/d;s/^[^ ] * [^] * ([^] *). * / \ 1 /; /
Bhavesh Diwan

o comando acima mencionado nesta resposta limpará os kernels antigos graciosamente? ou ainda apt-get autoremove é melhor ??
Bhavesh Diwan

4
@ Z9iT Essas são expressões regulares. Eles são usados ​​para encontrar correspondências com base na expressão que representam e \1é o controle de substituição para fazer uma espécie de pesquisa e substituição universal. Para remover qualquer pacote, eu me expressei claramente na minha resposta (sendo minha opinião): use o bom senso. Não deixe que um script faça alterações no seu sistema automaticamente. Verifique o que faria. Sempre.
precisa saber é

A alternativa que você apresenta não limpa os respectivos pacotes de cabeçalho linux.
Jarno

Em seguida, basta executar uma remoção automática do apt-get, que deve detectar que esses cabeçalhos não são mais necessários.
ben-Nabiy Derush

7

Você pediu uma explicação passo a passo, então aqui vai:

sudo dpkg -l 'linux-*'

Lista pacotes iniciados com linux-no nome do pacote

| sed

e canalize a lista sed

"s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d'

que usará uma expressão regular muito complicada para editar a lista

| xargs

que canalizará a nova lista xargs, que a enviará como argumento para

sudo apt-get -y purge

que eliminará esses pacotes sem lhe dar a chance de mudar de idéia.

Ou talvez seja mais preciso dizer que enviará essa lista para o comando de limpeza e deixará assim. Se alguma coisa é eliminada - e importante - exatamente o que é eliminado depende da saída dos comandos anteriores.

É seguro? Nesse caso, tudo depende de quão bem o autor da postagem em que você a encontrou entende expressões regulares e sedsintaxe. E há livros inteiros sobre esses dois tópicos.


6

Comecei dissecando os comandos, lendo a manpágina de cada um.

  • dpkg -l: list pacakges, portanto, listaria dpkg -l linux-*todos os pacotes iniciados com linux-(geralmente kernels).

  • sed: A saída de dpkg -l linux-*é canalizada sedcom várias expressões regulares que seddecodificam.

  • uname -r unameimprime informações do sistema

uname - imprime informações do sistema

O -ridentificador imprime especificamente as versões do kernel:

-r, --kernel-release imprime a versão do kernel

A saída de uname -ré então canalizada para sedcom mais expressões regulares, cuja saída é passada paraxargs

Portanto, xargsconverte a sedsaída em nomes de pacotes e os passa para os sudo apt-get purge -yquais responde automaticamente 'yes' a todos os prompts:

-y, --yes, --assume-yes Automatic yes to prompts; assuma "sim" como resposta a todos os prompts e execute de forma não interativa. Se ocorrer uma situação indesejável, como alterar um pacote retido, tentar instalar um pacote não autenticado ou remover um pacote essencial, o apt-get será cancelado. Item de configuração: APT :: Get :: Assume-Yes.

No geral, parece que este comando fará o que você deseja, embora tenha certeza de que teríamos que traduzir sedas expressões regulares do tradutor .

Eu apenas corri:

dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d'  

Aqui está uma captura de tela:

insira a descrição da imagem aqui

Todas as versões antigas do kernel iirc.


qual é o treino para traduzir a expressão desse sed?
Bhavesh Diwan

2
Eu estou tentando entender isso agora, pode demorar um pouco;)
Seth


@ Z9iT Eu estava com preguiça de copiar a explicação do script do artigo vinculado para a resposta, então acho que é por isso que Seth excluiu minha resposta. Mas acho que o artigo vinculado é o que você estava procurando na Internet. Eu também disse a você uma maneira mais segura de remover os kernels antigos, embora ele mantenha 2-3 kernels por precaução, e pode não funcionar em todas as versões atuais do Ubuntu ainda.
Jarno

@jarno Eu o apaguei porque o Z9iT estava perguntando sobre um comando específico , não uma maneira segura de remover os kernels antigos. Isso ainda pode ser relevante, mas em um comentário, não uma resposta :) (como fez)
Seth
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.