The specified virtual disk needs repair

Le besoin est simple : migrer quelques VM qui restent sur un vieux VMware Server 2.0.x vers des ESX., avec le passage d’un stockage local à un stockage partagé (une baie EQL).

La manip’ est rodée : on accède au volume local (du vieux VMware Server) via un montage NFS depuis un des ESX, puis on utilise une commande CLI (depuis la vMA) pour déplacer le vmdk de la VM tout en changeant son format…

Et là ce soir, un magnifique « Unable to clone virtual disk : A general system error occurred: The specified virtual disk needs repair ». Sur deux VM…

Google n’aide pas trop sur le coup : plein de threads avec la même erreur, grosso modo dans le même genre de situation mais pas de vraie solution. Un coup de « -a lsilogic » avec les vieux ESX, l’utilisation du store browser pour faire la copie (marche pas dans le cas de la migration depuis un VMware Server), etc. Mais rien pour résoudre mon soucis.

Donc on a ressorti les fondamentaux : le defrag !

Sur le VMware Server :

vmware-vdiskmanager -d mon_fichier.vmdk

Puis, depuis la vMA :

vmkfstools –server IP_de_mon_ESX -i « /vmfs/volumes/vmware-server/ma_VM/mon_fichier.vmdk » « /vmfs/volumes/nouveau_volume/mv_VM/mon_fichier.vmdk » -d thin

Et là, joie et bonheur, cela fonctionne !

Export CSV des comptes

Il existe une commande zmprov pour exporter la liste totale des comptes mais on ne récupère que les adresses email…

Voici un script qui exporte les comptes « complets » : prénom, nom, nom affiché, adresse email.

#!/bin/bash

clear
echo -e « ############################################################################## »
echo -e « # Zimbra getuserCSV.sh ver 0.1 # »
echo -e « ############################################################################## »

# /* Paramètres */
echo «  »
echo -n « Nom de domaine (ex : zimbra.com) :  »
read NOM_DOMAINE
echo -n « Nom du fichier export (ex : /tmp/utilisateurs.csv) :  »
read NOM_FICHIER

rm -f $NOM_FICHIER

touch $NOM_FICHIER

# Vérification version ZCS
VERSION=`su – zimbra -c ‘zmcontrol -v’`;
ZCS_VER= »/tmp/zcsver.txt »

# Récupération password LDAP
ZIMBRA_LDAP_PASSWORD=`su – zimbra -c « zmlocalconfig -s zimbra_ldap_password | cut -d ‘ ‘ -f3″`
LDAP_MASTER_URL=`su – zimbra -c « zmlocalconfig -s ldap_master_url | cut -d ‘ ‘ -f3″`

touch $ZCS_VER
echo $VERSION > $ZCS_VER

echo -e « Récupération utilisateurs »

grep « Release 5. » $ZCS_VER
if [ $? = 0 ]; then
USERS=`su – zimbra -c ‘zmprov gaa’`;
fi

grep « Release 6. » $ZCS_VER
if [ $? = 0 ]; then
USERS=`su – zimbra -c ‘zmprov -l gaa’`;
fi

grep « Release 7. » $ZCS_VER
if [ $? = 0 ]; then
USERS=`su – zimbra -c ‘zmprov -l gaa’`;
fi

echo -e « Traitement utilisateurs »
for ACCOUNT in $USERS; do
NAME=`echo $ACCOUNT`;
DOMAIN=`echo $ACCOUNT | awk -F@ ‘{print $2}’`;
ACCOUNT=`echo $ACCOUNT | awk -F@ ‘{print $1}’`;
ACC=`echo $ACCOUNT | cut -d ‘.’ -f1`

