# Almacenamiento y ajustes del contenedor

Dónde pone install la imagen, la raíz del contenedor y el manifiesto de la instalación, los ajustes del contenedor y las opciones que los cambian, y cómo dimensionar su memoria.

Source: https://docs.jmrp.io/mikroscope/es/install/layout/

`install` pone el tar de la imagen, la raíz del contenedor y el manifiesto de la instalación en un
mismo disco, y crea el contenedor con los ajustes de abajo. Ejecuta `mikroscope plan` con tus
opciones para ver cada valor antes de que se escriba nada.

## Valores por defecto

| Objeto                      | Por defecto                                                                                                           | Opción                                       |
| --------------------------- | --------------------------------------------------------------------------------------------------------------------- | -------------------------------------------- |
| veth + /30                  | `veth-mikroscope`, `172.30.10.0/30` (router `.1`, agente `.2`)                                                        | `--veth`, `--subnet`                         |
| dirección del router        | `172.30.10.1/30` en la veth                                                                                           | derivada de `--subnet`                       |
| manifiesto de la instalación | `mikroscope/<name>.manifest.txt` en la flash interna                                                                 | `--disk`, `--ephemeral`                      |
| tar de la imagen            | `<name>.tar`, subido con `scp` y borrado en cuanto se extrae la imagen; ninguno con `--remote-image`                  | `--disk`, `--ephemeral`, `--remote-image`    |
| raíz del contenedor         | `mikroscope/<name>` en la flash interna                                                                               | `--disk`, `--ephemeral`                      |
| contenedor                  | sin `name=`: RouterOS le pone nombre                                                                                  | `--container-name`                           |
| envlist                     | `<name>-env`                                                                                                          | `--rate`, `--buffer`, `--port`, `--token`, … |
| etiqueta                    | `mikroscope:<name> (managed by mikroscope)` en cada objeto que admite comentario; como `MIKROSCOPE_TAG` en la envlist | `--name`, por defecto `mikroscope`           |

- `--subnet` es una /30 IPv4 dada en su dirección de red; el router toma la `.1` y el agente la
  `.2`. Si `172.30.10.0/30` está en uso en tu router, elige otra: `doctor` nombra la ruta que se
  solapa con ella.
- `--name` y `--container-name` admiten hasta 32 caracteres y `--veth` hasta 64: letras, dígitos,
  `_`, `.` y `-`, empezando por letra o dígito.
- `--disk` es un slot de disco de RouterOS: vacío para la flash interna, `tmpfs`, `disk1`, `usb1` y
  así sucesivamente. Con `--disk`, el manifiesto, el tar y la raíz se mueven juntos:
  `<disk>/<name>.tar` y `<disk>/mikroscope/<name>`.
- Todo borrado selecciona el contenedor por su etiqueta, no por su nombre.

`doctor` comprueba el espacio y el disco antes de que `install` escriba:

Las comprobaciones que ejecuta doctor:

| Comprobación, tal como se imprime | Pasa cuando | La solución que nombra |
| --- | --- | --- |
| free flash ≥ <size> (image tar + extracted root) | sin `--disk` ni `--ephemeral`: `free-hdd-space` es al menos el doble de la imagen más 4 MiB. Con `--remote-image` no se sube nada y el nombre acaba en `(extracted root)`: la raíz en la que se extrae la imagen descargada, 7 MiB, más 4 MiB | libera flash, o instala con `--disk tmpfs` o `--ephemeral` donde exista un disco tmpfs |
| disk <disk> exists | con `--disk` o `--ephemeral`: existe un disco con ese slot | `/disk/add type=tmpfs tmpfs-max-size=64M slot=tmpfs` para un disco en RAM, o nombra un disco existente con `--disk` |
| disk <disk> has ≥ <size> free (image tar + extracted root) | con `--disk` o `--ephemeral`, cuando el disco existe: su espacio libre es al menos el doble de la imagen más 4 MiB; con `--remote-image`, la raíz de 7 MiB más 4 MiB, como en la comprobación de la flash | libera espacio en ese disco, o da a un disco tmpfs un `tmpfs-max-size` mayor |
| disk tmpfs is RAM | con `--ephemeral`: el disco del slot `tmpfs` es de tipo `tmpfs` | libera el slot para un disco tmpfs, o instala con `--disk <slot>` sin `--ephemeral` |
| start-on-boot suits a root in RAM | un aviso, cuando el disco es tmpfs: start-on-boot queda en `no`, porque un reinicio vacía el disco y un contenedor que arranca con el equipo no tiene raíz | pasa `--start-on-boot no`, o `--ephemeral` |

