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
- Qué resuelve un gestor de paquetes
- Anatomía de un
.deby comparación con.rpm - Las dos capas:
dpkgfrente aapt apten el día a díadpkgy la arqueología de ficheros- Repositorios: deb822, componentes, pockets y claves
- Fijar versiones:
holdy pinning - Actualizaciones desatendidas, el reinicio y la limpieza de la caché
- Snap, Flatpak y AppImage frente a
.deb - Compilar desde fuentes cuando no queda otra
- Equivalencias con
dnfen RHEL - Caso Tramontana: dependencias, versión fijada y auditoría
- 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
libssl3t64y 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 installno 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.
- Anatomía de un
.deb y comparación con .rpm
.deb y comparación con .rpmUn .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 listingLos 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 |
- Las dos capas:
dpkg frente a apt
dpkg frente a aptflowchart 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.
apt en el día a día
apt en el día a díasudo 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 cambioLa 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 nadieremove 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 instalarloY 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";
dpkg y la arqueología de ficheros
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/ssLos 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
- 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.gpgEl 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 |
| 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.ascAñ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, limitaComponentsa 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.
- Fijar versiones:
hold y pinning
hold y pinningHay 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 ventanaUn 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 1001apt-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.
- 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";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.
- Snap, Flatpak y AppImage frente a
.deb
.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.
- 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 checkinstallAhora 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.
- Equivalencias con
dnf en RHEL
dnf en RHELRetomando 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.
- 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 logrotateSegundo, 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-16Y 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 colarseTercero, 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 handlingRespuesta 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.
FINErrores Comunes y Consejos
- Creer que
apt updateactualiza algo. Solo refresca la lista; el par correcto esapt update && apt upgrade, y el&&no es decorativo: si elupdatefalla, actualizar con índices viejos es peor que no actualizar. - Usar
apten scripts en vez deapt-getconDEBIAN_FRONTEND=noninteractive, odpkg -isin más, que instala sin dependencias y deja el sistema en estadoiF(usaapt install ./fichero.deb). - Añadir un repositorio con
apt-key. Eliminado en 24.04 e inseguro por diseño: clave en/etc/apt/keyrings/ySigned-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
holdpuesto y olvidarlo. Un paquete retenido tampoco recibe parches de seguridad: revisaapt-mark showholdcada mes y anota quién decidió cada retención y hasta cuándo. - Consejo: guarda
apt-mark showmanual > paquetes.txtjunto a tus copias. Reconstruir un servidor con esa lista es cuestión de minutos.
Ejercicios
- 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.
- Repositorio de terceros bien montado. Describe los pasos completos y seguros para añadir un repositorio ficticio
https://apt.tramontana.example/(suitenoble, componentemain) que solo deba suministrar el paquetetramontana-agent, e indica cómo verificarías que no puede sustituir paquetes del sistema. - Forense de una actualización. Un compañero dice que «alguien instaló
nginxa mano el martes». Demuestra con comandos cuándo se instaló, si vino de un repositorio o de un.debsuelto, 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: 700Verificació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 8b1a9953c4611296a827abf8c47804d7Vino 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
- ¿Qué es Linux?
- Historia de Linux
- Distribuciones de Linux
- Instalando Linux
- Primer Contacto con el Sistema
- Estructura del Sistema de Archivos de Linux
Módulo 2: Comandos Básicos de Linux
- Introducción a la Línea de Comandos
- Obtener Ayuda y Documentación del Sistema
- Navegando el Sistema de Archivos
- Operaciones con Archivos y Directorios
- Visualización y Edición de Archivos
- Enlaces Duros y Simbólicos
- Permisos y Propiedad de Archivos
Módulo 3: Habilidades Avanzadas en la Línea de Comandos
- El Entorno del Shell: Variables, Alias e Historial
- Uso de Comodines y Expresiones Regulares
- Búsqueda de Archivos y Contenido: find, locate y grep
- Tuberías y Redirección
- Procesamiento de Texto: cut, sort, uniq, sed y awk
- Gestión de Procesos
- Programación de Tareas con Cron
- Comandos de Redes
Módulo 4: Scripting en Shell
- Introducción al Scripting en Shell
- Variables y Tipos de Datos
- Entrada, Salida y Argumentos de un Script
- Estructuras de Control
- Funciones y Librerías
- Depuración y Manejo de Errores
- Scripts de Producción: Buenas Prácticas
Módulo 5: Administración del Sistema
- Gestión de Usuarios y Grupos
- sudo y Permisos Especiales
- Gestión de Paquetes
- Gestión de Discos
- systemd y la Gestión de Servicios
- Registros del Sistema: journald y syslog
- Monitoreo del Sistema y Optimización del Rendimiento
- Respaldo y Restauración
Módulo 6: Redes y Seguridad
- Configuración de Redes
- SSH y Acceso Remoto
- Firewall y Seguridad Perimetral
- Sistemas de Detección de Intrusos
- Gestión de Secretos y Certificados TLS
- Asegurando Sistemas Linux
Módulo 7: Temas Avanzados
- El Proceso de Arranque y la Recuperación del Sistema
- Diagnóstico Avanzado: strace, perf y eBPF
- Optimización del Kernel de Linux
- Virtualización con Linux
- Contenedores de Linux y Docker
- Automatización con Ansible
- Alta Disponibilidad y Balanceo de Carga
