Como desinstalar o X Server e o Desktop Manager ao executar como servidor sem cabeça?

88

Estou usando o meu Raspberry Pi como um servidor sem cabeça no qual posso fazer o SSH. Não preciso do X Server, LXDE etc.

Estou executando o Raspbian "chiado". Eu já desabilitei "Iniciar a área de trabalho na inicialização" usando raspi-configcomo descrito aqui . Mas eu continuo recebendo muitas atualizações de pacotes para todas as coisas da área de trabalho que não uso (eu corro o apticron para me notificar sobre atualizações pendentes por e-mail), então eu gostaria de completar completamente apt-get removetodos os pacotes desnecessários para evitar essas atualizações desnecessárias.

Quais pacotes devo remover?

Até agora, eu vim com o seguinte:

sudo apt-get remove desktop-base lightdm lxappearance lxde-common lxde-icon-theme lxinput lxpanel lxpolkit lxrandr lxsession-edit lxshortcut lxtask lxterminal obconf openbox raspberrypi-artwork xarchiver xinit xserver-xorg xserver-xorg-video-fbdev

Eu fiz a lista acima procurando no aptitude todos os pacotes na seção Pacotes Instalados -> x11 -> principal que não eram "instalações automáticas".

Por alguma razão, quando executo isso, apt-getdiz-me que:

The following extra packages will be installed:
  libutempter0 xbitmaps xterm

o que parece um pouco estranho para uma operação de remoção .

Existe uma maneira mais fácil? Existe um pacote "super" que possui todas essas coisas gráficas e pode ser removido, levando todas as suas dependências? Pelo que entendi, não parece possível, porque essas coisas não foram instaladas automaticamente, o que significa que preciso rastrear todas elas e removê-las explicitamente.

Dia
fonte

Respostas:

85

TL; DR ou "Basta queimar meu pi"

sudo apt-get remove --auto-remove --purge 'libx11-.*'
sudo apt-get autoremove --purge

(Repita apt-get autoremove --purgeaté que nenhum órfão permaneça)

Mais explicações

Se um pacote foo depende de outro pacote libfoo e você remove o pacote libfoo , o dependente ( foo ) também é removido. Como o Foo tem uma linha dependente que especifica o libfoo , seria quebrado para deixar o foo se o libfoo fosse removido. O inverso não é verdadeiro: remover foo não exclui o libfoo automaticamente. Outro pacote xfoo também pode depender do libfoo, portanto, o apt não o removerá (embora o apt rastreie se ele foi instalado apenas como um efeito colateral da instalação do foo e ofereça-o para removê-lo automaticamente, se você pedir, desde que outros ainda dependam dele)

Os meta-pacotes dependem de um conjunto de outros pacotes da mesma maneira que foo dependia do libfoo ; portanto, quando você remove um meta-pacote, pouco mais é normalmente removido. Por exemplo, pode haver dois meta-pacotes que dependem do xterm (lxsession e xfsession talvez), mas desinstalar um ou ambos não desinstalará o xterm porque o xterm não está quebrado sem o lxsession ou o xfsession. Meta-pacotes geralmente estão no topo da árvore de dependência, não na parte inferior, e poucas coisas tendem a depender diretamente dos meta-pacotes. Os meta-pacotes fornecem principalmente uma maneira conveniente de instalar um conjunto razoável de pacotes de uma só vez, mas não são ferramentas de desinstalação.

Portanto, se você deseja escalonar tudo o que depende do X11, precisará direcionar o conjunto básico de bibliotecas libx11 das quais todos os aplicativos x11 devem depender:

sudo apt-get remove --dry-run --auto-remove --purge 'libx11-.*'
sudo apt-get autoremove --dry-run --purge

Isso irá (simular) remover tudo o que depende da libx11 -. * E também removerá todos os pacotes que foram instalados como uma dependência de um programa X11, mesmo que eles não dependam diretamente do próprio X11 (o CUPS e o Ghostscript geralmente são instalados como efeito colateral da instalação de um ambiente de área de trabalho). O segundo comando removerá os órfãos subseqüentes até que nenhum permaneça. Remova "--auto-remove" se você quiser executar esta etapa mais tarde ou não fazer nada, ou apenas adicione os pacotes manualmente depois de limpar a GUI.