## Persistente o efímera

|                            | Por defecto             | `--disk tmpfs`                                                  | `--ephemeral`                                                    |
| -------------------------- | ----------------------- | --------------------------------------------------------------- | ---------------------------------------------------------------- |
| Manifiesto, tar y raíz     | flash interna           | el disco tmpfs                                                  | el disco tmpfs                                                   |
| `start-on-boot`            | `yes`                   | `yes`; `doctor` avisa                                           | `no`                                                             |
| Escrituras en flash        | el tar y la raíz        | ninguna para el tar y la raíz                                   | ninguna                                                          |
| Tras un reinicio           | el agente vuelve a arrancar | la raíz desaparece, y un contenedor que arranca con el equipo no tiene ninguna | el contenedor está parado, sin raíz, imagen ni manifiesto |

- **Persistente es lo predeterminado**: la raíz en la flash interna, `start-on-boot=yes` y
  `restart-policy=on-failure` limitado a cinco reinicios separados diez segundos, para que una
  imagen rota no entre en bucle al arrancar.
- **`--ephemeral`** pone el manifiesto, el tar y la raíz en el disco del slot `tmpfs`, que tiene que
  ser un disco en RAM, y fija `start-on-boot=no`. No se escribe nada en la flash
  ([medido](https://docs.jmrp.io/mikroscope/es/about/status/#verified-tmpfs-zero-writes)), y nada sobrevive a un reinicio. Un router
  sin ese disco no pasa `doctor`, cuya solución añade uno:

  ```routeros
  /disk/add type=tmpfs tmpfs-max-size=64M slot=tmpfs
  ```

- **`--disk tmpfs`** sin `--ephemeral` pone los mismos ficheros en el disco tmpfs y mantiene
  `start-on-boot=yes`, de lo que `doctor` avisa. Añade `--start-on-boot no`, o usa `--ephemeral`.

Tras un reinicio, el contenedor de una instalación `--ephemeral` sigue configurado y parado, y su
manifiesto se fue con el disco ([probado](https://docs.jmrp.io/mikroscope/es/about/status/#virtual-lab)).
`uninstall --ephemeral` quita el resto por su etiqueta.

## Ajustes del contenedor

| Ajuste                        | Valor                                                                        | Opción                                          |
| ----------------------------- | ---------------------------------------------------------------------------- | ----------------------------------------------- |
| `name=`                       | no se escribe, así que RouterOS le pone nombre al contenedor                 | `--container-name`                              |
| `file=` o `remote-image=`     | el tar subido, o la referencia entera, con el host del registro incluido     | `--agent-tar`, `--remote-image`                 |
| `interface=`                  | la veth                                                                      | `--veth`                                        |
| `root-dir=`                   | `mikroscope/<name>` en el disco                                              | `--disk`, `--ephemeral`, `--name`               |
| `envlist=`                    | `<name>-env`                                                                 | `--name`                                        |
| `logging=`                    | `yes`, para que lo que imprime el agente llegue al log del router            | ninguna                                         |
| `start-on-boot=`              | `yes`; `no` con `--ephemeral`                                                | `--start-on-boot`: `auto`, `yes` o `no`         |
| `restart-policy=`             | `on-failure`                                                                 | ninguna                                         |
| `restart-max-count=`          | `5`                                                                          | `--restart-max-count`, 0–100                    |
| `restart-interval=`           | `10s`                                                                        | `--restart-interval`, `^\d{1,4}[smh]$`          |
| `memory-max=`                 | `64M`, aplicado como límite del cgroup del contenedor                        | `--memory-max`                                  |
| `privileged=`                 | `yes`                                                                        | `--privileged=false`                            |
| `ignore-remote-image-change=` | `yes`                                                                        | ninguna                                         |
| `comment=`                    | la etiqueta                                                                  | `--name`                                        |

- `--start-on-boot auto` es `no` con `--ephemeral` y `yes` en otro caso.
- `privileged=yes` quita el espacio de nombres de usuario del contenedor, para que el log del
  kernel, `/proc/slabinfo` y los contadores ECC de la MTD se puedan leer. No amplía el espacio de
  nombres de red ni el de PID; [Modo privilegiado](https://docs.jmrp.io/mikroscope/es/limits/privileged/) tiene el
  detalle.
- El agente captura SIGTERM; RouterOS mata al instante un contenedor que no lo hace. El agente se
  detiene dentro del tiempo de parada por defecto de RouterOS, 10 s.

## Limpieza del tar

RouterOS extrae la imagen cuando se añade el contenedor, y después el tar ya no sirve para nada. En
la vía del tar, `install`:

1. añade el contenedor;
2. espera a que RouterOS lo marque `stopped`, que es cuando termina la extracción, hasta
   `--extract-timeout` (por defecto `120s`, de 10 a 600 s);
3. borra el tar;
4. arranca el contenedor.

Si se agota el tiempo, se detiene con `mikroscope: the image was not extracted within 120 s;
mikroscope.tar stays`. El tar se queda con el contenedor, y `uninstall` quita los dos juntos. Un tar
olvidado sería lo que `uninstall` tendría que encontrar después, en un índice de `/file` que puede ir
minutos por detrás del borrado de un contenedor.

El contenedor se crea con `ignore-remote-image-change=yes`. Con `no`, RouterOS vigila la imagen, y
quitar el tar hace que pare, quite y vuelva a extraer el contenedor minutos después
([verificado](https://docs.jmrp.io/mikroscope/es/about/status/#verified-remote-image-change)).

Hasta que se borra el tar, este y la raíz extraída de él comparten disco, así que `doctor` pide el
doble de la imagen más 4 MiB. Con `--remote-image` no se sube nada: RouterOS se baja las capas, no
hay tar al que esperar ni que borrar, y `doctor` pide la raíz extraída, 7 MiB, más 4 MiB. La raíz
sigue yendo donde digan `--disk` y `--ephemeral`.

## Manifiesto de la instalación

`install` escribe primero el manifiesto de la instalación, `mikroscope/<name>.manifest.txt` junto a
la raíz del contenedor, y `uninstall` lo borra al final. Recoge cómo se hizo la instalación y cada
objeto que creó:

```text
mikroscope-manifest=1
name=mikroscope
tag=mikroscope:mikroscope (managed by mikroscope)
disk=
veth=veth-mikroscope
subnet=172.30.10.0/30
port=9123
iface-list=LAN
addr-list=LANs
expose=
container-name=
remote-image=registry-1.docker.io/jmrplens/mikroscope-agent:1.6.1
token=no
dir=mikroscope
file=mikroscope/mikroscope.manifest.txt
object=/interface/veth name=veth-mikroscope
object=/ip/address interface=veth-mikroscope
object=/interface/list/member interface=veth-mikroscope list=LAN
object=/ip/firewall/address-list list=LANs address=172.30.10.0/30
object=/container/envs list=mikroscope-env
object=/container interface=veth-mikroscope
dir=mikroscope/mikroscope
```

- Las líneas de cabecera son la forma de la instalación, con los nombres de las opciones de la CLI.
  `status`, `upgrade` y `uninstall` las leen, así que no necesitan ninguna opción de forma, y
  rechazan la que las contradiga.
- `token=` dice solo si se puso un token, nunca su valor. El manifiesto no guarda ningún secreto.
- `dir=`, `file=` y `object=` enumeran lo que creó la instalación, en orden de creación: una ruta, o
  un menú y un selector que, con la etiqueta, selecciona el objeto.
- Lo escriben todas las vías de instalación: `install` y `upgrade` de la CLI, y el script de
  `plan --rsc`.
- Una instalación sin manifiesto, hecha por una CLI anterior o una `--ephemeral` tras un reinicio, se
  lee de sus objetos etiquetados.

## Contenido de la envlist

La envlist guarda la configuración del agente y la marca de propiedad, y nada más:

Las entradas que install escribe en la envlist del agente:

| Clave | Se escribe | Viene de | Contiene |
| --- | --- | --- | --- |
| `MIKROSCOPE_TAG` | siempre | `--name` | la marca de propiedad `mikroscope:<name> (managed by mikroscope)`, que se escribe la primera y se borra la última; el agente la ignora |
| `RATE_HZ` | siempre | `--rate`, por defecto `10`, 1–100 | la cadencia del muestreador, en Hz |
| `BUFFER_S` | siempre | `--buffer`, por defecto `60`, 10–3600 | la longitud del anillo, en segundos |
| `PORT` | siempre | `--port`, por defecto `9123`, 1–65535 | el puerto HTTP del agente |
| `ADDR` | siempre | `--subnet` | la dirección del agente, la `.2` de la /30; el agente solo escucha ahí |
| `MEM_LIMIT_MB` | siempre | `--mem-limit-mb`, 8–1024 | el límite blando de memoria de Go del agente, en MiB; se deriva del anillo (cadencia × búfer × línea, × 2,5, con un mínimo de 16 MiB y un máximo de tres cuartos de `--memory-max` mientras en él aún quepa el anillo) salvo que lo fije `--mem-limit-mb` |
| `FLOOR_HZ` | solo cuando es mayor que 0 | `--floor-hz`, por defecto `0`, 0–1000 | una sola cadencia para todas las fuentes de nivel, en Hz |
| `CAPTURE_MB` | siempre | `--capture-mb`, por defecto `4`, 0–256 | el presupuesto de capturas por disparo, en MiB; `0` las desactiva |
| `TRIGGERS` | solo cuando se da | `--triggers` | las condiciones de disparo; sin ella, el agente usa su conjunto por defecto |
| `TOKEN` | solo cuando se da | `--token` | el token bearer que exige el agente, de `--token` o `MIKROSCOPE_TOKEN`, con o sin `--expose` |

No va en ella ninguna dirección de destino, ningún token de destino ni ninguna credencial de la API.
Trata todo lo que contiene, el token incluido, como legible por cualquier usuario de RouterOS con
`read`: un usuario así puede listar la envlist de cualquier contenedor por la API
([verificado](https://docs.jmrp.io/mikroscope/es/about/status/#verified-read-user-envlist)). El plan imprime el token enmascarado como
`(token)`. [Modelo de seguridad](https://docs.jmrp.io/mikroscope/es/security/) dice qué credencial vive dónde, y
[Variables de entorno](https://docs.jmrp.io/mikroscope/es/reference/environment/) enumera las variables que lee el agente
además de estas.

## Tamaño de la memoria

Mueve `--memory-max` y `--mem-limit-mb` con `--rate` y `--buffer`:

- El anillo guarda `rate × buffer` líneas de unos 3,5 kB cada una.
- El límite blando de Go quiere más o menos el doble del anillo y tiene que quedar holgadamente por
  debajo de `memory-max`. `--mem-limit-mb 0`, el valor por defecto, lo deriva: 16 MiB para 10 Hz y
  un anillo de 60 s bajo `64M`.
- La comprobación de arranque del agente cuenta 3 456 B por línea
  más `--capture-mb`. Por encima de `memory-max` se niega a arrancar; por encima de la mitad de
  `--mem-limit-mb` avisa.

Los valores por defecto aguantaron a 10, 50 y 100 Hz: `--buffer 60`, el `--mem-limit-mb` derivado y
`--memory-max 64M` ([medido](https://docs.jmrp.io/mikroscope/es/about/status/#campaign-rates-2026-09-18)). Lo que cuesta un límite
ajustado está en [Coste del agente](https://docs.jmrp.io/mikroscope/es/cost/), y cada cadencia en [Techo de
muestreo](https://docs.jmrp.io/mikroscope/es/cost/rate-ceiling/).

## Véase también

- [Instalar con la CLI](https://docs.jmrp.io/mikroscope/es/install/): el orden en que se crean estos objetos.
- [Actualizar y desinstalar](https://docs.jmrp.io/mikroscope/es/install/upgrade/#uninstall): cómo se quitan.
- [Techo de muestreo](https://docs.jmrp.io/mikroscope/es/cost/rate-ceiling/): lo que cuesta cada cadencia con las
  opciones de memoria de arriba.
- [Modo privilegiado](https://docs.jmrp.io/mikroscope/es/limits/privileged/): el único ajuste del contenedor que es una
  concesión de privilegio real.
- [Modelo de seguridad](https://docs.jmrp.io/mikroscope/es/security/): qué más puede leer la envlist.
