{"id":1051,"date":"2014-11-28T23:05:58","date_gmt":"2014-11-28T22:05:58","guid":{"rendered":"https:\/\/akim.sissaoui.com\/?p=1051"},"modified":"2015-09-02T15:48:03","modified_gmt":"2015-09-02T13:48:03","slug":"script-suppression-dun-datastore-impossible-dans-vcenter","status":"publish","type":"post","link":"https:\/\/akim.sissaoui.com\/en\/informatique\/script-suppression-dun-datastore-impossible-dans-vcenter\/","title":{"rendered":"SCRIPT: Suppression d&#8217;un datastore impossible dans vCenter"},"content":{"rendered":"<p>Lorsque l&#8217;on essaie de supprimer un datastore dans vCenter, il arrive qu&#8217;il soit impossible de le faire, et le message suivant est retourn\u00e9:<\/p>\n<p><a href=\"https:\/\/akim.sissaoui.com\/wp-content\/uploads\/Cannot-remove-datastore-because-file-system-is-busy-300x196.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/akim.sissaoui.com\/wp-content\/uploads\/Cannot-remove-datastore-because-file-system-is-busy-300x196.png\" alt=\"Cannot-remove-datastore-because-file-system-is-busy-300x196\" width=\"300\" height=\"196\" class=\"aligncenter size-full wp-image-1052\" \/><\/a><\/p>\n<p>Ceci est probablement d\u00fb \u00e0 la pr\u00e9sence d&#8217;un fichier coredump lock\u00e9 sur le datastore. <!--more--><\/p>\n<p>Pour palier \u00e0 ce probl\u00e8me, il faut d\u00e9sactiver le lock en question. Il est n\u00e9cessaire de trouver quel est le host connect\u00e9 au volume qui en est propri\u00e9taire, car la commande de d\u00e9sactivation ne peut se faire que par celui-ci.<\/p>\n<p>On trouve quelques articles sur le net qui expliquent la proc\u00e9dure. J&#8217;ai cr\u00e9\u00e9 un script qui s&#8217;occupe de chaque \u00e9tape. Je l&#8217;utilise depuis la VMA, en tant que vi-admin. Il est \u00e0 not\u00e9 que j&#8217;ai mis en place l&#8217;authentification par cl\u00e9 SSH entre la VMA et les hosts, me permettant ainsi de ne pas avoir \u00e0 entrer de noms d&#8217;utilisateurs et de mots de passe. D&#8217;autre part, j&#8217;utilise un fichier contenant la liste des hosts. Il pourrait \u00eatre malin de faire un fichier par cluster par exemple, permettant alors d&#8217;ex\u00e9cuter le script uniquement pour un cluster donn\u00e9.<\/p>\n<p>Pour d\u00e9crire la proc\u00e9dure, voici donc ce qu&#8217;il va se passer: on va lancer le script avec trois param\u00e8tres:<\/p>\n<ul>\n<li>Le nom ou l&#8217;IP d&#8217;un des hosts connect\u00e9 au datastore en question. A noter qu&#8217;on pourrait aussi tr\u00e8s bien r\u00e9cup\u00e9rer un des hosts contenu dans le fichier listant hosts. J&#8217;y ai pens\u00e9 \u00e0 la fin de la cr\u00e9ation du script, et je n&#8217;ai plus envie de le changer. Libre \u00e0 vous<\/li>\n<li>La UUID du datastore que l&#8217;on n&#8217;arrive pas \u00e0 effacer. Celle-ci est indiqu\u00e9e dans le message d&#8217;erreur. Il suffit donc de la copier<\/li>\n<li>Le chemin du fichier listant les hosts connect\u00e9s au datastore en question<\/li>\n<\/ul>\n<p>Le script va commencer par v\u00e9rifier la validit\u00e9 des param\u00e8tres. Les param\u00e8tres ont-ils \u00e9t\u00e9 indiqu\u00e9s ? Est-ce que le fichier de hosts existe ? Est-ce que le host propos\u00e9 est atteignable, et est-il possible de s&#8217;y connecter en SSH ? <\/p>\n<p>Il va ensuite d\u00e9terminer quel est le nom du fichier lock\u00e9. Celui-ci s&#8217;obtient gr\u00e2ce \u00e0 la commande suivante:<\/p>\n<pre lang=\"bash\">\r\nssh root@$1 esxcli system coredump file list | grep $2 | awk '{print $1;}'\r\n<\/pre>\n<p>&#8230;o\u00f9 $1 est le nom du host propos\u00e9 en premier param\u00e8tre, $2 est l&#8217;UUID du volume VMFS. La commande esxcli va retourn\u00e9 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\u00e9sultat dans la variable file.<\/p>\n<p>Le script v\u00e9rifie si le fichier existe. Le cas \u00e9ch\u00e9ant, il continue son ex\u00e9cution en cherchant quel host en est le propri\u00e9taire. C&#8217;est la commande suivante qui va le retourner:<\/p>\n<pre lang=\"bash\">\r\nssh root@$1 vmkfstools -D $file | grep \"owner\" | awk '{print $6};'\r\n<\/pre>\n<p>Valeur que l&#8217;on va introduire dans la variable owner.<\/p>\n<p>Ici, grep nous retournera uniquement la ligne concernant l&#8217;information d&#8217;ownership, et awk r\u00e9cup\u00e8re le 6\u00e8me champs de la ligne. Celui-ci correspond \u00e0 la UUID du host propri\u00e9taire. Dans ESXi, les 12 derniers caract\u00e8res de la UUID correspondent \u00e0 une des MAC address pr\u00e9sente sur le serveur au moment de l&#8217;installation. La s\u00e9rie de commandes suivante va permettre de r\u00e9cup\u00e9rer ces 12 caract\u00e8res, et de les transformer en MAC address format\u00e9e:<\/p>\n<pre lang=\"bash\">\r\necho $owner | cut -d\"-\" -f4 | sed -e 's\/\\([0-9A-Fa-f]\\{2\\}\\)\/\\1:\/g' -e 's\/\\(.*\\):$\/\\1\/'\r\n<\/pre>\n<p>cut va r\u00e9cup\u00e9rer les 12 caract\u00e8res en question, et sed va les transformer en MAC address format\u00e9e en introduisant des &#8220;:&#8221; tous les deux caract\u00e8res. Le r\u00e9sultat est introduit dans la varible macaddr.<\/p>\n<p>Il est \u00e0 not\u00e9 qu&#8217;\u00e0 partir d&#8217;ici, il est possible que si la carte r\u00e9seau dont la Mac a \u00e9t\u00e9 utilis\u00e9e \u00e0 l&#8217;installation a \u00e9t\u00e9 remplac\u00e9e, il soit impossible au script de d\u00e9terminer le host. Ca il se sert de ces 12 derniers caract\u00e8res.<\/p>\n<p>La commande qui vient ensuite sert donc \u00e0 d\u00e9terminer \u00e0 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\u00e9sente:<\/p>\n<pre lang=\"bash\">\r\nssh root@$host esxcli network nic list | grep -c \"$macaddr\"\r\n<\/pre>\n<p>grep -c retourne la quantit\u00e9 de r\u00e9sultat correspondant. Donc si on trouve la MAC address en question sur un host, le r\u00e9sultat sera 1, sinon il sera de 0. Si c&#8217;est 1, nous sommes donc sur le bon host. Le nom est stock\u00e9 alors dans la variable ownerhost.<\/p>\n<p>A ce stade du script. Le host propri\u00e9taire du lock est donc connu. Il ne reste plus qu&#8217;\u00e0 d\u00e9sactiver le coredump, et l&#8217;effacer. C&#8217;est le travail des commandes suivantes.<\/p>\n<pre lang=\"bash\">\r\nssh root@$ownerhost esxcli system coredump file set -u\r\nssh root@$ownerhost esxcli system coredump file remove -f $file -F\r\n<\/pre>\n<p>Le script v\u00e9rifie ensuite si le fichier a bien \u00e9t\u00e9 effac\u00e9. Le cas \u00e9ch\u00e9ant, tout est en ordre. Sinon, c&#8217;est qu&#8217;il y a eu un probl\u00e8me ou une erreur quelque part&#8230;<\/p>\n<p>Voil\u00e0. N&#8217;h\u00e9sitez pas \u00e0 utiliser, partager, adapter ce script \u00e0 vos besoins, et laissez vos commentaires.<\/p>\n<pre lang=\"bash\">\r\n#!\/bin\/bash\r\n#===============================================================================\r\n#\r\n#          FILE:  remdump\r\n#\r\n#         USAGE:  .\/remdump.sh [param1] \r\n#\r\n#    PARAMETERS:  \r\n#    \t param1:  hostname\r\n#        param2:  vmfs_uuid\r\n#        param3:  host list file. A text file with one FQDN host name per line\r\n#\r\n#   DESCRIPTION:  This scripts allow to delete a dumpfile from a VMFS volume that\r\n#                 you would like to delete\r\n#\t\t  The script uses ssh to access the host with root account.\r\n#\r\n#        AUTHOR:  Akim Sissaoui, superkikim@sissaoui.com\r\n#\r\n#       VERSION:  1.0\r\n#\r\n#       CREATED:  11\/28\/2014 02:00:00 PM CET\r\n#\r\n#      REVISION:  ---\r\n#===============================================================================\r\n\r\n# check for param1\r\nif [ -z \"$1\" ]\r\n  then\r\n    echo -ne '\\n\\e[1;31m'\"Please, provide an ESXi host attached to the required VMFS volume\"'\\e[1;0m\\n\\n'\r\nexit\r\nfi\r\n\r\n# check for param2\r\nif [ -z \"$2\" ]\r\n  then\r\n    echo -ne '\\n\\e[1;31m'\"Please, provide the UUID of the required VMFS volume\"'\\e[1;0m\\n\\n'\r\n    exit\r\nfi\r\n\r\n# check for param3\r\nif [ -z \"$3\" ]\r\n  then\r\n   echo -ne '\\n\\e[1;31m'\"Please, provide full path to the host list file\"'\\e[1;0m\\n\\n'\r\n   exit\r\nelif [ ! -f $3 ]\r\n  then\r\n    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'\r\n    exit\r\nfi\r\n\r\n# check host connetivity\r\n\r\nping -c1 $1 &> \/dev\/null\r\nstatus=$?\r\nif test $status -ne 0 \r\n  then \r\n    echo -ne '\\n\\e[1;31m'\"The host is not reachable\"'\\e[1;0m\\n\\n'\r\n\r\n    exit\r\nfi\r\n  \r\n# check ssh connection to the host\r\nssh root@$1 echo &> \/dev\/null\r\nstatus=$?\r\nif test $status -ne 0\r\n  then\r\n    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'\r\n    exit\r\nfi\r\n\r\n# Get the file path to remove\r\n\r\nclear\r\necho -ne '\\n'\r\necho -ne \"I'm looking for the file to delete.\"'\\n\\n'\r\n\r\nfile=`ssh root@$1 esxcli system coredump file list | grep $2 | awk '{print $1;}'`\r\n\r\n# COnfimm file exists \r\nif ssh root@$1 stat $file \\> \/dev\/null 2\\>\\&1\r\n  then\r\n     echo -ne \"The file to delete is \"'\\e[1;33m'\"$file\"'\\e[1;0m'\". I'm now looking for the host owning the file.\"\r\n  else\r\n     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'\r\n     exit\r\nfi\r\n\r\n# Get dumpfile owner UUID\r\nowner=`ssh root@$1 vmkfstools -D $file | grep \"owner\" | awk '{print $6};'`\r\nif [ -z \"$owner\" ]\r\n  then\r\n    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'\r\n  exit\r\nfi\r\n\r\n# Defining mac address of the owning host\r\n\r\necho -ne \"The owner host UUID is \"'\\e[1;33m'\"$owner\"'\\E[1;0m'\". \"\r\n\r\nmacaddr=`echo $owner | cut -d\"-\" -f4 | sed -e 's\/\\([0-9A-Fa-f]\\{2\\}\\)\/\\1:\/g' -e 's\/\\(.*\\):$\/\\1\/'`\r\necho -ne \"One of the owner's MAC address is \"'\\e[1;33m'\"$macaddr\"'\\e[1;0m'\".\"'\\n\\n'\r\n\r\n# Determining owning host\r\necho -ne \"Let me look up for the hostname now, so we can release the file lock.\"'\\n\\n'\r\nfor host in `cat $3`\r\n  do nicexist=`ssh root@$host esxcli network nic list | grep -c \"$macaddr\"`\r\n  if test $nicexist -ne 0\r\n    then \r\n     ownerhost=$host\r\n  fi\r\ndone\r\necho -ne \"Hey hey ... We're getting there. The owner hostname is \"'\\e[1;33m'\"$ownerhost\"'\\E[1;0m'\".\"'\\n\\n'\r\n\r\n# Setting file as unmanaged and deleting it\r\necho -ne \"Setting the dumpfile as unmanaged on host \"'\\e[1;33m'\"$ownerhost\"'\\e[1;0m'\".\"'\\n\\n'\r\nssh root@$ownerhost esxcli system coredump file set -u\r\necho -ne '\\n'\"I'm now removing the dumpfile\"'\\n\\n'\r\nssh root@$ownerhost esxcli system coredump file remove -f $file -F\r\n\r\nif ssh root@$1 stat $file \\> \/dev\/null 2\\>\\&1\r\n  then\r\n    echo -ne \" The file has not been deleted. This is unexpected. Check your parameters and try again !\"'\\n\\n'\r\n    exit\r\n  else\r\n    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'\r\n    exit\r\nfi\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Lorsque l&#8217;on essaie de supprimer un datastore dans vCenter, il arrive qu&#8217;il soit impossible de le faire, et le message suivant est retourn\u00e9: Ceci est probablement d\u00fb \u00e0 la pr\u00e9sence d&#8217;un fichier coredump lock\u00e9 sur le datastore.<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[220],"tags":[210,208,72],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/akim.sissaoui.com\/en\/wp-json\/wp\/v2\/posts\/1051"}],"collection":[{"href":"https:\/\/akim.sissaoui.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/akim.sissaoui.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/akim.sissaoui.com\/en\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/akim.sissaoui.com\/en\/wp-json\/wp\/v2\/comments?post=1051"}],"version-history":[{"count":3,"href":"https:\/\/akim.sissaoui.com\/en\/wp-json\/wp\/v2\/posts\/1051\/revisions"}],"predecessor-version":[{"id":1097,"href":"https:\/\/akim.sissaoui.com\/en\/wp-json\/wp\/v2\/posts\/1051\/revisions\/1097"}],"wp:attachment":[{"href":"https:\/\/akim.sissaoui.com\/en\/wp-json\/wp\/v2\/media?parent=1051"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/akim.sissaoui.com\/en\/wp-json\/wp\/v2\/categories?post=1051"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/akim.sissaoui.com\/en\/wp-json\/wp\/v2\/tags?post=1051"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}