Últimamente he estado explorando los sistemas de archivos en la nube y poco a poco voy aprendiendo algunos trucos. El contenido de este post no es nuevo, es algo que es posible poner junto con un poco de tiempo, o preguntándole a un agente de AI. Sin embargo, la idea es ofrecer una guía bastante práctica de como juntar la información disponible para lograr un objetivo bastante concreto, y explicar un poco el por qué de las cosas.
Algunos conceptos útiles. No es necesario leerlos si ya estás familiarizado con el contexto.
Es una forma de hacer que los usuarios puedan crear sus propios sistemas de archivos (file systems) en linux. Otra forma de ponerlo es el que se pueda usar archivos, generalmente remotos, en el sistema de archivos local, incluyendo la interfaz gráfica y CLI (línea de comando).
Herramienta open-source para administrar containers y todas las cosas relacionadas. Es compatible con OCI (Open Container Initiative), además su API e interfaz de línea de comando es igual a la de Docker, por lo que para fines prácticos es posible incluso usarla como alias de docker.
Es una herramienta open-source para CLI que permite administrar contenido en cloud u otros almacenamientos con latencia alta. Ofrece muchísimas funcionalidades como verificar los hashes de los archivos, sólo actualizar los archivos que han cambiado, montar localmente archivos de la nube, hacer respaldos automáticos, entre otras.
Lo primero es obtener la imagen de rclone para podman, está en el registro de docker, curiosamente usa el hash en lugar de la versión, por lo que es un poco difícil saber cuál es la más reciente. De hecho en este momento no recuerdo cómo lo supe la última vez, hoy la imagen ya estaba en local.
Después, como me pareció difícil siempre escribir el registro y el hash le creé un alias local, eso se hace con podman tag nombre-original:tag nuevo-nombre:tag, si omitimos el tag, éste será “latest” que no es ideal, pero en este caso puede ser conveniente.
Para poder montar el sistema de archivos de s3 es necesario ejecutar podman como root, existen otras alternativas, pero esta era la más simple. Además se necesitan otras opciones al momento de ejecutar el comando, las describiré brevemente, pero la realidad es que no quería ponerme a buscar mucho, porque me pasa seguido que termino perdiendo días en aprender algo que es muy interesante pero me distrae de mi objetivo, así que usé deepseek.
Por motivos de seguridad/arquitectura podman tiene distintas imágenes si es usado rootless y si es usado como root, por lo que nuestra imagen no aparece, podríamos haber bajado la imagen del registro como root y crearle el alias como root, pero como no fue lo que hice, y me pareció interesante y simple aprender a copiar las imágenes, lo pongo aquí: podman image save rclone | sudo podman image load, al final es algo muy simple, save guarda la imagen como tar, y load lee la imagen.
Antes de crear el contenedor necesitamos encargarnos de dos directorios. El primero es un directorio que se montará como volumen para la configuración, es necesario montar todo el directorio y no sólo el archivo. El segundo es el punto en el que montaremos el archivo de sistema, este directorio también lo pasaremos al contenedor.
Me gusta crear un directorio para los proyectos, incluso si no tendrán ningún contenido utilizable directamente, aunque a veces termino por agregar un README.md con las instrucciones de lo que hice o por qué lo creé. En mi caso tengo /home/migsar/proyectos/rclone/ y dentro creé config/ para la configuración, que es un simple archivo de texto. Después de crear este directorio podríamos usar el contenedor de rclone para crear la configuración pero lo dejaré para el siguiente paso.
Siguiendo las convenciones de linux el directorio para montar mi sistema de archivos lo creé en /mnt/, pero puede crearse en cualquier lugar.
Para crear la configuración rclone trae una opción específica que es interactiva e incluye muchas opciones, lo único que tenemos que recordar es que como estamos usando un contenedor si no montamos un volumen con un directorio en el host el archivo creado será efímero. En este paso da igual si usamos podman como root o no.
podman run -it --rm -v ./config/:/config/rclone:ro rclone config
Ahora que todo está listo sólo tenemos que montar el sistema de archivos, existen varias flags que son necesarias porque necesitamos que el sistema host permita al contenedor montar un sistema de archivos que podrá ser usado desde afuera, lo que evidentemente representa un riesgo de seguridad.
# !! IMPORTANT: Run this command with sudo for rootful Podman !!
sudo podman run --rm \
--privileged \
--device /dev/fuse \
--security-opt apparmor:unconfined \
--volume ./config/:/config/rclone:ro \
--volume /mnt/lin:/mnt/data:shared \
rclone \
mount mount-point:bucket-name /mnt/data \
--allow-other \
--allow-non-empty \
--vfs-cache-mode full
Un detalle que me pareció importante es el de el segundo volumen, creo que el punto en el que lo montamos no es importante, lo importante es que coincida el volumen montado en el contenedor con el punto de montaje usado por rclone mount.
Cuando terminemos de usarlo sólo es necesario detener el contenedor, en mi caso, decidí correrlo expuesto, no como demon, porque no sabía si habría algún mensaje que quisiera ver, así que cuando terminé de usarlo sólo necesite terminar el proceso y el contenedor terminó automáticamente, si está corriendo en el fondo es importante darle un nombre --name rclone al correrlo, para poder usar podman stop rclone al terminar.
Encontré que podía ser necesario usar sudo fusermount -u /path/on/host o sudo umount /path/on/host pero en mi caso no fue necesario, verifiqué que no estaba montado con mount | grep /path/on/host.