VMware Cloud Community
AndreG79
Contributor
Contributor

mount / mapp eines existierenden VMFS Datastore

Hallo,

ich bin blutiger PowerCLI Anfänger habe da ein Problem.

Ich möchte einen existierenden VMFS Datastore aus einem FlexClone an einen ESXi 5.1 Server mounten um einzelne VMDK´s heraus zu kopieren.

Den CanonicalName der existierenden LUN welche nicht gemountet ist habe ich schon isoliert.

Eine neue Signatur muss meiner Meinung nach nicht zugewiesen werden, da der Datastore von einem anderen Cluster stammt.

Mit "New-Datastore -vmhost $ESXHost -Name TEST -Path $lunid -vmfs" bekomme ich zwar den Datastore dieser wird aber formatiert.

Scipt bis jetzt:

add-pssnapin VMware.VimAutomation.Core
. C:\dbshadow\DatastoreFunctions.ps1

$VIServer        = "Server"
$datacenter      = "Test"
$cluster         = "Cluster-Test"

Connect-VIServer $VIServer

# Get ESX Hosts / DBSHADOW
$ESXHost = Get-Datacenter $datacenter | Get-Cluster $cluster | Get-VM | Where {$_.Name -eq "DBSHADOW"} | Get-VMHost

# HBA Rescan
$ESXHost|Get-VMHostStorage  -RescanAllHba -RescanVmfs

# Ausgabe der DatastoreMountInfo CanonicalName

Get-Datastore -vmhost $ESXHOST | Get-DatastoreMountInfo |select  Lun | Get-Unique -asstring | ft -AutoSize -hideTableHeaders |out-file  -FilePath C:\log\mountinfo.txt

# Ausgabe der gesehenen SCSILUN CanonicalName

Get-ScsiLun -vmhost $ESXhost |Where {$_.LunType -eq "disk"}  |select CanonicalName | Get-Unique -asstring | FT -AutoSize  -hideTableHeaders | out-file -FilePath C:\log\scsilun.txt

# Abgleich CanonicalName gesehen aber nicht mounted

$lunid = Compare-Object (Get-content C:\log\scsilun.txt) (Get-content C:\log\mountinfo.txt) | Select -ExpandProperty InputObject

Wie bekomme ich jetzt am einfachsten die LUN welche ja schon ein VMFS Datastore ist an den ESXi Server verbunden, ohne das der Inhalt verloren geht?

0 Kudos
4 Replies
a_p_
Leadership
Leadership

Willkommmen im Forum,

schu mal ob Dir persistently force mount the datastore weiterhilft.

André

AndreG79
Contributor
Contributor

Hallo André,

den thread habe ich neben vielen anderen zu meinem Problem auch schon gelesen, aber ich blicke da noch nicht durch...

In der "DatastorFunctions.ps1" versteckt sich auch eine Mount Funktion, nur bin ich noch nicht dahinter gekommen wie ich diese nutzen kann.

Wie gesagt, blutiger Anfänger in powershell und powercli, dazu noch nicht mal ein Freund vom scripting...

Es muss doch möglich sein Anhand des VMHost und des CanonicalName der Lun diese zu mounten ohne vorher hunderte Variablen zu füllen.

MFG

André

0 Kudos
AndreG79
Contributor
Contributor

Hallo,

ich habe eine Lösung gefunden.

Quellen:

http://communities.vmware.com/message/1834316

http://www.lucd.info/2011/07/26/the-making-of-a-new-viproperty-called-lunid/

$LunID = "festgelegte Lun ID die beim iGroup mapping auf dem Storage genutzt wurde"

$VMHost|Get-VMHostStorage  -RescanAllHba -RescanVmfs

New-VIProperty -Name lunID -ObjectType ScsiLun -Value {
      param($lun)
    
      [int](Select-String ":L(?<lunID>\d+)$" `
        -InputObject $lun.RuntimeName).Matches[0].Groups['lunID'].Value
    } -Force | Out-Null

$LunIDfind = Get-VMHost -Name $VMHost | Get-ScsiLun | `Select CanonicalName, lunID, RuntimeName | where {$_.lunID -eq "$LunID"}
$scsiCname = $LunIDfind.CanonicalName

#Liste der nicht aufgelösten scsi devices erzeugen
$hostView = get-vmhost -name $VMHost | get-view
$dsView = get-view $hostView.ConfigManager.DatastoreSystem
$unBound = $dsView.QueryUnresolvedVmfsVolumes()

#Schleife durch die nicht aufgelösten scsi devices und neu zu signierende scsi devices bestimmen (CanonicalName)
foreach ($ub in $UnBound) {
$extPaths = @()
$Extents = $ub.Extent;
foreach ($ex in $Extents) {
$extPaths = $extPaths + $ex.DevicePath
}

#Nur nicht aufgelöstes scsi device neu signieren, dessen LunID in Verbindung zum CanonicalName steht
IF ($extPaths -match $scsiCname){
$res = New-Object VMware.Vim.HostUnresolvedVmfsResignatureSpec
$res.ExtentDevicePath = $extPaths
$dsView.ResignatureUnresolvedVmfsVolume($res)
}
}

# VMFS Label von vor Neusignierung auslesen und für weitere bearbeitungen in Variable schreiben
$VmfsLabelFind = $unBound | select VmfsLabel
$VmfsLabel = $VmfsLabelFind.vmfslabel

#Neuen Datastore finden und umbenennen
$NewDatastore = Get-Datastore -VmHost $VMHost | Where{ $_.Name -like "snap-*$VmfsLabel" }
Set-Datastore $NewDatastore -Name "snap-$VmfsLabel"

0 Kudos
LucD
Leadership
Leadership

Glad you have it working Smiley Happy


Blog: lucd.info  Twitter: @LucD22  Co-author PowerCLI Reference

0 Kudos