Existen múltiples escenarios en la administración de infraestructura donde un equipo inicialmente configurado con Ubuntu Desktop termina asumiendo roles exclusivos de servidor. Ya sea que estés reutilizando hardware para tu home lab o transformando un entorno de desarrollo en un nodo de producción, el entorno gráfico (GNOME) se convierte en un desperdicio innecesario de CPU y RAM.
Aunque la solución tradicional sería formatear e instalar la ISO de Ubuntu Server, esto no siempre es viable. Si ya tienes configuraciones complejas, automatizaciones o servicios en ejecución, una reinstalación limpia significa retrabajo. En este artículo, abordaremos cómo realizar una conversión in-place de Ubuntu 24.04 Desktop a un entorno headless puro, eliminando la capa gráfica sin comprometer tus datos ni tus cargas de trabajo actuales.

Consideraciones Previas: ¿Qué pasa con mis configuraciones actuales?
Antes de ejecutar un proceso invasivo como este, es natural preguntarse qué sobrevivirá a la purga del entorno de escritorio. La regla general es que solo se elimina la capa de presentación y sus dependencias directas. Los servicios de backend y configuraciones a nivel de sistema permanecen intactos:
- Contenedores de Docker: Todos tus volúmenes, redes y contenedores almacenados en
/var/lib/dockerseguirán operando sin interrupciones. El demonio de Docker es completamente independiente del GUI. - Llaves y Configuraciones SSH: Tus llaves públicas y privadas en
~/.ssh/, así como las directivas de seguridad en/etc/ssh/sshd_config, no sufrirán modificaciones. - Duo MFA: Si ya tienes endurecido el acceso a tu servidor utilizando Duo Security para autenticación multifactor, esta configuración persistirá, ya que se integra a nivel de PAM (Pluggable Authentication Modules) y no depende de GNOME.
Paso 1: Actualización del Sistema
Antes de modificar los metapaquetes base, debemos asegurar que el sistema no tenga dependencias rotas o actualizaciones pendientes.
# Update repository lists and upgrade all installed packages
sudo apt update && sudo apt upgrade -y

# Remove unnecessary dependencies to start with a clean state
sudo apt autoremove -y

Paso 2: Instalación del Metapaquete de Servidor
Ubuntu Server y Desktop comparten el mismo núcleo. Para asegurarnos de contar con las utilidades estándar de la versión Server (como herramientas avanzadas de red y gestión), instalamos el metapaquete correspondiente. El símbolo ^ indica que se instalará la “tarea” completa.
# Install the complete Ubuntu Server task
sudo apt install ubuntu-server^ -y

Paso 3: Migración de Red (De NetworkManager a Netplan nativo)
Este es el paso más crítico. Ubuntu Desktop utiliza NetworkManager para la gestión de red (ideal para entornos gráficos), mientras que el estándar robusto en Server es usar systemd-networkd directamente a través de Netplan.
Primero, identifica el nombre lógico de tu interfaz de red:
# List all network interfaces to identify the active one (e.g., enp3s0 or eth0)
ip link

3.1 Identificar y respaldar la configuración actual
Es muy probable que tu archivo de configuración no se llame 01-network-manager-all.yaml, sino que tenga un nombre auto-generado por NetworkManager basado en un UUID.
Lista el contenido del directorio de Netplan:
# List current Netplan configurations
ls /etc/netplan/

Identifica el archivo .yaml activo (por ejemplo, 90-NM-dfdf9dad-14e4-3c0e...yaml) y usa cat para ver su contenido. Necesitarás estos datos para construir el nuevo archivo limpio.
# View the current configuration to extract IPs, gateways, and DNS
sudo cat /etc/netplan/<your-current-file>.yaml

Una vez que tengas clara tu configuración (IP, subred, gateway y DNS), mueve este archivo para desactivarlo temporalmente (el sistema no lee archivos .bak):
# Backup and disable the NetworkManager configuration
sudo mv /etc/netplan/<your-current-file>.yaml /etc/netplan/old-networkmanager.yaml.bak

3.2 Crear la nueva configuración limpia para Server
Ahora crearemos un archivo estructurado limpiamente para networkd, eliminando cualquier bloque específico de networkmanager (como UUIDs, passthrough o configuraciones de interfaz gráfica) que pudiste ver en tu archivo original.
# Create a new, clean Netplan configuration
sudo nano /etc/netplan/00-server-netconfig.yaml

