Category Archives: Stockage

Comment déplacer une énorme quantité de fichiers ?

Pas simple.

C’est la question à laquelle essaient de répondre Ganaël Laplanche et Jean-Baptiste Denis dans « Parallélisez vos transferts de fichiers », p14 GNU/Linux Magazine France n°164.

On peut déjà trouver des éléments sur la page « Moving Your Data – It’s Not Always Pleasant » (cité dans l’article de GNU/Linux Mag)

Mais il existe surtout un outil très pratique, open source, développé par Ganaël Laplanche : fpart.

Voici la description donnée sur le site officiel :

« Fpart est un outil permettant de trier des fichiers et de les répartir dans plusieurs « partitions ». Il est développé en C et est disponible sous licence BSD.

Il divise une liste de fichiers ou de répertoires en un certain nombre de partitions, tout en essayant de générer des partitions de même taille et contenant un même nombre de fichiers. Il peut également produire des partitions contenant un nombre donné de fichiers ou ayant une taille limitée.

Une fois générées, les partitions sont soit affichées sur la sortie standard, soit écrites dans des fichiers. Les listes générées peuvent ensuite être utilisées par des programmes tiers.

Fpart dispose aussi d’un mode « live », qui lui permet d’examiner de très gros systèmes de fichiers tout en produisant des partitions. Des hooks sont disponibles afin d’agir sur ces partitions (ex. : démarrer immédiatement un transfert avec rsync(1)) sans avoir à attendre la fin de l’examen complet du système de fichiers. Utilisé de cette manière, fpart peut être vu comme un puissant outil de migration de données. »

Déplacer plusieurs LUN vers un autre storage domain ou une autre classe de stockage sans surcharger la baie

Ce script lance une série de migrations de LUN, mais en prenant soin de n’en faire qu’une seule à la fois, pour ne pas surcharger la baie.

Il faudrait certainement ajouter quelques variables à ce script pour une meilleure personnalisation, mais voilà comment il fonctionne :

  •  lecture d’une liste de lun à migrer (liste_${AXIOM}_sd1.txt) vers un storage domain (/Bricks_FC_SD1)
  • migration des LUN
  • lecture d’une liste de lun à migrer (liste_${AXIOM}_sd2.txt) vers un autre storage domain (/Bricks_FC_SD2)
  • migration des LUN

$AXIOM correspondant au nom de l’axiom précisé en argument de la ligne de commande.

#!/bin/bash

# binaire axiomcli
AXIOMCLI="/tools/axiom-cli/axiomcli"

# script de login
LOGIN="/tools/axiom/login_pillar.sh"

# Temps d'attente avant verification fin migration (en s)
SLEEPTIME="600"