Remova a opção --dry-run para realmente executar a operação depois de verificar se ela não removerá os pacotes que você não pretendia remover.)

Prefiro limpar e purgar os efeitos colaterais e adicioná-los novamente, conforme necessário. Além disso, fui em frente e testei isso no meu próprio pi, e ele foi reiniciado em um servidor muito espartano, mas funcional. :)

Por que um remover instala algo?

A estratégia acima resolve o problema indicado, mas ainda há a curiosidade de por que um remove operação resulta em pacotes que estão sendo instalados .

No coração de todo gerenciador de pacotes está um solucionador de satisfação de algum tipo. Quando você instrui um gerente de pacotes a instalar alguns pacotes, remover alguns pacotes ou atualizar alguns pacotes, o que você realmente está pedindo é que resolva o próximo estado desejado de instalação do software, considerando um conjunto de pacotes disponíveis. Essa solução pode incluir a instalação de pacotes adicionais (dependências), a remoção de pacotes existentes (conflitos, quebras), a atualização / atualização de pacotes específicos (nível de compatibilidade) ou uma combinação deles. Portanto, embora seja um pouco contra-intuitivo que o solucionador determine que alguns pacotes precisam ser instalados para que outros sejam removidos, faz todo o sentido. Esse é o grave problema de gerenciamento de dependências que os gerenciadores de pacotes resolvem.

Um exemplo concreto: dado um conjunto de aplicativos Java já instalados, todos eles dependem de um tempo de execução compatível com java que atualmente é openjdk-7-jre . Em seguida, você solicita ao gerenciador de pacotes que resolva a instalação de uma nova ferramenta Java que declare um conflito com o openjdk-7-jre, mas trabalhe com o oracle-7-jre (ambos os pacotes geralmente fornecem um java-7-runtime ). O solucionador proporá uma remoção do openjdk-7-jre e uma instalação do oracle-java-7-jrecomo a solução para o estado desejado de instalação do novo pacote sem interromper os pacotes existentes.

Neste específico caso, o xterm é uma embalagem que proporciona uma dependência virtual chamados terminal X-emulador ( xterm , lxterminal , e aterm todos fornecer um terminal X-emulador ), por isso é provável que na remoção lxterminal (como uma parte de removendo o lxde), o solucionador encontrou um pacote instalado existente ( transcode como um possível exemplo) que exigia algum tipo de emulador de terminal x ; portanto, o solucionador optou por instalar o xterm (que requer libutempter0 e xbitmaps, explicando os outros pacotes a serem instalados) para satisfazer a dependência quebrada. Sem ver o banco de dados do pacote, eu hipotetizaria que esse é o cenário mais provável.

Para descobrir os pacotes que atualmente dependem do xterm (ou de uma alternativa), use o comando apt-cache rdepends (usando a opção --installed para limitar apenas os pacotes instalados):

$ apt-cache --installed rdepends xterm
xterm
Reverse Depends:
    |xorg
     clusterssh
    |xinit
    |tk8.5
    |tk8.4
    |transcode

Dependências que começam com o caractere de alternância '|' significa que o pacote depende do xterm ou de algo que ele fornece (que algo é emulador de terminal x nesse caso). O pacote clusterssh depende explicitamente do xterm e não permite uma alternativa. Esta é a lista curta dos pacotes que estão causando o xterm ser necessário.

E o deborphan?

A funcionalidade de rastreamento de órfãos foi incorporada ao apt-get através da funcionalidade 'autoremove' em 2010 (Debian bug 582791 ), tornando o deborphan principalmente redundante e essencialmente obsoleto. Diferentemente do deborphan e de outras soluções, o apt-get rastreia diretamente quais pacotes foram explicitamente instalados e quais foram instalados como efeito colateral ou dependência de um pacote explicitamente instalado. Por exemplo, se um administrador instala foo, libfoo é instalado como um efeito colateral e apt-get autoremove vontade , de fato, remover libfoo se autoremove (ou --auto-remove) é especificado quando remover foo.

