#Requires -Version 5.1 <# JbTecWiz Support Centre -- generated fix script Fault : iSCSI targets disconnect, or disks appear offline after a reboot Fix : Set the SAN policy and make the connection persistent Source: https://jbtecwiz.com/support/srv-sto-iscsi Run as : Elevated PowerShell Expect : 25 minutes Risk : medium Reversible : yes WHEN THIS IS THE RIGHT FIX Disks come back offline after a reboot. HOW TO UNDO IT Set-StorageSetting -NewDiskPolicy OfflineShared restores the default. This script walks the fix one step at a time and asks before each one. Steps with no command are things you do yourself -- it prints those and waits. Run with -DryRun to print without executing. -------------------------------------------------------------------- NO WARRANTY - USE AT YOUR OWN RISK This script is provided by JbTecWiz as-is and with no warranty of any kind, express or implied. You run it entirely at your own risk. JbTecWiz accepts no liability for any loss or damage arising from its use, including but not limited to data loss, downtime, or configuration changes that turn out to be wrong for your system. You are responsible for reading this script before running it, for satisfying yourself that it suits the machine in front of you, and for having a working backup first. Some steps cannot be undone. -------------------------------------------------------------------- #> [CmdletBinding()] param( # Print every step and command without running anything. [switch]$DryRun, # Do not ask before each step. Read the script first if you use this. [switch]$Unattended ) $ErrorActionPreference = 'Stop' $script:Failed = 0 function Write-Rule { param([string]$Text) Write-Host '' Write-Host ('-' * 70) -ForegroundColor DarkGray if ($Text) { Write-Host $Text -ForegroundColor Cyan } } function Show-Prose { param([string]$Text, [string]$Colour = "Gray") if (-not $Text) { return } $words = $Text -split "\s+"; $line = " " foreach ($w in $words) { if (($line.Length + $w.Length) -gt 74) { Write-Host $line -ForegroundColor $Colour; $line = " " } $line += "$w " } if ($line.Trim()) { Write-Host $line -ForegroundColor $Colour } } function Invoke-Step { param( [int]$Number, [string]$Do, [string]$Why, [scriptblock]$Command, [switch]$Manual, [string]$Shell = "powershell" ) Write-Rule " Step $Number of 6" Show-Prose $Do "White" if ($Why) { Write-Host ""; Show-Prose $Why "DarkGray" } if ($Manual) { Write-Host '' Write-Host ' -> Do this yourself, then press Enter to carry on.' -ForegroundColor Yellow if (-not $Unattended -and -not $DryRun) { [void](Read-Host) } return } Write-Host '' foreach ($l in ($Command.ToString().Trim() -split "`n")) { Write-Host (" " + $l.Trim()) -ForegroundColor Green } Write-Host '' if ($DryRun) { Write-Host " (dry run -- not executed)" -ForegroundColor DarkGray; return } if (-not $Unattended) { $a = Read-Host " Run this step? [Y]es / [S]kip / [Q]uit" if ($a -match "^[Qq]") { Write-Host " Stopped at your request."; exit 0 } if ($a -match "^[Ss]") { Write-Host " Skipped." -ForegroundColor DarkGray; return } } try { & $Command } catch { $script:Failed++ Write-Host (" Step $Number failed: " + $_.Exception.Message) -ForegroundColor Red Show-Prose "The rest of the fix may depend on this. Read the write-up before carrying on." "Red" if (-not $Unattended) { $c = Read-Host " Carry on anyway? [y/N]" if ($c -notmatch "^[Yy]") { exit 1 } } } } Write-Rule Write-Host ' iSCSI targets disconnect, or disks appear offline after a reboot' -ForegroundColor White Write-Host ' Set the SAN policy and make the connection persistent' -ForegroundColor Cyan Write-Host '' Write-Host ' Risk: medium Reversible 25 minutes' Write-Host '' Show-Prose 'No warranty. Use at your own risk - JbTecWiz accepts no liability. Read it before you run it, and have a backup.' 'DarkYellow' Write-Rule if (-not $Unattended -and -not $DryRun) { $go = Read-Host ' Ready? [y/N]' if ($go -notmatch "^[Yy]") { Write-Host " Nothing was changed."; exit 0 } } Invoke-Step -Number 1 -Do 'Check the current SAN policy. On Server it defaults to Offline Shared, which is why every new disk arrives offline.' -Why 'This is by design and protects clustered storage from being mounted by two nodes at once. On a standalone server with dedicated LUNs it is simply an obstacle, and it is the cause of almost every "my iSCSI disks are offline again" report.' -Command { Get-StorageSetting | Format-List NewDiskPolicy } Invoke-Step -Number 2 -Do 'On a standalone server with dedicated LUNs, change it.' -Command { Set-StorageSetting -NewDiskPolicy OnlineAll } Invoke-Step -Number 3 -Do 'On a cluster node, leave the policy alone -- the cluster service brings disks online. Changing it there causes corruption.' -Manual Invoke-Step -Number 4 -Do 'Bring the disks online and clear the read-only flag.' -Command { Get-Disk | Where-Object OperationalStatus -eq 'Offline' | Set-Disk -IsOffline $false Get-Disk | Where-Object IsReadOnly -eq $true | Set-Disk -IsReadOnly $false } Invoke-Step -Number 5 -Do 'Make the iSCSI connection persistent so it re-establishes at boot.' -Command { Get-IscsiTarget | Connect-IscsiTarget -IsPersistent $true -IsMultipathEnabled $true Get-IscsiSession | Format-Table TargetNodeAddress,IsPersistent,IsConnected } Invoke-Step -Number 6 -Do 'Set the volumes to mount by GUID or a persistent letter so drive letters do not move.' -Command { mountvol } Write-Rule " Confirm it worked" Show-Prose 'After a reboot the disks come back online with the same letters.' 'White' Write-Host '' if (-not $DryRun) { Get-Disk | Format-Table Number,FriendlyName,OperationalStatus,IsOffline,BusType Get-Volume | Format-Table DriveLetter,FileSystemLabel,HealthStatus } Write-Rule if ($script:Failed -gt 0) { Write-Host (" Finished with " + $script:Failed + " failed step(s).") -ForegroundColor Yellow Show-Prose 'Read the full write-up at https://jbtecwiz.com/support/srv-sto-iscsi' 'Yellow' } else { Write-Host ' Finished.' -ForegroundColor Green } Write-Host '' Show-Prose 'To undo: Set-StorageSetting -NewDiskPolicy OfflineShared restores the default.' 'DarkGray' Write-Rule