Lorsque l’on essaie de supprimer un datastore dans vCenter, il arrive qu’il soit impossible de le faire, et le message suivant est retourné:
Ceci est probablement dû à la présence d’un fichier coredump locké sur le datastore.
Pour palier à ce problème, il faut désactiver le lock en question. Il est nécessaire de trouver quel est le host connecté au volume qui en est propriétaire, car la commande de désactivation ne peut se faire que par celui-ci.
On trouve quelques articles sur le net qui expliquent la procédure. J’ai créé un script qui s’occupe de chaque étape. Je l’utilise depuis la VMA, en tant que vi-admin. Il est à noté que j’ai mis en place l’authentification par clé SSH entre la VMA et les hosts, me permettant ainsi de ne pas avoir à entrer de noms d’utilisateurs et de mots de passe. D’autre part, j’utilise un fichier contenant la liste des hosts. Il pourrait être malin de faire un fichier par cluster par exemple, permettant alors d’exécuter le script uniquement pour un cluster donné.
Pour décrire la procédure, voici donc ce qu’il va se passer: on va lancer le script avec trois paramètres:
- Le nom ou l’IP d’un des hosts connecté au datastore en question. A noter qu’on pourrait aussi très bien récupérer un des hosts contenu dans le fichier listant hosts. J’y ai pensé à la fin de la création du script, et je n’ai plus envie de le changer. Libre à vous
- La UUID du datastore que l’on n’arrive pas à effacer. Celle-ci est indiquée dans le message d’erreur. Il suffit donc de la copier
- Le chemin du fichier listant les hosts connectés au datastore en question
Le script va commencer par vérifier la validité des paramètres. Les paramètres ont-ils été indiqués ? Est-ce que le fichier de hosts existe ? Est-ce que le host proposé est atteignable, et est-il possible de s’y connecter en SSH ?
Il va ensuite déterminer quel est le nom du fichier locké. Celui-ci s’obtient grâce à la commande suivante:
ssh root@$1 esxcli system coredump file list | grep $2 | awk '{print $1;}'
…où $1 est le nom du host proposé en premier paramètre, $2 est l’UUID du volume VMFS. La commande esxcli va retourné la liste des coredump existants, grep retournera uniquement la ligne concernant le datastore en question, et awk imprimera le premier champ, qui correspond ici au chemin complet du fichier. On introduit ce résultat dans la variable file.
Le script vérifie si le fichier existe. Le cas échéant, il continue son exécution en cherchant quel host en est le propriétaire. C’est la commande suivante qui va le retourner:
ssh root@$1 vmkfstools -D $file | grep "owner" | awk '{print $6};'
Valeur que l’on va introduire dans la variable owner.
Ici, grep nous retournera uniquement la ligne concernant l’information d’ownership, et awk récupère le 6ème champs de la ligne. Celui-ci correspond à la UUID du host propriétaire. Dans ESXi, les 12 derniers caractères de la UUID correspondent à une des MAC address présente sur le serveur au moment de l’installation. La série de commandes suivante va permettre de récupérer ces 12 caractères, et de les transformer en MAC address formatée:
echo $owner | cut -d"-" -f4 | sed -e 's/\([0-9A-Fa-f]\{2\}\)/\1:/g' -e 's/\(.*\):$/\1/'
cut va récupérer les 12 caractères en question, et sed va les transformer en MAC address formatée en introduisant des “:” tous les deux caractères. Le résultat est introduit dans la varible macaddr.
Il est à noté qu’à partir d’ici, il est possible que si la carte réseau dont la Mac a été utilisée à l’installation a été remplacée, il soit impossible au script de déterminer le host. Ca il se sert de ces 12 derniers caractères.
La commande qui vient ensuite sert donc à déterminer à quel host appartient la MAC address en question. Elle va lister pour chaque host les vnic, et trouver sur quel host la MAC address est présente:
ssh root@$host esxcli network nic list | grep -c "$macaddr"
grep -c retourne la quantité de résultat correspondant. Donc si on trouve la MAC address en question sur un host, le résultat sera 1, sinon il sera de 0. Si c’est 1, nous sommes donc sur le bon host. Le nom est stocké alors dans la variable ownerhost.
A ce stade du script. Le host propriétaire du lock est donc connu. Il ne reste plus qu’à désactiver le coredump, et l’effacer. C’est le travail des commandes suivantes.
ssh root@$ownerhost esxcli system coredump file set -u
ssh root@$ownerhost esxcli system coredump file remove -f $file -F
Le script vérifie ensuite si le fichier a bien été effacé. Le cas échéant, tout est en ordre. Sinon, c’est qu’il y a eu un problème ou une erreur quelque part…
Voilà. N’hésitez pas à utiliser, partager, adapter ce script à vos besoins, et laissez vos commentaires.
#!/bin/bash
#===============================================================================
#
# FILE: remdump
#
# USAGE: ./remdump.sh [param1]
#
# PARAMETERS:
# param1: hostname
# param2: vmfs_uuid
# param3: host list file. A text file with one FQDN host name per line
#
# DESCRIPTION: This scripts allow to delete a dumpfile from a VMFS volume that
# you would like to delete
# The script uses ssh to access the host with root account.
#
# AUTHOR: Akim Sissaoui, superkikim@sissaoui.com
#
# VERSION: 1.0
#
# CREATED: 11/28/2014 02:00:00 PM CET
#
# REVISION: ---
#===============================================================================
# check for param1
if [ -z "$1" ]
then
echo -ne '\n\e[1;31m'"Please, provide an ESXi host attached to the required VMFS volume"'\e[1;0m\n\n'
exit
fi
# check for param2
if [ -z "$2" ]
then
echo -ne '\n\e[1;31m'"Please, provide the UUID of the required VMFS volume"'\e[1;0m\n\n'
exit
fi
# check for param3
if [ -z "$3" ]
then
echo -ne '\n\e[1;31m'"Please, provide full path to the host list file"'\e[1;0m\n\n'
exit
elif [ ! -f $3 ]
then
echo -ne '\n\e[1;31m'"Cannot stat file "'\e[1;33m'"$3"'\e[1;31m'". Please provide the full path to the host list file."'\e[1;0m\n\n'
exit
fi
# check host connetivity
ping -c1 $1 &> /dev/null
status=$?
if test $status -ne 0
then
echo -ne '\n\e[1;31m'"The host is not reachable"'\e[1;0m\n\n'
exit
fi
# check ssh connection to the host
ssh root@$1 echo &> /dev/null
status=$?
if test $status -ne 0
then
echo -ne '\n\e[1;31m'"The ssh connection could not be open. Please check that SSH service is running and ssh port is open on the host"'\e[1;0m\n\n'
exit
fi
# Get the file path to remove
clear
echo -ne '\n'
echo -ne "I'm looking for the file to delete."'\n\n'
file=`ssh root@$1 esxcli system coredump file list | grep $2 | awk '{print $1;}'`
# COnfimm file exists
if ssh root@$1 stat $file \> /dev/null 2\>\&1
then
echo -ne "The file to delete is "'\e[1;33m'"$file"'\e[1;0m'". I'm now looking for the host owning the file."
else
echo -ne '\e[1;31m'"That's unexpected. I couldn't find a locked dumpfile on this VMFS volume. Please, verify you selected a host connected to the VMFS volume with the UUID you provided"'\e[1;0m\n\n'
exit
fi
# Get dumpfile owner UUID
owner=`ssh root@$1 vmkfstools -D $file | grep "owner" | awk '{print $6};'`
if [ -z "$owner" ]
then
echo -ne '\e[1;31m'"That's unexpected. I couldn't find a owner for file "'\e[1;33mfile$\e[1;31m'". Please, verify you selected a host connected to the VMFS volume with the UUID you provided"'\e[1;0m\n\n'
exit
fi
# Defining mac address of the owning host
echo -ne "The owner host UUID is "'\e[1;33m'"$owner"'\E[1;0m'". "
macaddr=`echo $owner | cut -d"-" -f4 | sed -e 's/\([0-9A-Fa-f]\{2\}\)/\1:/g' -e 's/\(.*\):$/\1/'`
echo -ne "One of the owner's MAC address is "'\e[1;33m'"$macaddr"'\e[1;0m'"."'\n\n'
# Determining owning host
echo -ne "Let me look up for the hostname now, so we can release the file lock."'\n\n'
for host in `cat $3`
do nicexist=`ssh root@$host esxcli network nic list | grep -c "$macaddr"`
if test $nicexist -ne 0
then
ownerhost=$host
fi
done
echo -ne "Hey hey ... We're getting there. The owner hostname is "'\e[1;33m'"$ownerhost"'\E[1;0m'"."'\n\n'
# Setting file as unmanaged and deleting it
echo -ne "Setting the dumpfile as unmanaged on host "'\e[1;33m'"$ownerhost"'\e[1;0m'"."'\n\n'
ssh root@$ownerhost esxcli system coredump file set -u
echo -ne '\n'"I'm now removing the dumpfile"'\n\n'
ssh root@$ownerhost esxcli system coredump file remove -f $file -F
if ssh root@$1 stat $file \> /dev/null 2\>\&1
then
echo -ne " The file has not been deleted. This is unexpected. Check your parameters and try again !"'\n\n'
exit
else
echo -ne "The file cannot be found any more. Looks like you're ok now. You can try to unmount and delete the LUN again. Obviously, ensure there's no other critical data of virtual machine on it... "'\n\n'
exit
fi