¿Cómo desinstalar X Server y Desktop Manager cuando se ejecuta como servidor sin cabeza?

88

Estoy usando mi Raspberry Pi como un servidor sin cabeza en el que puedo usar ssh. No necesito el servidor X, LXDE, etc.

Estoy ejecutando Raspbian "wheezy". Ya he desactivado "Iniciar escritorio en el arranque" usando raspi-configcomo se describe aquí . Pero sigo recibiendo muchas actualizaciones de paquetes para todas las cosas de escritorio que no uso (ejecuto apticron para notificarme las actualizaciones pendientes por correo electrónico), por lo que me gustaría completar apt-get removetodos los paquetes innecesarios para evitar estas actualizaciones innecesarias.

¿Qué paquete (s) debo eliminar?

Hasta ahora, se me ocurrió lo siguiente:

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

Hice la lista anterior buscando aptitudes para todos los paquetes en la sección principal Paquetes instalados -> x11 -> que no eran "instalaciones automáticas".

Por alguna razón cuando ejecuto esto, apt-getme dice que:

The following extra packages will be installed:
  libutempter0 xbitmaps xterm

lo que parece un poco extraño para una operación de eliminación .

hay una manera mas facil? ¿Existe un paquete "super" que posea todas estas cosas gráficas y se pueda eliminar, tomando todas sus dependencias? Según tengo entendido, no parece que esto sea posible, porque estas cosas no se han instalado automáticamente, lo que significa que necesito rastrearlas y eliminarlas explícitamente.

Día
fuente

Respuestas:

85

TL; DR o "Simplemente quema mi pi"

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

(Repita apt-get autoremove --purgehasta que no queden huérfanos)

Explicación adicional

Si un paquete foo depende de otro paquete libfoo y usted elimina el paquete libfoo , el dependiente ( foo ) también se elimina. Debido a que Foo tiene una línea dependiente que especifica libfoo , se rompería si dejara foo si se eliminara libfoo. Lo contrario no es cierto: eliminar foo no elimina libfoo automáticamente. Otro paquete xfoo también puede depender de libfoo, por lo que apt no solo lo eliminará (aunque apt rastreará si se instaló solo como un efecto secundario de la instalación de foo y ofrezca eliminarlo automáticamente si así lo solicita, siempre y cuando nadie más dependa de él)

Los metapaquetes dependen de un conjunto de otros paquetes de la misma manera que foo dependía de libfoo , por lo que cuando se elimina un metapaquete , normalmente se elimina poco más. Por ejemplo, puede haber dos metapaquetes que dependen de xterm (lxsession y xfsession quizás), pero desinstalar uno o ambos no desinstalará xterm porque xterm no está roto sin lxsession o xfsession. Los metapaquetes están generalmente en la parte superior del árbol de dependencias, no en la parte inferior, y pocas cosas tienden a depender directamente de los metapaquetes. Los metapaquetes proporcionan principalmente una forma conveniente de instalar un conjunto sensible de paquetes a la vez, pero no son herramientas de desinstalación.

Por lo tanto, si desea quemar todo lo que depende de X11, tendrá que apuntar al conjunto base de bibliotecas libx11 de las que todas las aplicaciones x11 deben depender en última instancia:

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

Esto (simulará) eliminará todo lo que finalmente depende de libx11 -. *, Y también eliminará todos los paquetes que se instalaron como una dependencia de un programa X11, incluso si no dependían directamente de X11 (CUPS y Ghostscript generalmente se instalan como efecto secundario de instalar un entorno de escritorio). El segundo comando eliminará a los huérfanos posteriores hasta que no quede ninguno. Elimine "--auto-remove" si desea realizar este paso más adelante o no hacerlo, o simplemente agregue los paquetes manualmente después de limpiar la GUI.

Elimine la opción --dry-run para realizar realmente la operación después de haber verificado que no eliminará los paquetes que no tenía la intención de eliminar).

Prefiero limpiar y purgar los efectos secundarios y agregarlos nuevamente según sea necesario. Además, seguí adelante y probé esto en mi propio pi, y se reinició en un servidor muy espartano pero funcional. :)

¿Por qué un remove instala algo?

La estrategia anterior resuelve el problema planteado, pero aún queda la curiosidad de por qué un remove operación resulta en paquetes que se instalan .

En el corazón de cada administrador de paquetes hay un solucionador de satisfacción de algún tipo. Cuando le dice a un administrador de paquetes que instale algunos paquetes, elimine algunos paquetes o actualice algunos paquetes, lo que realmente le pide que haga es resolver el siguiente estado deseado de instalación del software dado un conjunto de paquetes disponibles. Esta solución puede incluir instalar paquetes adicionales (dependencias), eliminar paquetes existentes (conflictos, interrupciones), degradar / actualizar paquetes específicos (nivel de compatibilidad) o una combinación de los mismos. Entonces, si bien es un poco contradictorio que el solucionador determine que algunos paquetes deben instalarse para que otros paquetes se eliminenTiene mucho sentido. Este es el desagradable problema de administración de dependencias que resuelven los administradores de paquetes.