[ $# -ne 1 ] && { echo "verifier les params" ; exit; }

# Nom axiom concerne
AXIOM="$1"

set -- $(date +"%Y %m %d %H %M %S")
LOGFILE="${0}_$AXIOM-$1$2$3_$4:$5:$6.log"

echo "Logfile : $LOGFILE"
exec > $LOGFILE 2>&1

echo "Deplacement des luns de $AXIOM"

# Nom des fichiers contenant la liste des LUN a deplacer vers les storages domain FC
FICLISTELUNSD1="/tools/axiom/liste_${AXIOM}_sd1.txt"
FICLISTELUNSD2="/tools/axiom/liste_${AXIOM}_sd2.txt"

##############
EVENTAFTER=$(date --date="2 days ago" +%F)

NOMLUN=""

function check_migration_running () {
        TESTEDLUN=$1
        date +"%F %T"
        echo "check_migration_running $TESTEDLUN"
        echo "Attente $SLEEPTIME..."
        sleep $SLEEPTIME
        ${LOGIN} ${AXIOM}
        ${AXIOMCLI} event_log -list -details -after ${EVENTAFTER} > /tmp/event_log.txt
        ${AXIOMCLI} logout
        grep -A9 "CM_EVT_BG_COPY_COMPLETED" /tmp/event_log.txt | grep -q $TESTEDLUN
        migr_ended=$?
        return $migr_ended
}

function run_new_migration () {
        FICLISTE=$1
        date +"%F %T"
        echo "run_new_migration $FICLISTE"
                 # recup nom lun suivante
        NOMLUN=$(head -1 ${FICLISTE}.tmp)
        # Nom du SD
        if [[ ${FICLISTE} =~ "_sd1" ]]
        then
                SD="/Bricks_FC_SD1"
        else
                SD="/Bricks_FC_SD2"
        fi
        echo "migration $NOMLUN vers $SD"
        # migrer lun
        ${LOGIN} ${AXIOM}
        ${AXIOMCLI} lun -modify -lun $NOMLUN -storageDomain $SD -storageClass fcHd -copyPriority =auto
        ${AXIOMCLI} logout

        # supprimer nom lun de la liste
        echo "$NOMLUN supprimé de ${FICLISTE}.tmp"
        sed 1d ${FICLISTE}.tmp > ${FICLISTE}.tmp2
        mv ${FICLISTE}.tmp2 ${FICLISTE}.tmp
}

# Creation fichier temporaire liste des LUN a migrer
cat ${FICLISTELUNSD1} > ${FICLISTELUNSD1}.tmp
cat ${FICLISTELUNSD2} > ${FICLISTELUNSD2}.tmp

# Debut du process
run_new_migration ${FICLISTELUNSD1}

# tant que fichier non vide, migration vers SD1
while [[ -s ${FICLISTELUNSD1}.tmp ]]
do
        # verifier que la migration de la lun en cours est terminee
        # si oui lancer une nouvelle migration
        check_migration_running $NOMLUN && run_new_migration ${FICLISTELUNSD1}
done

# Attente avant de lancer la suite des migrations
sleep $SLEEPTIME
sleep $SLEEPTIME

run_new_migration ${FICLISTELUNSD2}
# tant que fichier non vide, migration vers SD2
while [[ -s ${FICLISTELUNSD2}.tmp ]]
do
        # verifier que la migration de la lun en cours est terminee
        # si oui lancer une nouvelle migration
        check_migration_running $NOMLUN && run_new_migration ${FICLISTELUNSD2}
done

D’autres scripts sur « administration en ligne de commande d’une baie Pillar Axiom« 

Générer une geomap

Toujours dans la série »administration en ligne de commande d’une baie Pillar Axiom », ce script génère les geomaps de vos axioms, très utile pour vérifier l’étalement des LUN, ou voir les LUN impactées par un problème technique.

#!/bin/bash

AXIOMCLI="/tools/axiom-cli/axiomcli"

# script de login
LOGIN="/tools/axiom/login_pillar.sh"

DESTDIR="/tmp"

AXIOMLIST="axiom1"

for axiom in $AXIOMLIST
do
    set -- $(date +"%Y %m %d %H %M %S")
    GEOMAPFILE="geomap_${axiom}-$1$2$3_$4$5$6.csv"
    echo "#######################################"
    echo "Creation de la geomap de $axiom dans $DESTDIR"
    cd $(dirname $AXIOMCLI)
    ${LOGIN} $axiom
    $AXIOMCLI storage_allocation -list -details -lun -csv $DESTDIR/$GEOMAPFILE
    $AXIOMCLI logout
done

Création/présentation d’une nouvelle LUN sur Axiom

Dans la série de scripts d’administration en ligne de commande d’une baie Pillar Axiom, celui-ci crée puis présente une nouvelle LUN à un groupe d’hôte.

#!/bin/bash

AXIOMCLI="/tools/axiom-cli/axiomcli"

#########################
LUNNAME="LUN001"
SIZE="550"
SLCU="/SLAMMER-01/1"
QOS="medium"
VG="/VG1"
LUNNUMBER="125"
STORAGECLASS="sataHd"
STORAGEDOM="/default"
HOSTGROUP="/Cluster1"
##########################
echo "#######################################"
echo "Creation de $LUNNAME de $SIZE Go, QoS $QOS, dans le VG $VG sur slammer $SLCU"
cd $(dirname $AXIOMCLI)
$AXIOMCLI lun -add -name $LUNNAME -storageDomain $STORAGEDOM -addressableCapacity $SIZE -allocatedCapacity $SIZE -priority $QOS -redundancy 1 -accessBias mixed -ioBias mixed 
    -slammerNode $SLCU -unmapped -volumeGroup $VG -cloneCapacity 0 
    -fibreChannelAccess -noIscsiAccess -storageClass $STORAGECLASS  -active -copyPriority auto -outputformat text

echo "Mapping de ${VG}/${LUNNAME} sur $HOSTGROUP avec lun num $LUNNUMBER"
$AXIOMCLI hostmap --add --lun ${VG}/${LUNNAME} -lunNumber ${LUNNUMBER} -hostGroup $HOSTGROUP