Ejemplo basado en una configuración estática real:
# Clean Netplan configuration for Static IP
network:
version: 2
renderer: networkd
ethernets:
ens19: # Your actual interface name from 'ip link'
addresses:
- 10.0.0.245/25 # Your static IP and CIDR
routes:
- to: default
via: 10.0.0.254 # Your default gateway
nameservers:
addresses:
- 10.0.0.215
- 1.1.1.1

💡 Nota Importante: Nota cómo hemos cambiado
renderer: NetworkManagerarenderer: networkdy hemos eliminado los bloques comomatch:(si usas el nombre directo de la interfaz arriba) y el bloque entero denetworkmanager:que genera la GUI.
3.3 Preparación, Validación y Aplicación
Antes de decirle a Netplan que intente aplicar los cambios, debemos asegurarnos de dos cosas: que el archivo tenga los permisos de seguridad correctos y que el servicio que va a gestionar la red (systemd-networkd) esté encendido. Si omites esto, Netplan arrojará advertencias de seguridad y fallará al recargar el servicio.
Ejecuta estos comandos de preparación:
# 1. Secure the configuration file (Netplan requires 600 permissions)
sudo chmod 600 /etc/netplan/00-server-netconfig.yaml

# 2. Ensure systemd-networkd is enabled and running
sudo systemctl enable --now systemd-networkd

Ahora sí, estamos listos para validar la configuración. Es vital usar el comando try especialmente si estás conectado por SSH; si hay un error tipográfico y pierdes red, los cambios se revertirán solos.
# Test the new network configuration for 120 seconds
sudo netplan try
Si la terminal te muestra el mensaje “Press ENTER before the timeout to accept the new configuration” y tu sesión SSH sigue activa, presiona ENTER. ¡Felicidades, tu red ahora es gestionada a nivel de servidor!

Si pierdes la conexión, Netplan revertirá los cambios automáticamente en 120 segundos. Si la conexión se mantiene y ves el mensaje de éxito, presiona ENTER para confirmar, o aplica manualmente:
# Apply permanently
sudo netplan apply

Paso 4: Validación y Configuración de SSH
Dado que eliminaremos la interfaz gráfica, el acceso por consola remota será nuestra única vía de administración. Es crucial verificar que el servicio SSH esté operando correctamente.
# Check the current status of the SSH service
systemctl is-active ssh

Si el comando anterior devuelve active, puedes saltar al siguiente paso. Si devuelve inactive, unknown o si el servicio no está instalado, procede con lo siguiente:
# Install OpenSSH server if not present
sudo apt install openssh-server -y
# Enable the service to start automatically on boot and start it immediately
sudo systemctl enable --now ssh
# Verify the status again
sudo systemctl status ssh
Paso 5: Remoción del Entorno de Escritorio y Servicios Innecesarios
Con la red y el acceso remoto asegurados, procedemos a eliminar la carga gráfica.
# Purge GNOME desktop and display managers
sudo apt purge ubuntu-desktop gnome-shell gnome-session gnome-control-center gdm3 -y

# Remove orphaned dependencies left behind by the desktop environment
sudo apt autoremove --purge -y

Incluso después de purgar el entorno de escritorio, es común que queden demonios diseñados para el uso de escritorio corriendo en segundo plano (impresión, bluetooth, reportes de error).
Verifiquemos qué servicios residuales siguen activos:
# Find leftover GUI daemons running on the system
systemctl list-units --type=service | grep -E 'avahi|cups|bluetooth|whoopsie'

Si el comando arroja resultados, los eliminamos para liberar aún más recursos:
# Purge typical unwanted desktop services
sudo apt purge cups cups-browsed avahi-daemon bluetooth whoopsie modemmanager -y

# Reload systemd to apply service changes
sudo systemctl daemon-reload

Paso 6: Cambio del Target de Arranque
Para finalizar, debemos indicarle a systemd que el sistema debe arrancar exclusivamente en modo consola en el próximo reinicio, evitando que intente cargar componentes gráficos inexistentes que puedan causar un kernel panic o un hang en el arranque.
# Set the default boot target to CLI mode
sudo systemctl set-default multi-user.target

Conclusión
Migrar un nodo de Desktop a Server de manera local es una excelente estrategia de optimización para infraestructuras existentes. Al finalizar estos pasos y ejecutar un simple sudo reboot, tu máquina iniciará directamente en una terminal tty pura.


Habrás recuperado valiosos gigabytes de memoria RAM y ciclos de CPU que antes se desperdiciaban dibujando ventanas, manteniendo intactas tus configuraciones de seguridad, claves SSH y contenedores de Docker. Un sistema mucho más esbelto y listo para integrarse a tus flujos de automatización.