Monter un Object Storage sur le système de fichier GNU/Linux

 

Au travers de l'article Swift avec Owncloud j'expliquais comment utiliser le module "External storage support" pour stocker les fichiers via Owncloud dans un object storage swift tel que celui proposés par OVH.

Le problème avec cette connexion c'est que le dossier créé sur l'object storage deviens un répertoire partagé pour les utilisateurs auxquels nous donnons les droits.

J'avais toujours dans l'idée de trouver une solution pour héberger mes données sur un object storage pour l'ensemble des données des utilisateurs en respectant la séparation de droits et d'accès de chaque utilisateur, en soit de pouvoir directement stocker le répertoire data dans un object storage.

En faisant des recherches pour un autre projet je suis tombé sur S3QL, S3QL est un système de fichier permettant de stocker les données en ligne sur des services de stockage tels que Google Storage, Amazon S3, ou OpenStack Swift. En plus d'être un système de fichier standard UNIX, il dispose de fonctionnalités avancées tels que la compression, le chiffrage, la déduplication et le snapshotting.

Le mieux est de le mettre en place pour tester.

Installation

L'installation va se faire sur une Debian 8, par contre j'ai eu des problèmes avec la version en paquets de s3ql, donc voici comment procéder.

Récupérer le script officiel et l'exécuter :

# wget https://raw.githubusercontent.com/szepeviktor/debian-server-tools/master/package/s3ql-jessie.sh
# chmod +x  s3ql-jessie.sh
# ./s3ql-jessie.sh

Créer un fichier d'authentification par exemple :

# mkdir .s3ql
# chmod 700 .s3ql/

Fichier .s3ql/authinfo

[swift]
backend-login: tenant:username
backend-password: password
storage-url: swiftks://auth.cloud.ovh.net/<region>:<contener>

# chmod 600 .s3ql/authinfo

Il faut bien sur que le conteneur existe, le créer avant si besoins (exemple avec l'api openstack : swift post conteneur_name)

Créer la partition

Créer le système de fichier

# /usr/local/bin/mkfs.s3ql --authfile /root/.s3ql/authinfo swiftks://auth.cloud.ovh.net/<region>:<contener>
Before using S3QL, make sure to read the user's guide, especially
the 'Important Rules to Avoid Loosing Data' section.
Enter encryption password:

Generating random encryption key...
Creating metadata tables...
Dumping metadata...
Dumping metadata...
..objects..
..blocks..
..inodes..
..inode_blocks..
..symlink_targets..
..names..
..contents..
..ext_attributes..
Compressing and uploading metadata...
Wrote 154 bytes of compressed metadata.
Cycling metadata backups...
Backing up old metadata...
Please store the following master key in a safe location. It allows
decryption of the S3QL file system in case the storage objects holding
this information get corrupted:
---BEGIN MASTER KEY---
*********************************************************************
---END MASTER KEY---

Entrer deux fois le password et le rajouter dans le fichier d'authentification à la fin :
fs-passphrase: password

Comme conseillé, gardez en lieu sur la clé

Montage de la partition

# /usr/local/bin/mount.s3ql --cachedir /var/cache/s3ql --authfile /root/.s3ql/authinfo --compress none --cachesize 1048576 swiftks://auth.cloud.ovh.net/<region>:<contener> /mnt/tmp
Using 4 upload threads.
Autodetected 65492 file descriptors available for cache entries
Using cached metadata.
Mounting swiftks://auth.cloud.ovh.net/<region>:<contener>/ at /mnt/tmp...

Le montage est opérationel, il reste à y récopier des fichiers avec les commandes standard.

Montage automatique

On va utiliser systemd pour monter le répertoire automatiquement en cas de reboot du serveur :
Créer un fichier : /lib/systemd/system/s3ql.service contenant :

[Unit]
Description=mount s3ql filesystem

[Service]
User=next
Group=next
ExecStart=/usr/local/bin/mount.s3ql --fg --cachedir /var/www/nextcloud/var/cache/s3ql --authfile /var/www/nextcloud/etc/authinfo2 --compress none --cachesize 1048576 --allow-root swiftks://auth.cloud.ovh.net/<region>:<contener> /var/www/nextcloud/data
ExecStop=/usr/local/bin/umount.s3ql /var/www/nextcloud/data
TimeoutStopSec=42

[Install]
WantedBy=multi-user.target

Ici je monte l'object storage en tant que répertoire data pour nextcloud.

systemctl enable s3ql
systemctl start s3ql

Vérifiez que le montage est opérationnel.

Maintenance

En cas de problèmes de montage il peut être nécessaire de lancer un fsck :

Il faut que le système de fichier soit démonté :

/usr/local/bin/fsck.s3ql --force swiftks://auth.cloud.ovh.net/<region>:<contener>

Remarques

Déduplication

Attention, la première surprise c'est que l'espace déclaré sur l'object storage n'est pas le même que la taille des fichiers stockés.


# dd if=/dev/zero of=/mnt/tmp/bigfile bs=1M count=10240
10240+0 enregistrements lus
10240+0 enregistrements écrits
10737418240 octets (11 GB) copiés, 137,171 s, 78,3 MB/s

# df -h
Sys. de fichiers                             Taille Utilisé Dispo Uti% Monté sur
swiftks://auth.cloud.ovh.net/SBG1:logs-data/   1,0T     10M  1,0T   1% /mnt/tmp

Alors que


# ls -lha /mnt/tmp/bigfile 
-rw-r--r-- 1 root root 10G févr.  2 09:03 /mnt/tmp/bigfile

Données stockées sur l'object storage

Autre chose si je liste le contenu de l'object storage avec le client swift :


$ swift list logs-data
s3ql_data_1
s3ql_metadata
s3ql_metadata_new
s3ql_metadata_tmp$oentuhuo23986konteuh1062$
s3ql_passphrase
s3ql_passphrase_bak1
s3ql_passphrase_bak2
s3ql_passphrase_bak3
s3ql_seq_no_1
s3ql_seq_no_2

Montage sur un autre serveur

Si on essaie de monter l'object storage sur un autre serveur :

ERROR: Backend reports that fs is still mounted elsewhere, aborting.

On ne peut monter l'object storage que sur un seul serveur.

La solution est de faire un export NFS, pour cela il faut rajouter l'option --nfs dans le montage :


# /usr/local/bin/mount.s3ql --fg --nfs --cachedir /var/cache/s3ql --authfile /root/.s3ql/authinfo --compress none --cachesize 1048576 --allow-root swiftks://auth.cloud.ovh.net/: /mnt/tmp

Installer le serveur nfs et faire un export :


# exportfs -rav
exporting 10.30.0.0/255.255.0.0:/mnt/tmp

Et voilà je peux maintenant stocker mes fichiers sur l'object storage de façon classique.