Un ejemplo concreto: dado un conjunto de aplicaciones Java ya instaladas, todas dependen de un tiempo de ejecución compatible con Java que actualmente es openjdk-7-jre . Luego le pide al administrador de paquetes que resuelva la instalación de una nueva herramienta Java que declara un conflicto con openjdk-7-jre pero que funciona con oracle-7-jre (ambos paquetes generalmente proporcionan un tiempo de ejecución java-7 ). El solucionador propondrá la eliminación de openjdk-7-jre y la instalación de oracle-java-7-jrecomo la solución a su estado deseado de tener el nuevo paquete instalado sin romper los paquetes existentes.

En este específico caso, xterm es un paquete que ofrece una dependencia virtual llamado x-terminal-emulador ( xterm , lxterminal , y aterm todos proporcionan un -terminal-emulador x ), por lo que es probable que en la eliminación de lxterminal (como parte de eliminando lxde), el solucionador encontró un paquete instalado existente ( transcodificar como un posible ejemplo) que requería algún tipo de emulador x-terminal , por lo que el solucionador decidió instalar xterm (que requiere libutempter0 y xbitmaps, explicando los otros paquetes a instalar) para satisfacer la dependencia rota. Sin ver la base de datos del paquete, hipotetizaría que este es el escenario más probable.

Para descubrir los paquetes que actualmente dependen de xterm (o una alternativa), use el comando apt-cache rdepends (usando el interruptor --installed para limitar solo los paquetes instalados):

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

Dependencias que comienzan con el carácter de alternancia '|' significa que el paquete depende de xterm o de algo que proporciona (ese algo es x-terminal-emulator en este caso). El paquete clusterssh depende de xterm explícitamente y no permite una alternativa. Esta es la lista corta de los paquetes que están causando que se requiera xterm.

¿Qué hay de deborphan?

La funcionalidad de seguimiento de huérfanos se incorporó a apt-get a través de la funcionalidad 'autoremove' en 2010 (error de Debian 582791 ), lo que hace que deborphan sea en su mayoría redundante y esencialmente obsoleto. A diferencia de deborphan y otras soluciones como esta, apt-get rastrea directamente qué paquetes se instalaron explícitamente y qué paquetes se instalaron como efecto secundario o dependencia de un paquete instalado explícitamente. Por ejemplo, si un administrador instala foo, libtal se instala como un efecto secundario y apt-get autoremove voluntad , de hecho, eliminar libtal si no se especifica autoremove (o --auto-remove) al retirar foo.

El enfoque adoptado por deborphan es una colección de conjeturas. Por ejemplo, la suposición de que una biblioteca instalada que no tiene un dependiente debe ser huérfana: si libfoo está instalado, pero ni foo ni xfoo lo están, deborphan puede decidir que debe ser huérfano. Un modo de falla aquí es que las bibliotecas pueden instalarse específicamente para las herramientas que proporcionan (libxml2 para xmllint antes de volver a empaquetarlas en libxml2-utils) o simplemente estar disponibles para fines de desarrollo. Dichos paquetes no son huérfanos. Además, deborphan se enfoca en las bibliotecas, por lo que pierde una serie de huérfanos que no pertenecen a la biblioteca que pueden rastrear (paquetes obsoletos frente a paquetes huérfanos) .

Maxx Daymon
fuente
2
Brillante trabajó para mí, gracias. También se eliminó muninpor alguna razón, pero pude volver a poner eso fácilmente después.
Día
44
¡Quemalo! Tuve que citar 'libx11-.*'para evitar que el caparazón se pegara.
1
@Maxx, gran respuesta, pero en todos tus escenarios, no describiste cómo es que cuando corrió lo apt-get removeque quería install xtermy otros dos. Yo también he experimentado esto y no pude resolverlo.
Madivad
2
Limpia, sin expandir raspbian instalar, después de apt-get upgrade, dist-upgrade: rootfs ... 94% /. Después de apt-get remove --auto-remove --purge libx11 -. *: rootfs ... 51% /Excelente respuesta, ¡muchas gracias!
Daniel F
2
Y después 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

La primera línea se instala deborphany eliminará los paquetes huérfanos.

La segunda línea elimina los paquetes principales del sistema X11 LXDE, Samba (uso compartido de archivos de Windows), fuentes, Gnome y otras cosas relacionadas con el entorno de escritorio de Raspberry Pi.

La tercera línea elimina los paquetes huérfanos detectados por deborphan.

La cuarta línea elimina los paquetes innecesarios.

La quinta línea borra la caché del paquete.

