Llevas cuatro módulos escribiendo sudo apt install sin preguntarte de dónde sale ese software, quién garantiza que no lo ha manipulado nadie por el camino, ni qué ocurre si una madrugada el motor de base de datos de Tramontana salta de la versión 15 a la 16 y la aplicación deja de arrancar. Ahora que sabes exactamente qué te permite hacer sudo, toca entender qué haces con él la mayoría de las veces: instalar, actualizar y fijar software. Esta lección cubre las dos capas de Debian y Ubuntu, la firma criptográfica de los repositorios, el pinning de versiones y el debate incómodo de si un servidor debe reiniciarse solo tras una actualización de seguridad.

Contenido

  1. Qué resuelve un gestor de paquetes
  2. Anatomía de un .deb y comparación con .rpm
  3. Las dos capas: dpkg frente a apt
  4. apt en el día a día
  5. dpkg y la arqueología de ficheros
  6. Repositorios: deb822, componentes, pockets y claves
  7. Fijar versiones: hold y pinning
  8. Actualizaciones desatendidas, el reinicio y la limpieza de la caché
  9. Snap, Flatpak y AppImage frente a .deb
  10. Compilar desde fuentes cuando no queda otra
  11. Equivalencias con dnf en RHEL
  12. Caso Tramontana: dependencias, versión fijada y auditoría

  1. Qué resuelve un gestor de paquetes

Instalar software «a mano» —descargar un .tar.gz, compilarlo y copiarlo a /usr/local— parece inofensivo hasta que llega la primera actualización de seguridad. Un gestor de paquetes resuelve cuatro problemas que a mano no tienen solución razonable:

  • Dependencias: sabe que tu aplicación necesita libssl3t64 y que esa librería la usan otros veinte programas, así que la instala una vez y la comparte.
  • Actualizaciones de seguridad: un comando actualiza todo lo instalado. Con software compilado a mano, el día que salga un CVE crítico tendrás que acordarte tú.
  • Integridad y procedencia: cada paquete viene firmado y su suma comprobada. Sabes que lo que se instala es lo que publicó el mantenedor.
  • Desinstalación limpia: el gestor sabe exactamente qué ficheros trajo cada paquete. Un make install no deja ni la lista.

Regla operativa: compilar es la última opción, y cuando toque, en /usr/local para no pisar lo que administra el gestor.

  1. Anatomía de un .deb y comparación con .rpm

Un .deb es un archivo ar con tres piezas: debian-binary (versión del formato), control.tar.zst (metadatos y scripts) y data.tar.zst (los ficheros que se instalan).

$ apt-get download tree >/dev/null && dpkg-deb --info tree_*.deb | sed -n '2,7p'
 Package: tree
 Version: 2.1.1-2ubuntu3
 Depends: libc6 (>= 2.38)
 Installed-Size: 133
 Maintainer: Ubuntu Developers <[email protected]>
 Description: displays an indented directory listing

Los campos de relación entre paquetes son los que hacen todo el trabajo:

Campo Significado
Depends Imprescindible: sin él, el paquete no funciona
Recommends / Suggests Prescindible pero se instala (--no-install-recommends) / solo informativo
Conflicts / Breaks / Replaces / Provides No pueden convivir / sustituye a otro o aporta una capacidad genérica

Dentro de control hay además scripts de mantenedor —preinst, postinst, prerm, postrm— que se ejecutan como root en cada fase. Es la razón exacta por la que añadir un repositorio de terceros es una decisión de seguridad y no una comodidad: instalar un paquete es ejecutar código ajeno como root.

Aspecto .deb (Debian/Ubuntu) .rpm (RHEL/Fedora/SUSE)
Bajo / alto nivel dpkg / apt rpm / dnf (antes yum)
Metadatos Fichero control Cabecera binaria y .spec al construir
Configuración conffiles, pregunta al fusionar .rpmnew / .rpmsave
Base de datos /var/lib/dpkg/status /var/lib/rpm

  1. Las dos capas: dpkg frente a apt