if [ $NOM_DOMAINE == $DOMAIN ] ;
then
OBJECT= »(&(objectClass=zimbraAccount)(mail=$NAME)) »
dn=`/opt/zimbra/bin/ldapsearch -H $LDAP_MASTER_URL -w $ZIMBRA_LDAP_PASSWORD -D uid=zimbra,cn=admins,cn=zimbra -x $OBJECT | grep dn:`
displayName=`/opt/zimbra/bin/ldapsearch -H $LDAP_MASTER_URL -w $ZIMBRA_LDAP_PASSWORD -D uid=zimbra,cn=admins,cn=zimbra -x $OBJECT | grep displayName: | cut -d ‘:’ -f2 | sed ‘s/^ *//g’ | sed ‘s/ *$//g’`
givenName=`/opt/zimbra/bin/ldapsearch -H $LDAP_MASTER_URL -w $ZIMBRA_LDAP_PASSWORD -D uid=zimbra,cn=admins,cn=zimbra -x $OBJECT | grep givenName: | cut -d ‘:’ -f2 | sed ‘s/^ *//g’ | sed ‘s/ *$//g’`
#userPassword=`/opt/zimbra/bin/ldapsearch -H $LDAP_MASTER_URL -w $ZIMBRA_LDAP_PASSWORD -D uid=zimbra,cn=admins,cn=zimbra -x $OBJECT | grep userPassword: | cut -d ‘:’ -f3 | sed ‘s/^ *//g’ | sed ‘s/ *$//g’`
cn=`/opt/zimbra/bin/ldapsearch -H $LDAP_MASTER_URL -w $ZIMBRA_LDAP_PASSWORD -D uid=zimbra,cn=admins,cn=zimbra -x $OBJECT | grep cn: | cut -d ‘:’ -f2 | sed ‘s/^ *//g’ | sed ‘s/ *$//g’`
#initials=`/opt/zimbra/bin/ldapsearch -H $LDAP_MASTER_URL -w $ZIMBRA_LDAP_PASSWORD -D uid=zimbra,cn=admins,cn=zimbra -x $OBJECT | grep initials: | cut -d ‘:’ -f2 | sed ‘s/^ *//g’ | sed ‘s/ *$//g’`
sn=`/opt/zimbra/bin/ldapsearch -H $LDAP_MASTER_URL -w $ZIMBRA_LDAP_PASSWORD -D uid=zimbra,cn=admins,cn=zimbra -x $OBJECT | grep sn: | cut -d ‘:’ -f2 | sed ‘s/^ *//g’ | sed ‘s/ *$//g’`

if [ $ACC == "admin" ] || [ $ACC == "wiki" ] || [ $ACC == "galsync" ] || [ $ACC == "ham" ] || [ $ACC == "spam" ]; then
echo « Utilisateur système non traité : $NAME »
else
echo « $NAME;’$displayName’;'$givenName’;'$sn’ » >> $NOM_FICHIER
fi
else
echo « Utilisateur $NAME non traité »
fi

done

echo -e « Tous les comptes ont été exportés dans $NOM_FICHIER… »

Pneumatique ou électrique ?

Tout le monde se souvient de la video Shouting in datacentre.

Des études sérieuses ont été menées sur l’impact des alarmes incendies (on parle des sirènes, pas du gaz) sur la vie des disques en datacentre…

Ca fait encore un truc de plus à vérifier lors des visites.

Ca cause de (gros) datacentres

Ca ne s’adresse pas vraiment à nous mais ça permet d’apprendre plein de choses…
James Hamilton’s blog

Ces gros opérateurs de clouds sont définitivement les premiers à utiliser du « commodity hardware ».

Storage is cheap

A partir du moment où on choisit sa solution de stockage en fonction de ses besoins, storage is cheap.
Le SAN/NAS hardware n’est pas la solution ultime qui répond à toutes les problématiques, des alternatives sont possibles…

Quelques liens, en vrac, sur le sujet :
http://www.techrepublic.com/blog/datacenter/calculate-iops-in-a-storage-array/2182
http://constantin.glez.de/blog/2010/06/closer-look-zfs-vdevs-and-performance
http://blog.laspina.ca/ubiquitous/running-zfs-over-iscsi-as-a-vmware-vmfs-store (merci Tof)
http://www.seanodes.com/ (que nous distribuons)
http://www.nexentastor.org/
http://www.open-e.com/ (que nous distribuons aussi)
http://www.nimblestorage.com/
http://www.openfiler.com/
http://www.freenas.org/ (avec une version 8 qui support le ZFS et qui fonctionne TRES bien)

Dernière modification le 01/07/2011

Fixing email

Pour la réunion de la communauté francophone Zimbra, j’ai fait une présentation sur ce sujet.
Basée sur le white paper de Scott qui est à l’origine de ZCS.

Il est téléchargeable ici, entre autre : Top ten ways to fix email

Changement de DNS

