CRIU DOCKER SLURM - ciemat-tic/codec GitHub Wiki
##I nstalación
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
wget http://download.openvz.org/criu/criu-2.4.tar.bz2 tar -xjvf criu-2.4.tar.bz2
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
make make install
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
Sacado de aquí https://criu.org/Docker y de algún sitio más
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
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
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
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: "
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
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