Files
qwen3-6-lora/data/raw/sanitized/plans/quisiera-que-dev-environment-vscode-serv-happy-creek.md
T

4.2 KiB

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:

# 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

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)

# 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)

# 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.