Fabio
fuente
3
¡Bienvenido a Raspberry Pi Stack Exchange! Si bien esto puede responder técnicamente a la pregunta, sería preferible incluir alguna explicación de cómo funciona y qué está haciendo exactamente.
RPiAwesomeness
1
Al ejecutar esos comandos en la nueva instalación de Raspbian, pasé de menos de un gigabyte gratis en una tarjeta SD de 4GB a 2.5GB gratis. Para mí, al menos, esta es la respuesta correcta.
robar el
2
La respuesta aceptada es muy profunda, pero en realidad no da una lista para resolver el problema de OP. Esta respuesta puede ser básica, pero en realidad logra lo que OP (y yo) realmente necesitamos
portforwardpodcast
¿Por qué desinstalar samba? Esta no es una aplicación GUI. Puede ser necesario para la creación de redes.
Dogweather
9

1 /. Para quitar todos los escritorios que acabo de hacer (ve a preparar una taza de café. Da un paseo, esto llevará un tiempo) ...
apt-get remove --auto-remove --purge libx11-.*

2 /. Luego instalé deborphan para deshacerme de los archivos huérfanos ...
sudo apt-get install deborphan

Si quieres ver lo que ha quedado huérfano, haz esto ...
deborphan -sz

3 /. Luego eliminé todos los archivos huérfanos ...
sudo apt-get remove --purge $(deborphan)

Finalmente haga esto para eliminar los paquetes innecesarios que no están huérfanos ...
sudo apt-get autoremove

Resultado final: sin cabeza y limpio como un silbato

James
fuente
2
apt-get remove --dry-runno hace absolutamente nada , pero imprime mensajes en la pantalla.
lenik
7

Echa un vistazo aquí, pero desplázate hacia abajo hasta la parte sobre tasksel.

Ejecutar tasksel --list-tasksen el pi a través de wifi ssh me da (después de unos 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

Entonces, tasksel remove desktopdebes hacer lo que quieras [ver comentarios] . La página de manual es un poco breve y misteriosa, tal vez porque taskel está principalmente destinado a los encargados de debian. Si esto funciona, háganos saber;)

Ricitos de oro
fuente
Gracias, nunca había oído hablar de él tasksel, aunque tengo bastante experiencia en Ubuntu. Desafortunadamente intenté esto, me tomó un tiempo ejecutar el remove desktopcomando, pero todos esos paquetes "gráficos" todavía están allí de acuerdo aptitude.
Día
Yo tampoco, pero estaba un poco perturbado cuando me di cuenta de que simplemente eliminar algún componente básico de X no extraía toda la pila de dependencias, lo que pensé que lo haría. Encontré una página mejor para taskel, y en realidad encendí la aplicación ncurses ( taskselsin opciones). Estoy bastante seguro de que ahora la 'u' significa que los metapaquetes no están instalados, y si instala el 'escritorio', obtendrá más que solo la versión lxde wiki.debian.org/tasksel Así que no hay dados. Noté que el metapaquete "xorg" de tampoco apt-cache search metapackageestá realmente instalado. Culpa a los raspbians, supongo.
Ricitos de oro
2
Dejaré esta respuesta para salvar a alguien de un callejón sin salida, o en caso de que alguien pueda arrojar mejor luz.
Ricitos de oro
5

Alternativamente, puede probar esta imagen mínima de Raspbian: http://www.linuxsystems.it/raspbian-wheezy-armhf-raspberry-pi-minimal-image/

Aaron
fuente
2
No responde a la pregunta en absoluto. La pregunta era cómo desinstalar X, no cómo instalar un nuevo sistema operativo sin X. Esto sería mejor dejarlo como un comentario, intente hacer su propia pregunta o proporcionar una respuesta útil para obtener el representante necesario para dejar un comentario. Buen enlace, no obstante.
Impulso el
3

Según la información de la tarea, es posible descubrir que hay un escritorio de tareas de metapaquete que hace referencia a todos los demás paquetes relacionados con la GUI. Por lo que sólo

sudo apt-get remove task-desktop

Esto eliminará muchos otros paquetes (GUI / Escritorio relacionado).

Antecedentes: el nombre del paquete task-desktopse puede encontrar ejecutando los siguientes comandos de taskel:

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

Otra opción es usar aptitude, que siempre debe preferir, si va a hacer algo más que instalar o eliminar algunos paquetes.

Comience aptitude como root escribiendo sudo aptitude. En la vista de paquetes estándar de aptitude, la última entrada de la lista es Tasksen la que puede seleccionar las diversas opciones enumeradas por taskel. Navegar a través de los artículos con j, ky enter. Marque un elemento para ser purgado ingresando _(guión bajo) en el elemento resaltado. Esto solo prepara acciones. Para ejecutar las acciones presione g.

Lea sobre aptitud en el manual de Debian .

BdN3504
fuente
0

Escribe 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
fuente
1
Entonces, para aclarar, la única diferencia entre la línea de comando del OP y la suya, es el uso de purgeen lugar de remove?
Greenonline