flowchart LR
    R[Repositorios<br/>archive.ubuntu.com] -->|descarga y verifica firma| A
    A[apt: resuelve dependencias] -->|invoca| D[dpkg: instala UN fichero]
    L[Un .deb descargado a mano] --> D
    D --> S[(/var/lib/dpkg)]
    D --> F[Ficheros en el sistema]

dpkg sabe instalar un fichero .deb y llevar la contabilidad de lo instalado; no sabe nada de repositorios ni descarga dependencias. apt sabe hablar con los repositorios, resolver el grafo de dependencias, verificar firmas y decidir el orden, y luego delega en dpkg.

Necesitas… Comando
Instalar por nombre desde el repositorio apt install paquete
Instalar un .deb local con dependencias apt install ./fichero.deb
Instalar un .deb local sin resolver nada dpkg -i fichero.deb (luego apt -f install)
Fichero → paquete / paquete → ficheros dpkg -S /ruta / dpkg -L paquete

Nota: apt es la interfaz para humanos y apt-get/apt-cache las estables para scripts. En un script usa apt-get: apt avisa de que su interfaz puede cambiar entre versiones.

  1. apt en el día a día

sudo apt update        # refresca la LISTA disponible. No actualiza NADA instalado
sudo apt upgrade       # actualiza lo instalado sin eliminar ni instalar paquetes nuevos
sudo apt full-upgrade  # igual, pero PUEDE eliminar paquetes para resolver el cambio

La confusión clásica: update solo descarga los índices. Sin él, apt trabaja con una foto vieja del repositorio y no verá la actualización de seguridad publicada esta mañana. La diferencia entre upgrade y full-upgrade importa en un servidor: upgrade es conservador y prefiere no tocar nada antes que borrar algo; full-upgrade acepta eliminaciones y es lo que hace falta en un cambio de versión de distribución.

sudo apt install nginx=1.24.0-2ubuntu7 # una versión concreta del repositorio
sudo apt remove nginx                  # borra binarios, CONSERVA la configuración de /etc
sudo apt purge nginx                   # borra también la configuración
sudo apt autoremove --purge            # elimina dependencias que ya no necesita nadie

remove frente a purge es una decisión real: remove te permite reinstalar y recuperar tu configuración; purge deja el sistema limpio. En un servidor que se documenta, purge evita que dentro de un año aparezca un /etc/loquesea fantasma que nadie sabe de dónde viene.

Consulta:

apt search 'servidor web'          # busca en nombre y descripción
apt show nginx                     # descripción, dependencias, tamaño, origen
apt list --installed | wc -l       # cuántos paquetes hay instalados
apt list --upgradable              # qué hay pendiente de actualizar
apt depends nginx; apt rdepends libssl3t64   # dependencias directas e inversas
apt download tree                  # descarga el .deb sin instalarlo

Y la opción que más disco ahorra en un servidor es sudo apt install --no-install-recommends nginx. Los Recommends arrastran extras pensados para escritorio (documentación, clientes gráficos, servidores de correo completos). En un servidor, cada paquete de más es superficie de ataque y disco ocupado. Puedes hacerlo permanente:

# /etc/apt/apt.conf.d/99sin-recomendados
APT::Install-Recommends "false";
APT::Install-Suggests "false";

  1. dpkg y la arqueología de ficheros

$ dpkg -l | grep -c '^ii'   # 712 paquetes correctamente instalados
$ dpkg -S /usr/bin/ss       # ¿de qué paquete vino este fichero?
iproute2: /usr/bin/ss

Los estados de dpkg -l se leen en dos letras: la primera es el estado deseado y la segunda el real. ii es «instalado e instalado»; rc es «eliminado pero quedan ficheros de configuración» (candidatos a purge); iU o iF indican una instalación a medias, que se arregla con sudo dpkg --configure -a (termina configuraciones interrumpidas) y sudo apt -f install (repara dependencias rotas).