Je passerai sur le « chez nous, on sait faire »… Un peu trop facile.

Pierre a fait un bon article, donc je lie simplement : Pourquoi « Le Monde » a-t-il brutalement disparu d’Internet vendredi matin ?

Total quota par domaine

C’est pas moi qui l’ai écrit…

Etape initiale, installer php-cli sur votre serveur ZCS et coller le script PHP (appellons le quota.php) à un endroit où il est exécutable par le user zimbra.

Le code :


$dd)
{
ksort($dd['users']);
echo ‘- ‘.$d. »n »;
foreach($dd['users'] as $uid => $n)
{
echo ‘ . ‘.$uid.’: ‘.sprintf(‘%.2f’,round($n/1073741824,2)). »GBn »;
}
echo ‘ Total: ‘.sprintf(‘%6.2f’,round($dd['total']/1073741824,2)).’GB’. »n »;
echo « n »;
}

?>

Il ne reste qu’à lancer le script :

su – zimbra
php quota.php

LDAP callout et Zimbra

On a vu il y a longtemps qu’on pouvait utiliser le SMTP callout avec Zimbra.

Si votre relais ne gère pas le SMTP callout (c’est le cas de postfix), il gère peut-être le LDAP callout.
A chaque fois qu’un mail arrive, le relais fait une requête LDAP auprès du serveur Zimbra pour vérifier si le destinataire existe ou pas.

Facile et efficace mais attention, cela peut devenir très gourmand niveau LDAP sur le serveur ZCS…

Pour mettre en place un LDAP callout sur un postfix, c’est assez simple.
Il suffit, côté postfix, j’ajouter une ligne dans le fichier main.cf :

relay_recipient_maps = ldap:/etc/postfix/ldap_zcs.cf

Cette ligne indique à postfix que pour savoir quels sont les destinataires autorisés, il faut effectuer la requête LDAP définie dans le fichier ldap_zcs.cf.

On va ensuite créer ce fichier :

server_host = ldap://zcs.domain.tld:389
server_port = 389
search_base =
query_filter = (&(|(zimbraMailDeliveryAddress=%s)(zimbraMailAlias=%s(zimbraMailCatchAllAddress=%s))(zimbraMailStatus=enabled))
result_attribute = zimbraMailDeliveryAddress,zimbraMailAlias
version = 3
ldap_cache = yes
ldap_cache_expiry = 600
ldap_cache_size = 64256
bind = no
timeout = 30

Bien entendu, il faut remplacer « zcs.domain.tld » par le nom de votre serveur ZCS (tel qu’il est accessible depuis votre relais).

Si votre relais est en DMZ, il faudra bien entendu ouvrir le port LDAP au niveau du firewall vers le serveur ZCS.

Lorsque votre ZCS est offline (pendant une upgrade), je vous conseille fortement de mettre commenter la ligne définissant le LDAP callout dans postfix afin que celui-ci accepte tous les mails (même ceux pour des destinataires inexistants) et les spoole en attendant que le ZCS repasse online (et de décommenter la ligne).
Si vous ne le faites pas, les mails seront refusés car le serveur LDAP ne répondra pas (avec, en plus, un timeout de 30 secondes à chaque connexion SMTP).

Ce billet n’est pas destiné à vous donner la configuration complète « clefs en main » d’un postfix en relais « devant » un ZCS, uniquement les informations concernant le LDAP callout. Ainsi, il ne faudra pas oublier le reste de la configuration postfix (relay_domains, transport, networks, etc) et ne pas oublier non plus de faire ce qu’il faut pour que le relai puisse attaquer le ZCS en LDAP…
La requête LDAP est honteusement pompée d’un thread sur le forum US Zimbra.

Modifier la règle de filtrage automatique du spam

Ca se passe dans l’interface d’admin, en allant dans « Global Settings » puis l’onglet « AS/AV » : il s’agit du paramètre « Tag ».

100% correspondent à 20.
Par défaut, il y a 33%, ce qui correspond à la valeur 6.6 pour « required » dans le champ « X-Spam-Status » des headers d’un mail.
Si ce paramètre est passé à 20%, tous les mails avec une note supérieure à 5 seront classés dans le dossier « Spams ».

Il faut relancer ZCS après avoir modifié la valeur et il ne faut pas trop la baisser pour limiter les « faux positifs ».