A abordagem adotada pelo deborphan é uma coleção de suposições. Por exemplo, a suposição de que uma biblioteca instalada que não possui um dependente deve ser órfã: se o libfoo estiver instalado, mas nem foo nem xfoo , o deborphan pode decidir que deve ser órfão. Um modo de falha aqui é que as bibliotecas podem ser instaladas especificamente para as ferramentas que eles fornecem (libxml2 para xmllint antes de ser reembalado no libxml2-utils) ou simplesmente disponíveis para fins de desenvolvimento. Esses pacotes não são órfãos. Além disso, o deborphan se concentra nas bibliotecas, por isso perde um número de órfãos que não pertencem à biblioteca, que seguem trilhas (pacotes obsoletos vs. pacotes órfãos) .

Maxx Daymon
fonte
2
Brilhante trabalhou para mim obrigado. Ele também foi removido muninpor algum motivo, mas eu pude recuperá-lo com bastante facilidade depois.
Dia
4
Queime! Eu tive que citar 'libx11-.*'para impedir que a concha brilhasse.
1
@ Maxx, ótima resposta, mas em todos os seus cenários, você não descreveu como é que quando ele executou o apt-get removeque queria install xterme mais dois. Eu também já experimentei isso e não consegui resolver.
Madivad
2
Limpo, raspbian unexpanded instalar, depois de apt-get upgrade dist-upgrade: rootfs ... 94% /. Após o apt-get remove --auto-remove --purge libx11 -. *: rootfs ... 51% /Excelente resposta, muito obrigado!
Daniel F
2
E depois de apt-get autoremove: rootfs ... 41% /...
Daniel F
27
sudo apt-get install deborphan
sudo apt-get autoremove --purge libx11-.* lxde-.* raspberrypi-artwork xkb-data omxplayer penguinspuzzle sgml-base xml-core alsa-.* cifs-.* samba-.* fonts-.* desktop-* gnome-.*
sudo apt-get autoremove --purge $(deborphan)
sudo apt-get autoremove --purge
sudo apt-get autoclean

A primeira linha é instalada deborphane removerá todos os pacotes órfãos.

A segunda linha remove os pacotes principais do sistema X11 LXDE, Samba (compartilhamento de arquivos do Windows), fontes, Gnome e outros itens relacionados ao ambiente de área de trabalho do Raspberry Pi.

A terceira linha remove todos os pacotes órfãos detectados pelo deborphan.

A quarta linha remove todos os pacotes desnecessários.

A quinta linha limpa o cache do pacote.

Fabio
fonte
3
Bem-vindo ao Raspberry Pi Stack Exchange! Embora isso possa responder tecnicamente à pergunta, seria preferível incluir algumas explicações sobre como isso funciona e o que exatamente está fazendo.
RPiAwesomeness
1
Executando esses comandos na nova instalação do Raspbian, passei de menos de um gigabyte grátis em um cartão SD de 4 GB para 2,5 GB grátis. Para mim, pelo menos, esta é a resposta correta.
rob
2
A resposta aceita é muito profunda, mas na verdade não fornece uma lista para solucionar o problema do OP. Esta resposta pode ser barebones, mas ele realmente cumpre o que OP (e eu) realmente precisa
portforwardpodcast
Por que desinstalar o samba? Este não é um aplicativo GUI. Pode ser necessário para a rede.
81818 Dogweather
9

1 /. Para remover todas as áreas de trabalho que acabei de fazer (vá fazer uma cafeteira. Dê um passeio, isso levará um tempo) ...
apt-get remove --auto-remove --purge libx11-.*

2 /. Então eu instalei o deborphan para se livrar dos arquivos órfãos ...
sudo apt-get install deborphan

Se você quiser ver o que ficou órfão, faça isso ...
deborphan -sz

3 /. Então eu removi todos os arquivos órfãos ...
sudo apt-get remove --purge $(deborphan)

Finalmente, faça isso para remover os pacotes desnecessários que não são órfãos ...
sudo apt-get autoremove

