CRIU DOCKER SLURM - ciemat-tic/codec GitHub Wiki

CRIU

##I nstalación

Configuración previa

CRIU y Docker los vamos a instalar en /usr/local/sbin/ . El problema es que cuando ejecutas algo con “sudo”, eso está fuera del path. Es por un motivo de seguridad, como explican en http://unix.stackexchange.com/questions/91541/why-is-path-reset-in-a-sudo-command

la solución, que también aparece ahí, es meter ese directorio en los sitios autorizados de sudo.

Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin ←-- aquí añades :/usr/local/sbin

bajarlo

wget http://download.openvz.org/criu/criu-2.4.tar.bz2 tar -xjvf criu-2.4.tar.bz2

paquetes necesarios

yum group install Development Tools

yum install protobuf protobuf-c protobuf-c-devel protobuf-compiler protobuf-devel protobuf-python libnl3-devel libcap-devel

yum install asciidoc glibc-devel-2.17-105 xmlto

Compilar

make make install

Prueba

criu check

Hacer la carpeta donde se guardarán los archivos mkdir checkpointDir

Ejecutar una aplicación de prueba como un usuario cualquiera ./helloWorld

ver su PID ps -C helloWorld

Checkpoint criu dump -vvvv -o dump.log --shell-job -D checkpointDir --leave-running -t

Checkpoint & matarlo criu dump -vvvv -o dump.log --shell-job -D checkpointDir -t

Levantarlo otra vez criu restore -vvvv -o restore.log --shell-job -D checkpointDir

Docker

Sacado de aquí https://criu.org/Docker y de algún sitio más

Instalación

Hace falta una versión de desarollo específica que contiene la integración con CRIU. Se supone que en el futuro esto no será necesario.

Total, que se baja de aquí: https://github.com/boucher/docker/releases/tag/v1.10_2-16-16-experimental

para que esté en el path, lo metemos en una carpeta que ven todos y lo renombramos a “docker”

mv docker-1.10.0-dev /usr/local/sbin/docker chmod +x /usr/local/sbin/docker

Prueba

Esto son unas pruebas básicas de que docker funciona

Iniciar demonio (como root): docker-1.10.0-dev daemon -D

Crear un contenedor. Contiene un loop infinito: docker run -d --name looper --security-opt seccomp:unconfined busybox /bin/sh -c 'i=0; while true; do echo $i; i=$(expr $i + 1); sleep 1; done'

NOTA: a veces el shell se lia con esto al copiar y pegar. Si da un error “Error response from daemon: Container command not found or does not exist.” es que se ha metido algún carácter raro. A mi me pasaba entre “busybox” y “/bin”.

Ver los contenedores que hay y su estado: docker ps -a

Eliminar uno: docker rm

Ver la salida de uno que está corriendo: docker logs looper

Meterse dentro de uno: docker attach <- en esta, cuando sales (con control+C), apagas el contenedor

docker attach --sig-proxy=false <- en esta, cuando sales (ctrl+C) NO apagas el contenedor

Integración Docker + CRIU

Es trivial.

guardar: ←- esta opción ahora mismo casca docker checkpoint --leave-running looper

Guardar y matar: docker checkpoint looper

Después, se ve el status con docker ps -a

con “docker ps” no se ve xq el checkpoint la ha matado. restaurar: docker restore looper

SI QUEREMOS MIGRAR,

Crear checkpoint en una ubicación determinada docker checkpoint --image-dir=/home/supermanue/Downloads/tests/checkpoint looper1

Crear un contenedor auxiliar. Este será sobrescrito con el que restauremos docker run -d --name looper2 --security-opt seccomp:unconfined busybox /bin/sh -c 'i=0; while true; do echo "manue: " $i; i=$(expr $i + 1); sleep 1; done'

Restaurar, especificando que queremos sobreescribir el contenedor “looper2” y de dónde cogemos la información docker restore --force=true --image-dir=/home/supermanue/Downloads/tests/checkpoint looper2

CRIU PLUGIN

Cosas modificadas:

  • carpteta CRIU: plugin entero
  • configure.ac :
    • decirle que compile el Makefile de criu
    • decir que compruebe si hay que hacer eso con X_AC_CRIU
  • src/plugins/checkpoint
    • añadir “criu” a la lista para que lo compile automáticamente
  • auxdir
    • crear auxdir/x_ac_criu.m4
    • modificarlo para que mire si existe CRIU en /usr/local/sbin (esto es un poco chapuza xq creo que no lee lo que introduce el usuario, comprobarlo
  • checkpoint.h
    • añadir CHECK_CRIU en enum checkpoint_plugin
  • Slurm/spank.h
    • permitir que spank_get_item devuelva el directorio de checkpoint, que lo hemos llamado S_CHECKPOINT_DIR
  • src/common/plugastack.c
    • implementación de lo anterior
    • añadida función spank_set_item, que permite modificar un elemento con spank. Se necesita en el plugin de dmtcp, que tiene que cambiar la manera en la que se ejecuta una aplicación (añadiendo dmtcp_launch al principio)
  • /etc/sudoers
    • #Defaults requiretty -> no se necesita un terminal para hacer sudo
    • supermanue ALL = NOPASSWD: /usr/local/sbin/criu -> mi usuario puede hacer “sudo criu” sin que le pidan password. Habría que hacer esto para todos los usuarios, ver cómo
⚠️ **GitHub.com Fallback** ⚠️