Fase 2: 04_sanitize.py - scrubbing de secretos de skills/agentes/plans (10 secretos unicos, gate en verde)
This commit is contained in:
@@ -0,0 +1,117 @@
|
||||
# Plan: Hacer `02_sudo_wrapdocker.sh` compatible con x86 y ARM
|
||||
|
||||
## Context
|
||||
|
||||
El script `02_sudo_wrapdocker.sh` configura Docker-in-Docker (DinD) dentro de un contenedor. Funciona en x86 (Ubuntu en Synology NAS) pero falla en ARM (Ubuntu en Mac M-series) porque el script fue escrito para **cgroup v1** con jerarquías individuales, mientras que Ubuntu moderno usa **cgroup v2** con jerarquía unificada.
|
||||
|
||||
Además, tu screenshot muestra un error secundario: `/etc/docker/daemon.json` es un directorio en vez de un archivo, lo que impide que dockerd inicie.
|
||||
|
||||
## Problemas identificados
|
||||
|
||||
| Problema | Línea | Impacto en ARM |
|
||||
|----------|-------|-----------------|
|
||||
| `dmsetup mknodes` sin guard | 8 | Error si no existe en ARM |
|
||||
| Mount de tmpfs en `/sys/fs/cgroup` | 17-21 | En cgroup v2 ya está montado → falla |
|
||||
| `for SUBSYS` sobre `/proc/1/cgroup` | 32-62 | `0::/` → `cut -d: -f2` da vacío → mount falla |
|
||||
| Checks de `devices` cgroup | 67-70 | Nunca coinciden en v2 → warnings falsos |
|
||||
| `/etc/docker/daemon.json` es directorio | N/A | dockerd no puede leer config |
|
||||
|
||||
## Implementación
|
||||
|
||||
### Paso 1: Detectar versión de cgroup
|
||||
|
||||
Insertar después de la línea 12:
|
||||
|
||||
```bash
|
||||
# Detect cgroup version
|
||||
CGROUP_VERSION=1
|
||||
if [ -f /sys/fs/cgroup/cgroup.controllers ]; then
|
||||
CGROUP_VERSION=2
|
||||
elif grep -q '0::/' /proc/1/cgroup 2>/dev/null; then
|
||||
CGROUP_VERSION=2
|
||||
fi
|
||||
```
|
||||
|
||||
### Paso 2: Guardar `dmsetup`
|
||||
|
||||
```bash
|
||||
if command -v dmsetup >/dev/null 2>&1; then
|
||||
dmsetup mknodes 2>/dev/null || true
|
||||
fi
|
||||
```
|
||||
|
||||
### Paso 3: Reemplazar bloque de cgroups (líneas 14-62)
|
||||
|
||||
```bash
|
||||
# First, make sure that cgroups are mounted correctly.
|
||||
CGROUP=/sys/fs/cgroup
|
||||
: {LOG:=stdio}
|
||||
|
||||
if [ "$CGROUP_VERSION" = "2" ]; then
|
||||
# cgroup v2: unified hierarchy already mounted at /sys/fs/cgroup
|
||||
# No need to mount individual subsystems
|
||||
:
|
||||
else
|
||||
# cgroup v1: mount individual subsystem hierarchies
|
||||
[ -d $CGROUP ] || mkdir $CGROUP
|
||||
mountpoint -q $CGROUP ||
|
||||
mount -n -t tmpfs -o uid=0,gid=0,mode=0755 cgroup $CGROUP || {
|
||||
echo "Could not make a tmpfs mount. Did you use --privileged?"
|
||||
exit 1
|
||||
}
|
||||
|
||||
if [ -d /sys/kernel/security ] && ! mountpoint -q /sys/kernel/security
|
||||
then
|
||||
mount -t securityfs none /sys/kernel/security || {
|
||||
echo "Could not mount /sys/kernel/security."
|
||||
echo "AppArmor detection and --privileged mode might break."
|
||||
}
|
||||
fi
|
||||
|
||||
for SUBSYS in $(cut -d: -f2 /proc/1/cgroup); do
|
||||
[ -z "$SUBSYS" ] && continue
|
||||
[ -d $CGROUP/$SUBSYS ] || mkdir $CGROUP/$SUBSYS
|
||||
mountpoint -q $CGROUP/$SUBSYS ||
|
||||
mount -n -t cgroup -o $SUBSYS cgroup $CGROUP/$SUBSYS
|
||||
|
||||
echo $SUBSYS | grep -q ^name= && {
|
||||
NAME=$(echo $SUBSYS | sed s/^name=//)
|
||||
ln -s $SUBSYS $CGROUP/$NAME
|
||||
}
|
||||
|
||||
[ $SUBSYS = cpuacct,cpu ] && ln -s $SUBSYS $CGROUP/cpu,cpuacct
|
||||
done
|
||||
fi
|
||||
```
|
||||
|
||||
### Paso 4: Hacer conditional los warnings de devices (líneas 67-70)
|
||||
|
||||
```bash
|
||||
# Only check for devices cgroup on v1 systems
|
||||
if [ "$CGROUP_VERSION" = "1" ]; then
|
||||
grep -q :devices: /proc/1/cgroup ||
|
||||
echo "WARNING: the 'devices' cgroup should be in its own hierarchy."
|
||||
grep -qw devices /proc/1/cgroup ||
|
||||
echo "WARNING: it looks like the 'devices' cgroup is not mounted."
|
||||
fi
|
||||
```
|
||||
|
||||
### Paso 5: Fix del `/etc/docker/daemon.json`
|
||||
|
||||
El archivo `/etc/docker/daemon.json` en el contenedor es un **directorio** en vez de un archivo. Esto se debe probablemente a un volumen montado incorrectamente o a una capa de imagen corrupta. Solución:
|
||||
|
||||
- Verificar si el volumen montado en el host (`daemon-mac-telus.json`) es correcto
|
||||
- Si es un directorio, eliminarlo y recrearlo como archivo
|
||||
- O agregar un paso en el script que verifique y corrija esto antes de iniciar dockerd
|
||||
|
||||
## Archivos a modificar
|
||||
|
||||
| Archivo | Cambio |
|
||||
|---------|--------|
|
||||
| `dev-environment/vscode-server-telus/custom-scripts/02_sudo_wrapdocker.sh` | Reescribir bloque de cgroups (líneas 8-70) |
|
||||
|
||||
## Verificación
|
||||
|
||||
1. **En x86 (cgroup v1):** Comportamiento idéntico al actual — monta cada subsystem, crea symlinks, warn de devices.
|
||||
2. **En ARM (cgroup v2):** Salta mounts individuales, usa jerarquía unificada, no genera warnings falsos.
|
||||
3. **Graceful degradation:** Si `dmsetup` no existe, continúa sin error.
|
||||
Reference in New Issue
Block a user