Resultado final: sem cabeça e limpo como um apito

James
fonte
2
apt-get remove --dry-runnão faz absolutamente nada , mas imprime mensagens na tela.
18714 lenik
7

uma olhada aqui, mas role para baixo até a parte sobre tasksel.

Rodar tasksel --list-tasksno pi via wifi ssh me dá (após cerca de 30 segundos):

u desktop   Debian desktop environment
u web-server    Web server
u print-server  Print server
u database-server   SQL database
u dns-server    DNS Server
u file-server   File server
u mail-server   Mail server
u ssh-server    SSH server
u laptop    Laptop

Então, tasksel remove desktopfaça o que quiser [ver comentários] . A página de manual é um pouco breve e misteriosa, talvez porque o tasksel seja destinado principalmente aos mantenedores do debian. Se isso funcionar, deixe-nos saber;)

Cachinhos Dourados
fonte
Obrigado, eu nunca tinha ouvido falar tasksel, embora eu tenha uma boa quantidade de experiência no Ubuntu. Infelizmente eu tentei isso, demorou um pouco para executar o remove desktopcomando, mas todos esses pacotes "gráficos" ainda estão lá de acordo com aptitude.
Dia
Eu também não, mas fiquei um pouco perturbado quando percebi que apenas remover um componente X básico não puxava toda a pilha de dependências, o que eu pensei que seria. Encontrei uma página melhor para o tasksel e, na verdade, iniciei o aplicativo ncurses ( taskselsem opções). Agora, com certeza, o 'u' significa que os metapacotes não estão instalados e, se você instalar o 'desktop', obterá mais do que apenas a versão lxde wiki.debian.org/tasksel Portanto, não há dados. Percebo que o metapacote "xorg" de apt-cache search metapackagetambém não está instalado. Responsabilize os raspbians eu acho.
goldilocks
2
Deixarei esta resposta para salvar alguém de um beco sem saída, ou caso alguém possa esclarecer melhor.
goldilocks
5

Como alternativa, você pode tentar esta imagem mínima do Raspbian: http://www.linuxsystems.it/raspbian-wheezy-armhf-raspberry-pi-minimal-image/

Aaron
fonte
2
Não responde a pergunta. A questão era como desinstalar o X, não como instalar um novo sistema operacional sem o X. É melhor deixar isso como um comentário, tente fazer sua própria pergunta ou fornecer uma resposta útil para obter o representante necessário para deixar um comentário. Bom link, no entanto.
Impulss
3

Com base nas informações do taskel, é possível descobrir que existe um meta-pacote task-desktop, que faz referência a todos os outros pacotes relacionados à GUI. Então apenas

sudo apt-get remove task-desktop

Isso removerá muitos outros pacotes (relacionados à GUI / área de trabalho).

Segundo plano: o nome do pacote task-desktoppode ser encontrado executando os seguintes comandos tasksel:

tasksel --list-tasks
tasksel --task-packages desktop
geekQ
fonte
0

Outra opção é usar o aptitude que você sempre deve preferir, se você for fazer mais do que apenas instalar ou remover alguns pacotes.

Inicie o aptitude como root digitando sudo aptitude. Na visualização Pacotes padrão do aptitude, a última entrada da lista é Tasksonde você pode selecionar as várias opções listadas pelo tasksel. Navegue pelos itens com j, ke enter. Marque um item a ser removido digitando _(sublinhado) no item destacado. Isso apenas prepara ações. Para executar as ações, pressione g.

Leia sobre o aptitude no manual do debian .

BdN3504
fonte
0

Digite este código:

sudo apt-get purge desktop-base lightdm lxappearance lxde-common lxde-icon-theme lxinput lxpanel lxpolkit lxrandr lxsession-edit lxshortcut lxtask lxterminal obconf openbox raspberrypi-artwork xarchiver xinit xserver-xorg xserver-xorg-video-fbdev
Raspbian
fonte
1
Então, para esclarecer, a única diferença entre a linha de comando do OP e a sua, é o uso de purgeem vez de remove?
Greenonline 07/02