Sigla en azul →glosario(primera vez: expansión entre paréntesis).
M11 — Sistemas operativos
Por qué existe
Tu aplicación no flota en el vacío: corre sobre un kernel, con procesos, memoria, archivos y permisos. Un contenedor mal configurado o un backup que nunca probaste restaurar se convierten en incidentes reales cuando llega el piloto de Agenda Ops (M17). Esta materia enlaza con el hilo de seguridad: least privilege en el host y en la imagen.
En resumen: administras procesos, permisos y un contenedor sin abusar de root ni meter secretos en la imagen.
Objetivos de aprendizaje
Al terminar debes poder:
- Explicar proceso vs hilo y qué implica el scheduling a nivel de operación (no teoría de exámenes).
- Leer uso de memoria de un proceso Node y reconocer síntomas de OOM.
- Aplicar permisos de archivos y usuarios/grupos con criterio (evitar
chmod 777). - Escribir scripts bash con
set -euo pipefailpara backup y rotación de logs. - Empaquetar un servicio Node en Docker con volumen persistente y usuario no-root cuando sea posible.
- Documentar un playbook local reproducible para levantar API + base de datos.
Cómo estudiar esta materia (lecciones)
M11 usa lecciones L01–L16 (como M01): terminal, scripts y Docker con evidencia en projects/m11-so/.
- Orden L01 → L16; marca solo con “Hecho cuando” cumplido.
- Cada concepto del libro → un comando o experimento el mismo día.
- Piensa en el stack de Agenda Ops (API Node + Postgres en contenedor).
- Prácticas P1–P3 y playbook se distribuyen en las lecciones indicadas.
- Cómo estudiar.
Semana tipo (20 h)
| Bloque | Horas | Qué haces |
|---|---|---|
| Procesos / memoria / FS | 10–12 | 4 lecciones (~5 h c/u) |
| Scripts ops (P2) | 4–6 | Backup, rotación, restore |
| Docker + playbook (P3) | 4–6 | Imagen no-root, compose |
| Retro | 1 | Permiso o señal que evitó un incidente |
Si un día solo tienes 2 h: una lección práctica. No saltes la lectura de esa lección.
Lecciones
Semana 1 — Procesos, hilos y señales (~20 h)
| ID | Lección | ~h |
|---|---|---|
| L01 | Procesos, permisos y bitácora día 1 | 5 |
| L02 | Proceso vs hilo y el runtime Node | 5 |
| L03 | Señales SIGTERM y apagado graceful | 5 |
| L04 | Cierre semana 1 — práctica P1 | 5 |
Semana 2 — Memoria y contenedores (cgroups) (~20 h)
| ID | Lección | ~h |
|---|---|---|
| L05 | Memoria virtual y paginación (intuición) | 5 |
| L06 | Observar RSS y CPU de Node | 5 |
| L07 | OOM, ulimit y síntomas | 5 |
| L08 | cgroups y memoria en contenedores | 5 |
Semana 3 — Archivos, permisos y scripts ops (~20 h)
| ID | Lección | ~h |
|---|---|---|
| L09 | Sistema de archivos: inodos y espacio | 5 |
| L10 | Permisos, usuarios y mínimo privilegio | 5 |
| L11 | Script de backup automatizado (P2) | 5 |
| L12 | Rotación de logs y restore de prueba | 5 |
Semana 4 — Docker y playbook local (~20 h)
| ID | Lección | ~h |
|---|---|---|
| L13 | Imágenes, contenedores y volúmenes | 5 |
| L14 | Dockerfile Node sin root (P3) | 5 |
| L15 | docker compose: API y base de datos | 5 |
| L16 | Playbook local y cierre M11 | 5 |
Empieza por L01 hoy.
Lecturas (mapa rápido)
Canon: Fundamentos de sistemas operativos — Silberschatz, Galvin, Gagne (ed. ES). Catálogo: bibliografía.
| Semana | Lecciones | Capítulos (por tema) | Alternativa / práctica |
|---|---|---|---|
| 1 | L01–L04 | Procesos e hilos + señales | ps, top, Node + SIGTERM |
| 2 | L05–L08 | Memoria virtual, OOM, cgroups | RSS Node, límites Docker |
| 3 | L09–L12 | Sistema de archivos + protección | Permisos, backup P2 |
| 4 | L13–L16 | Contenedores + síntesis | Dockerfile, compose, playbook |
Regla: un experimento documentado por semana en projects/m11-so/.
Ejemplo — backup simple con rotación
#!/usr/bin/env bash
set -euo pipefail
BACKUP_DIR="${BACKUP_DIR:-./backups}"
RETENTION_DAYS="${RETENTION_DAYS:-7}"
mkdir -p "$BACKUP_DIR"
DATE=$(date +%F)
# Ajusta el comando a tu motor (pg_dump, mysqldump, etc.)
pg_dump "$DATABASE_URL" > "$BACKUP_DIR/db-$DATE.sql"
find "$BACKUP_DIR" -name 'db-*.sql' -mtime +"$RETENTION_DAYS" -delete
Regla: el script debe poder ejecutarse en cron o en un job de CI sin secretos hardcodeados (usa variables de entorno).
Ejemplo — Dockerfile con usuario no-root (idea)
FROM node:20-bookworm-slim
WORKDIR /app
RUN groupadd -r app && useradd -r -g app app
COPY --chown=app:app package*.json ./
RUN npm ci --omit=dev
COPY --chown=app:app . .
USER app
EXPOSE 3000
CMD ["node", "dist/server.js"]
Los secretos van en .env / secret manager del host, no en docker build.
Temario semanal
Semana 1 — Procesos, hilos y señales (~20 h)
- Estados de proceso; proceso vs hilo en tu runtime (Node event loop + workers opcionales).
- Comandos:
ps,top/htop,kill, señalesSIGTERM/SIGKILL. - Experimento: un proceso Node que ignora vs maneja
SIGTERM(graceful shutdown). - Bitácora en
projects/m11-so/labs/semana-01-procesos.md.
Semana 2 — Memoria y rendimiento a nivel SO (~20 h)
- Memoria virtual y paginación (intuición); por qué aparece OOM.
- Observar RSS/CPU de tu API o de
nodebajo carga ligera. - Límites:
ulimitintro; relación con contenedores (cgroups, alto nivel). - Nota: qué harías si el piloto Agenda Ops se queda sin RAM en un VPS pequeño.
Semana 3 — Sistema de archivos, I/O y permisos (~20 h)
- Inodos, rutas, enlaces;
df,du, permisosrwx,umask. - Usuarios, grupos,
chmod/chown; principio de mínimo privilegio para datos y logs. - Práctica P2: script de rotación de logs (tamaño o fecha) versionado en el repo.
- Ensayo de restore de un backup (aunque sea a una BD vacía de prueba).
Semana 4 — Contenedores + playbook local (~20 h)
- Imagen vs contenedor; volúmenes para datos persistentes (Postgres).
docker composemínimo: API + DB; redes internas; no publicar puertos de DB sin necesidad.- Práctica P3: Dockerfile Node + volumen; usuario no-root documentado.
- Proyecto: playbook en
projects/m11-so/playbook.md(levantar, parar, backup, restore).
Prácticas
- P1 — Labs: Notas de procesos, señales y permisos con comandos reproducibles (
projects/m11-so/labs/). - P2 — Scripts: Backup automatizado + rotación de logs (o backups) en scripts versionados; al menos un restore de prueba documentado.
- P3 — Docker:
Dockerfilepara servicio Node + volumen de datos; contenedor sin root innecesario;docker-compose.ymlo equivalente documentado.
Proyecto útil
Playbook de operación local del stack: en projects/m11-so/ deja:
playbook.md: prerequisitos,docker compose up, variables de entorno, cómo hacer backup y restore.- Scripts en
scripts/oprojects/m11-so/scripts/referenciados desde el playbook. - Diagrama simple (texto o Mermaid): host → contenedores → volumen Postgres.
Este playbook es la base ops antes de M19 (staging/prod).
Errores comunes
- Correr todo como
rooten el host o en el contenedor “porque es más fácil”. chmod 777en directorios de datos o logs compartidos.- Backup sin restore de prueba (descubres el fallo el día del incidente).
- Secretos en la imagen Docker o en capas cacheadas del build.
- Exponer el puerto de la base de datos al mundo en
docker-compose“solo en local” y olvidar quitarlo después.
Evidencia de hecho
Marca la práctica en la UI solo si existe esto (o equivalente claro):
- P1 — Labs:
projects/m11-so/labs/con notas de procesos/señales/permisos (mín. semanas 1 y 3). - P2 — Scripts: Scripts de backup + rotación en el repo; entrada en
projects/m11-so/restore-prueba.md(fecha y resultado del restore). - P3 — Docker:
projects/m11-so/Dockerfile(o ruta documentada) +docker-compose.yml+ nota de usuario no-root. - Proyecto — Playbook:
projects/m11-so/playbook.mdcompleto y enlazado desdeprojects/m11-so/README.md.
Criterios de dominio
- Explicas proceso vs hilo y qué hace una señal
SIGTERMen tu API. - Tienes script de backup y al menos un restore de prueba documentado.
- Tu contenedor Node no corre como root sin justificación escrita.
- Otro desarrollador puede levantar el stack local siguiendo solo tu playbook.