Para buscar un fichero en paquetes que no tienes instalados:

$ sudo apt install apt-file && sudo apt-file update && apt-file search /usr/bin/mkfs.xfs
xfsprogs: /usr/bin/mkfs.xfs

  1. Repositorios: deb822, componentes, pockets y claves

Ubuntu 24.04 abandonó el formato de una línea de /etc/apt/sources.list y usa deb822, mucho más legible, en /etc/apt/sources.list.d/*.sources:

# /etc/apt/sources.list.d/ubuntu.sources
Types: deb
URIs: http://es.archive.ubuntu.com/ubuntu/
Suites: noble noble-updates noble-backports
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg

El fichero lleva un segundo bloque idéntico con URIs: http://security.ubuntu.com/ubuntu/ y Suites: noble-security, que es el que trae los parches.

Componente Qué contiene Soporte
main / restricted Libre mantenido por Canonical / controladores propietarios Sí, con parches
universe / multiverse Mantenido por la comunidad / con restricciones de licencia «best effort» (Ubuntu Pro lo amplía) / no
Pocket Qué es ¿En producción?
noble La versión congelada del día del lanzamiento Sí
noble-security Parches de seguridad Sí, siempre
noble-updates Correcciones de fallos no críticos Sí, lo habitual
noble-backports Versiones nuevas traídas de releases posteriores Solo puntualmente

La firma: por qué apt-key está obsoleto

Cada repositorio firma su índice Release con una clave GPG. Antiguamente todas las claves iban a un llavero global (apt-key add), lo que significaba que cualquier repositorio de terceros podía firmar cualquier paquete, incluido un openssh-server falso que sustituyera al oficial. Por eso apt-key está obsoleto y eliminado en 24.04. Hoy la clave se guarda en un fichero y se ata a ese repositorio con Signed-By:.

sudo install -d -m 0755 /etc/apt/keyrings
curl -fsSL https://ejemplo.test/clave.asc | sudo tee /etc/apt/keyrings/ejemplo.asc >/dev/null
# /etc/apt/sources.list.d/ejemplo.sources
Types: deb
URIs: https://ejemplo.test/apt/
Suites: noble
Components: main
Signed-By: /etc/apt/keyrings/ejemplo.asc

Añadir un repositorio de terceros es una decisión de seguridad. Estás autorizando a un tercero a ejecutar código como root en tu servidor cada vez que actualices, y a sustituir paquetes si no acotas su alcance. Antes de añadirlo: comprueba quién lo publica, usa HTTPS, ata la clave con Signed-By, limita Components a lo necesario y, si te importa de verdad, aplica pinning para que solo pueda suministrar los paquetes previstos. En un entorno corporativo esta decisión debe validarla el responsable de seguridad.

Los PPA de Ubuntu son repositorios de Launchpad que sudo add-apt-repository ppa:usuario/proyecto añade con su clave. Cómodos en escritorio; en producción, cada PPA es un mantenedor individual del que pasas a depender.

  1. Fijar versiones: hold y pinning

Hay software que no puede actualizarse solo. El motor de base de datos de Tramontana es el caso de manual: un salto de versión mayor implica migración del formato de datos, y hacerlo a las 6:00 sin supervisión significa una aplicación caída y un rollback complicado.

La forma sencilla, con dpkg:

$ sudo apt-mark hold postgresql-16 postgresql-client-16
postgresql-16 marcado como retenido.
$ apt-mark showhold
postgresql-16
postgresql-client-16
$ sudo apt-mark unhold postgresql-16   # al actualizar: a mano y con ventana

Un paquete en hold no lo toca ni upgrade, ni full-upgrade, ni unattended-upgrades.

La forma con más control, el pinning de APT, permite decidir de qué origen viene cada cosa:

# /etc/apt/preferences.d/99-tramontana-bd — la BD se queda en la serie 16
Package: postgresql-16 postgresql-client-16 postgresql-common
Pin: version 16.*
Pin-Priority: 1001
Prioridad Efecto
< 0 / 100 Nunca se instala / solo si no hay nada instalado
500 / 990 Normal de un repositorio / la del release de destino
> 1000 Se instala aunque suponga bajar de versión
$ apt-cache policy postgresql-16
postgresql-16:
  Instalados: 16.3-1.pgdg24.04+1
  Candidato:  16.3-1.pgdg24.04+1
     17.0-1.pgdg24.04+1 500     # existe, pero no gana
 *** 16.3-1.pgdg24.04+1 1001

apt-cache policy es la herramienta que confirma que tu pinning hace lo que crees. Compruébalo siempre: un pinning mal escrito no da error, simplemente no se aplica.

  1. Actualizaciones desatendidas, el reinicio y la limpieza de la caché

Un servidor sin parches de seguridad es cuestión de tiempo. Ubuntu incluye unattended-upgrades, que por defecto instala solo lo del pocket -security:

# /etc/apt/apt.conf.d/50unattended-upgrades  (fragmento relevante)
Unattended-Upgrade::Allowed-Origins {
        "${distro_id}:${distro_codename}-security";
};
Unattended-Upgrade::Package-Blacklist { "postgresql-16"; };
Unattended-Upgrade::Mail "[email protected]";
Unattended-Upgrade::MailReport "on-change";
Unattended-Upgrade::Remove-Unused-Kernel-Packages "true";
Unattended-Upgrade::Automatic-Reboot "false";
sudo unattended-upgrade --dry-run --debug   # simulación antes de actuar, como siempre

El debate del reinicio automático no tiene respuesta universal. Una actualización del kernel o de glibc no surte efecto hasta reiniciar los procesos afectados o la máquina:

$ cat /var/run/reboot-required.pkgs 2>/dev/null
linux-image-6.8.0-45-generic
$ sudo needrestart -b        # qué servicios usan librerías ya actualizadas
NEEDRESTART-SVC: tramontana.service
Postura A favor En contra
Automatic-Reboot "true" El parche surte efecto sin depender de nadie Corte no anunciado; si la app no arranca sola, caída larga
"false" + aviso Se reinicia en una ventana acordada Si nadie mira el aviso, el parche no protege nada

Para Tramontana, con un solo servidor y sin alta disponibilidad (que es materia de 07-07), la decisión razonable es false más una alerta que Marta reciba, más un compromiso escrito de ventana semanal. Y la costumbre imprescindible: snapshot de la VM antes de una actualización grande, que en un servidor real es un snapshot LVM o del hipervisor (05-04).

Y la limpieza, que en un servidor con /var en su propia partición —como el que particionaste en 01-04— evita un disco lleno: du -sh /var/cache/apt/archives suele dar cientos de megas, que sudo apt clean borra por completo y apt autoclean solo en lo ya retirado del repositorio; los kernels antiguos los limpia apt autoremove --purge.

  1. Snap, Flatpak y AppImage frente a .deb

Formato Dependencias Actualización En un servidor
.deb Compartidas con el sistema apt, controlada La opción por defecto
snap Empaquetadas Automática y difícil de impedir Solo si no hay .deb: el auto-update descoloca las ventanas de cambio
flatpak Runtimes compartidos Manual o programada Pensado para escritorio
AppImage Todo dentro de un fichero Ninguna: la haces tú Herramienta suelta; nadie parchea por ti

Ubuntu trae snapd de serie, y algunas piezas (como lxd o certbot) se distribuyen así. Lo que hay que saber en un servidor: los snaps se actualizan solos y su ritmo se puede posponer pero no cancelar, lo que choca de frente con una política de cambios controlados.

snap list                              # qué hay instalado
sudo snap refresh --hold=24h certbot   # posponer, no cancelar

  1. Compilar desde fuentes cuando no queda otra

sudo apt install build-essential         # gcc, make, libc6-dev, dpkg-dev
tar -tzvf herramienta-2.4.tar.gz | head  # inspeccionar ANTES de extraer, como siempre
tar -xzf herramienta-2.4.tar.gz && cd herramienta-2.4
./configure --prefix=/usr/local && make -j"$(nproc)" && sudo make install

--prefix=/usr/local no es un detalle: el FHS de 01-06 reserva ese árbol para lo instalado por el administrador, precisamente para que nunca colisione con lo que gestiona dpkg en /usr. Y como make install no deja registro, existe checkinstall, que envuelve la instalación en un .deb real:

$ sudo checkinstall --pkgname=herramienta --pkgversion=2.4 --default
$ dpkg -l herramienta | tail -1
ii  herramienta  2.4-1  amd64  Paquete generado con checkinstall

Ahora se desinstala limpiamente con apt purge herramienta. Aun así, sigue sin haber nadie que te avise de sus fallos de seguridad: esa vigilancia pasa a ser tuya.

  1. Equivalencias con dnf en RHEL

Retomando las familias de 01-03, esta tabla te permite trabajar en Rocky, Alma o RHEL sin volver a aprender nada:

Tarea Debian/Ubuntu RHEL/Fedora
Refrescar / actualizar apt update / apt upgrade dnf check-update / dnf upgrade
Instalar / eliminar apt install / apt purge dnf install / dnf remove
Buscar / detallar apt search / apt show dnf search / dnf info
Fichero→paquete / paquete→ficheros dpkg -S / dpkg -L rpm -qf / rpm -ql
Fijar versión / historial apt-mark hold, history.log dnf versionlock, dnf history

La diferencia práctica más llamativa: dnf history undo deshace una transacción entera, algo que APT no ofrece. En Debian/Ubuntu la vuelta atrás se hace reinstalando versiones concretas a partir de history.log.

  1. Caso Tramontana: dependencias, versión fijada y auditoría

Primero, las dependencias del servidor, sin recomendados y con verificación:

sudo apt update && sudo apt install --no-install-recommends -y \
     nginx postgresql-16 postgresql-client-16 rsync curl jq acl logrotate

Segundo, fijamos la base de datos para que ninguna actualización desatendida la suba de versión mayor:

sudo cp -a /etc/apt/apt.conf.d/50unattended-upgrades{,.bak-$(date +%F)}
sudo apt-mark hold postgresql-16 postgresql-client-16

Y añadimos el pinning explícito de /etc/apt/preferences.d/99-tramontana-bd que viste en el apartado 7, más la lista negra en 50unattended-upgrades. Verificación obligatoria:

$ apt-cache policy postgresql-16 | head -3
postgresql-16:
  Instalados: 16.3-0ubuntu0.24.04.1
  Candidato:  16.3-0ubuntu0.24.04.1   # iguales: nada pendiente que pueda colarse

Tercero, la pregunta de Marta esta mañana: «¿qué se actualizó anoche y por qué?».

$ grep -A3 '^Start-Date: 2026-08-18' /var/log/apt/history.log
Start-Date: 2026-08-18  06:12:33
Commandline: /usr/bin/unattended-upgrade
Upgrade: libssl3t64:amd64 (3.0.13-0ubuntu3.2, 3.0.13-0ubuntu3.4), openssl:amd64 (...)
End-Date: 2026-08-18  06:12:51
$ apt changelog openssl 2>/dev/null | head -2
openssl (3.0.13-0ubuntu3.4) noble-security; urgency=medium
  * SECURITY UPDATE: denial of service in TLS session handling

Respuesta para Marta, con la estructura de siempre —qué protege y qué no protege—: «Anoche se actualizó OpenSSL por un fallo de seguridad que permitía tumbar el servicio TLS. Protege el cifrado de las conexiones entrantes. No protege nada más, y no surtirá efecto completo hasta reiniciar los servicios que ya tenían la librería cargada; needrestart indica que tramontana.service es uno de ellos. Propongo reiniciarlo en la ventana del jueves. La base de datos sigue fijada en la serie 16 y no se ha tocado.» Y al HISTORIAL:

sudo tee -a /opt/tramontana/HISTORIAL >/dev/null <<'FIN'
2026-08-18  Paquetes (operador)
  - hold + pin de postgresql-16 (serie 16.*); unattended-upgrades solo -security
  - 06:12 actualización automática de openssl (CVE TLS). Pendiente reinicio de servicios.
FIN

Errores Comunes y Consejos

  • Creer que apt update actualiza algo. Solo refresca la lista; el par correcto es apt update && apt upgrade, y el && no es decorativo: si el update falla, actualizar con índices viejos es peor que no actualizar.
  • Usar apt en scripts en vez de apt-get con DEBIAN_FRONTEND=noninteractive, o dpkg -i sin más, que instala sin dependencias y deja el sistema en estado iF (usa apt install ./fichero.deb).
  • Añadir un repositorio con apt-key. Eliminado en 24.04 e inseguro por diseño: clave en /etc/apt/keyrings/ y Signed-By: en el .sources.
  • Olvidar el pocket -security. Sin él el servidor se queda sin parches, y no da ningún error. Y no actualices sin snapshot ni ventana: el día que algo se rompa, la diferencia entre 5 minutos y 5 horas es haber hecho el snapshot.
  • Dejar hold puesto y olvidarlo. Un paquete retenido tampoco recibe parches de seguridad: revisa apt-mark showhold cada mes y anota quién decidió cada retención y hasta cuándo.
  • Consejo: guarda apt-mark showmanual > paquetes.txt junto a tus copias. Reconstruir un servidor con esa lista es cuestión de minutos.

Ejercicios

  1. Simulación antes de actuar. Averigua qué paquetes se actualizarían ahora mismo y cuánto disco ocuparían, sin instalar nada. Después, comprueba si alguno de ellos exige reiniciar el sistema.
  2. Repositorio de terceros bien montado. Describe los pasos completos y seguros para añadir un repositorio ficticio https://apt.tramontana.example/ (suite noble, componente main) que solo deba suministrar el paquete tramontana-agent, e indica cómo verificarías que no puede sustituir paquetes del sistema.
  3. Forense de una actualización. Un compañero dice que «alguien instaló nginx a mano el martes». Demuestra con comandos cuándo se instaló, si vino de un repositorio o de un .deb suelto, y qué ficheros de configuración aporta.

Soluciones

1.

$ sudo apt update >/dev/null && apt list --upgradable
libssl3t64/noble-security 3.0.13-0ubuntu3.4 amd64 [actualizable desde: 3.0.13-0ubuntu3.2]
openssl/noble-security 3.0.13-0ubuntu3.4 amd64 [actualizable desde: 3.0.13-0ubuntu3.2]
$ sudo apt-get --simulate upgrade | tail -1
Conf openssl (3.0.13-0ubuntu3.4 ...)
$ sudo apt-get --assume-no upgrade | grep espacio
Se utilizarán 0 B de espacio de disco adicional después de esta operación.

--simulate (o -s) es el --dry-run de APT, y encaja con la convención del curso de simular antes de actuar. Para el reinicio: [ -f /var/run/reboot-required ] && cat /var/run/reboot-required.pkgs || echo "No requiere reinicio".

2. Los pasos, en orden:

sudo install -d -m 0755 /etc/apt/keyrings
curl -fsSL https://apt.tramontana.example/clave.asc | sudo tee /etc/apt/keyrings/tramontana.asc >/dev/null
sudo chmod 0644 /etc/apt/keyrings/tramontana.asc
# /etc/apt/sources.list.d/tramontana.sources
Types: deb
URIs: https://apt.tramontana.example/
Suites: noble
Components: main
Architectures: amd64
Signed-By: /etc/apt/keyrings/tramontana.asc
# /etc/apt/preferences.d/99-repo-tramontana
Package: *
Pin: origin apt.tramontana.example
Pin-Priority: 1
# ...salvo el paquete previsto:
Package: tramontana-agent
Pin: origin apt.tramontana.example
Pin-Priority: 700

Verificación: sudo apt update no debe dar avisos de firma, y apt-cache policy openssl debe seguir mostrando noble-security como origen del candidato. Ese pinning de prioridad 1 es la red de seguridad que impide que un repositorio de terceros secuestre un paquete del sistema.

3.

$ grep -B1 -A2 'Install:.*nginx' /var/log/apt/history.log
Start-Date: 2026-08-13  11:47:02
Commandline: apt install nginx
Requested-By: luis (1001)
Install: nginx:amd64 (1.24.0-2ubuntu7.1), nginx-common:amd64 (..., automatic)
$ apt-cache policy nginx | sed -n '5p'
        500 http://es.archive.ubuntu.com/ubuntu noble-updates/main amd64 Packages
$ dpkg-query -W -f='${Conffiles}\n' nginx-common | head -1
 /etc/nginx/nginx.conf 8b1a9953c4611296a827abf8c47804d7

Vino del repositorio oficial (noble-updates), lo pidió luis el 13 de agosto con apt install, y aporta conffiles que apt protegerá en futuras actualizaciones. Nótese el campo Requested-By: history.log guarda el UID real detrás del sudo, lo que enlaza directamente con la trazabilidad de la lección anterior.

Conclusión

El software de srv-tramontana ya no aparece por arte de magia. Sabes que un gestor de paquetes resuelve dependencias, actualizaciones, integridad y desinstalación limpia, y que compilar es la última opción; conoces la anatomía de un .deb —incluidos los scripts de mantenedor que corren como root, que es la razón de fondo de toda la cautela con los repositorios— y su equivalencia con .rpm; distingues la capa dpkg de la capa apt y sabes cuándo toca cada una; manejas update/upgrade/full-upgrade, remove frente a purge, --no-install-recommends, depends/rdepends y la arqueología de dpkg -L, dpkg -S y apt-file.

Entiendes los repositorios de Ubuntu 24.04 en formato deb822, sus componentes y sus pockets, y por qué la clave va en /etc/apt/keyrings/ con Signed-By: en lugar del difunto apt-key. Sabes fijar versiones con apt-mark hold y con pinning, verificarlo con apt-cache policy, y que un hold olvidado deja un paquete sin parches. Has configurado unattended-upgrades para que instale solo seguridad, avise a Marta y no reinicie solo, sabiendo leer /var/run/reboot-required y needrestart. Y sabes situar snap, Flatpak y AppImage, compilar en /usr/local con checkinstall cuando toca, y traducir todo a dnf.

Queda el recurso del que depende todo lo demás y que nadie mira hasta que se acaba: el disco. /srv/tramontana/backups lleva semanas creciendo, la copia de las 4:20 escribe cada noche sin que nadie haya calculado cuánto cabe, y la caché de apt que acabas de limpiar era un síntoma, no la causa. En Gestión de Discos verás la pila completa desde el dispositivo físico hasta el punto de montaje, particiones MBR y GPT, sistemas de ficheros comparados, /etc/fstab campo a campo —y por qué una línea mal escrita ahí impide arrancar el servidor—, el caso del fichero borrado que no libera espacio, y LVM, con el que añadirás un disco nuevo a la VM y moverás /srv/tramontana/backups a su propio volumen sin perder un solo byte.

Curso de Linux: De Principiante a Administrador de Sistemas

Módulo 1: Introducción a Linux

Módulo 2: Comandos Básicos de Linux

Módulo 3: Habilidades Avanzadas en la Línea de Comandos

Módulo 4: Scripting en Shell

Módulo 5: Administración del Sistema

Módulo 6: Redes y Seguridad

Módulo 7: Temas Avanzados

Módulo 8: Proyectos Prácticos

© Copyright 2026. Todos los derechos reservados