Назад | Перейти на главную страницу

Как использовать теневую копию тома для создания резервных копий

План состоит в том, чтобы создать теневую копию довольно большого тома с большим объемом операций ввода-вывода. Это 350 ГБ, содержащее полнотекстовый индекс на основе файловой системы, организованный в сотни папок и сотни тысяч крошечных файлов, которые должны быть в согласованном состоянии для успешного восстановления.

В настоящее время индексатор остановлен, выполняется задача резервного копирования, а затем индексатор перезапускается. Это приводит к тому, что во время резервного копирования индекс недоступен в течение нескольких часов. Я хотел бы делать последовательные резервные копии с помощью теневого копирования, в идеале без необходимости останавливать индексатор.

Итак, я включил теневое копирование для этого тома и настроил его на создание снимка каждую ночь для другого тома.

Теперь я немного в недоумении - как мне получить доступ к теневой копии в целом, чтобы я мог сделать резервную копию? Я представляю себе диск, предназначенный только для чтения, который содержит файлы в том виде, в котором они были на момент создания последнего снимка, но, возможно, все работает совершенно иначе.

ОС - Windows Server 2003 SP2, программа резервного копирования - CommVault Galaxy 7.0.


РЕДАКТИРОВАТЬ: Обратите внимание, что тем временем были созданы два ответа, которые реализуют необходимые функции в форме сценария:

Итак, в духе изобретения велосипеда, я представляю вам отличный сценарий Томалака (см. Выше), но полностью переписанный на Powershell!!! Основная причина, по которой я это сделал, заключалась в том, чтобы проповедовать удивительные возможности Powershell, а также потому, что я всем своим существом презираю vbscript.

Это в основном идентичная функция, но я реализовал некоторые вещи немного по-другому по разным причинам. Вывод отладки определенно более подробный.

Важно отметить, что эта версия определяет версию и разрядность ОС и вызывает соответствующую версию vshadow.exe. Я включил диаграмму ниже, чтобы показать, какие версии vshadow.exe использовать, где их взять и как их назвать.


Вот информация об использовании:

VssSnapshot.ps1

Description:
  Create, mount or delete a Volume Shadow Copy Service (VSS) Shadow Copy (snapshot)

Usage:
  VssSnapshot.ps1 Create -Target <Path> -Volume <Volume> [-Debug]
  VssSnapshot.ps1 Delete -Target <Path> [-Debug]

Paremeters:
  Create  - Create a snapshot for the specified volume and mount it at the specified target
  Delete  - Unmount and delete the snapshot mounted at the specified target
  -Target - The path (quoted string) of the snapshot mount point
  -Volume - The volume (drive letter) to snapshot
  -Debug  - Enable debug output (optional)

Examples:
  VssSnapshot.ps1 Create -Target D:\Backup\DriveC -Volume C
  - Create a snapshot of volume C and mount it at "D:\Backup\DriveC"

  VssSnapshot.ps1 Delete -Target D:\Backup\DriveC
  - Unmount and delete a snapshot mounted at "D:\Backup\DriveC"

Advanced:
  VssSnapshot.ps1 create -t "c:\vss mount\c" -v C -d
  - Create a snapshot of volume C and mount it at "C:\Vss Mount\C"
  - example mounts snapshot on source volume (C: --> C:)
  - example uses shortform parameter names
  - example uses quoted paths with whitespace
  - example includes debug output

Вот сценарий:

# VssSnapshot.ps1
# http://serverfault.com/questions/119120/how-to-use-a-volume-shadow-copy-to-make-backups/119592#119592

Param ([String]$Action, [String]$Target, [String]$Volume, [Switch]$Debug)
$ScriptCommandLine = $MyInvocation.Line
$vshadowPath = "."

# Functions
Function Check-Environment {
  Write-Dbg "Checking environment..."

  $UsageMsg = @'
VssSnapshot

Description:
  Create, mount or delete a Volume Shadow Copy Service (VSS) Shadow Copy (snapshot)

Usage:
  VssSnapshot.ps1 Create -Target <Path> -Volume <Volume> [-Debug]
  VssSnapshot.ps1 Delete -Target <Path> [-Debug]

Paremeters:
  Create  - Create a snapshot for the specified volume and mount it at the specified target
  Delete  - Unmount and delete the snapshot mounted at the specified target
  -Target - The path (quoted string) of the snapshot mount point
  -Volume - The volume (drive letter) to snapshot
  -Debug  - Enable debug output (optional)

Examples:
  VssSnapshot.ps1 Create -Target D:\Backup\DriveC -Volume C
  - Create a snapshot of volume C and mount it at "D:\Backup\DriveC"

  VssSnapshot.ps1 Delete -Target D:\Backup\DriveC
  - Unmount and delete a snapshot mounted at "D:\Backup\DriveC"

Advanced:
  VssSnapshot.ps1 create -t "c:\vss mount\c" -v C -d
  - Create a snapshot of volume C and mount it at "C:\Vss Mount\C"
  - example mounts snapshot on source volume (C: --> C:)
  - example uses shortform parameter names
  - example uses quoted paths with whitespace
  - example includes debug output
'@

  If ($Action -eq "Create" -And ($Target -And $Volume)) {
    $Script:Volume = (Get-PSDrive | Where-Object {$_.Name -eq ($Volume).Substring(0,1)}).Root
    If ($Volume -ne "") {
      Write-Dbg "Verified volume: $Volume"
    } Else {
      Write-Dbg "Cannot find the specified volume"
      Exit-Script "Cannot find the specified volume"
    }
    Write-Dbg "Argument check passed"
  } ElseIf ($Action -eq "Delete" -And $Target ) {
    Write-Dbg "Argument check passed"
  } Else {
    Write-Dbg "Invalid arguments: $ScriptCommandLine"
    Exit-Script "Invalid arguments`n`n$UsageMsg"
  }


  $WinVer = ((Get-WmiObject Win32_OperatingSystem).Version).Substring(0,3)
    Switch ($WinVer) {
    "5.2" {
      $vshadowExe = "vshadow_2003"
      $WinBit = ((Get-WmiObject Win32_Processor)[0]).AddressWidth
    }
    "6.0" {
      $vshadowExe = "vshadow_2008"
      $WinBit = (Get-WmiObject Win32_OperatingSystem).OSArchitecture
    }
    "6.1" {
      $vshadowExe = "vshadow_2008R2"
      $WinBit = (Get-WmiObject Win32_OperatingSystem).OSArchitecture
    }
    Default {
      Write-Dbg "Unable to determine OS version"
      Exit-Script "Unable to determine OS version"
    }
  }

  Switch ($WinBit) {
    {($_ -eq "32") -or ($_ -eq "32-bit")} {$vshadowExe += "_x86.exe"}
    {($_ -eq "64") -or ($_ -eq "64-bit")} {$vshadowExe += "_x64.exe"}
    Default {
      Write-Dbg "Unable to determine OS bitness"
      Exit-Script "Unable to determine OS bitness"
    }
  }

  $Script:vshadowExePath = Join-Path $vshadowPath $vshadowExe
  If (Test-Path $vshadowExePath) {
    Write-Dbg "Verified vshadow.exe: $vshadowExePath"
  } Else {
    Write-Dbg "Cannot find vshadow.exe: $vshadowExePath"
    Exit-Script "Cannot find vshadow.exe"
  }

  Write-Dbg "Environment ready"
}

Function Prepare-Target {
  Write-Log "Preparing target..."
  Write-Dbg "Preparing target $Target"


  If (!(Test-Path (Split-Path $Target -Parent))) {
  Write-Dbg "Target parent does not exist"
  Exit-Script "Invalid target $Target"
  }
  If ((Test-Path $Target)) {
    Write-Dbg "Target already exists"
    If (@(Get-ChildItem $Target).Count -eq 0) {
      Write-Dbg "Target is empty"
    } Else {
      Write-Dbg "Target is not empty"
      Exit-Script "Target contains files/folders"
    }
  } Else {
    Write-Dbg "Target does not exist. Prompting user..."
    $PromptYes = New-Object System.Management.Automation.Host.ChoiceDescription "&Yes", "Create target folder"
    $PromptNo = New-Object System.Management.Automation.Host.ChoiceDescription "&No", "Do not create target folder"
    $PromptOptions = [System.Management.Automation.Host.ChoiceDescription[]]($PromptYes, $PromptNo)
    $PromptResult = $Host.UI.PromptForChoice("Create folder", "The target folder `"$target`" does not exist.`nWould you like to create the folder?", $PromptOptions, 0) 
    Switch ($PromptResult) {
      0 {
        Write-Dbg "User Accepted. Creating target..."
        $Null = New-Item -Path (Split-Path $Target -Parent) -Name (Split-Path $Target -Leaf) -ItemType "Directory"
      }
      1 {
        Write-Dbg "User declined. Exiting..."
        Exit-Script "Target does not exist"
      }
    }
  }
  Write-Log "Target ""$Target"" ready"
  Write-Dbg """$Target"" ready"
}

Function Create-Snapshot {
  Write-Log "Creating snapshot..."
  Write-Dbg "Creating snapshot of $Volume"
  $Cmd = "$vshadowExePath -p $Volume"
  $CmdResult = Run-Command $Cmd -AsString

  Write-Dbg "Snapshot created successfully"

  $SnapshotID = $CmdResult -Match 'SNAPSHOT ID = (\{[^}]{36}\})'
  If ($SnapshotID) {
    $SnapshotID = $Matches[1]
    Write-Dbg "SnapshotID: $SnapshotID"
    Write-Log "Snapshot $SnapshotID created"
  } Else {
    Write-Dbg "Unable to determine SnapshotID"
    Exit-Script "Unable to determine SnapshotID"
  }

  Return $SnapshotID
}

Function Mount-Snapshot ($SnapshotID) {
  Write-Log "Mounting snapshot..."
  Write-Dbg "Mounting $SnapshotID at ""$Target"""

  $Cmd = "$vshadowExePath `"-el=$SnapshotId,$Target`"" #Must use escaped quotes because Invoke-Expression gets all weird about curly braces
  $CmdResult = Run-Command $Cmd

  Write-Log "Snapshot $SnapshotID mounted at target ""$Target"""
  Write-Dbg "$SnapshotID mounted at ""$Target"""
}

Function Delete-Snapshot {
  Write-Log "Deleting snapshot..."
  Write-Dbg "Deleting snapshot at target ""$Target"""

  $SnapshotID = Get-SnapshotIdbyTarget

  $Cmd = "$vshadowExePath `"-ds=$SnapshotId`""
  $CmdResult = Run-Command $Cmd

  Write-Log "Snapshot $SnapshotID deleted at target ""$Target"""
  Write-Dbg "$SnapshotID deleted at ""$Target"""
}

Function Get-SnapshotIdbyTarget {
  Write-Dbg "Finding SnapshotID for $Target"

  $Cmd = "$vshadowExePath -q"
  $CmdResult = Run-Command $Cmd -AsString

  $TargetRegEx = '(?i)' + $Target.Replace('\','\\') + '\\?\r'
  $Snapshots = ($CmdResult.Split('*')) -Match $TargetRegEx | Out-String

  If ($Snapshots) {
    $Null = $Snapshots -Match '(\{[^}]{36}\})'
    $SnapshotID = $Matches[0]
  } Else {
    Write-Dbg "Unable to determine SnapshotID for target $Target"
    Exit-Script "Unable to determine SnapshotID"
  }  

  Write-Dbg "SnapshotID: $SnapshotID"

  Return $SnapshotID
}

Function Run-Command ([String]$Cmd, [Switch]$AsString=$False, [Switch]$AsArray=$False) {
  Write-Dbg "Running: $Cmd"

  $CmdOutputArray = Invoke-Expression $Cmd
  $CmdOutputString = $CmdOutputArray | Out-String
  $CmdErrorCode = $LASTEXITCODE

  If ($CmdErrorCode -eq 0 ) {
    Write-Dbg "Command successful. Exit code: $CmdErrorCode"
    Write-Dbg $CmdOutputString
  } Else {
    Write-Dbg "Command failed. Exit code: $CmdErrorCode"
    Write-Dbg $CmdOutputString
    Exit-Script "Command failed. Exit code: $CmdErrorCode"
  }

  If (!($AsString -or $AsArray)) {
    Return $CmdErrorCode
  } ElseIf ($AsString) {
    Return $CmdOutputString
  } ElseIf ($AsArray) {
    Return $CmdOutputArray
  }
}

Function Write-Msg ([String]$Message) {
  If ($Message -ne "") {
    Write-Host $Message
  }
}

Function Write-Log ([String]$Message) {
  Write-Msg "[$(Get-Date -Format G)] $Message"
}

Function Write-Dbg ([String]$Message) {
  If ($Debug) {
    Write-Msg ("-" * 80)
    Write-Msg "[DEBUG] $Message"
    Write-Msg ("-" * 80)
  }
}

Function Exit-Script ([String]$Message) {
  If ($Message -ne "") {
    Write-Msg "`n[FATAL ERROR] $Message`n"
  }
  Exit 1
}

# Main
Write-Log "VssSnapshot started"
Check-Environment

Switch ($Action) {
  "Create" {
    Prepare-Target
    $SnapshotID = Create-Snapshot
    Mount-Snapshot $SnapshotID
  }
  "Delete" {
    Delete-Snapshot
  }
}

Write-Log "VssSnapshot finished"

Вот используемые версии vshadow.exe:

  1. Windows 2003 / 2003R2
    • Пакет SDK службы теневого копирования тома 7.2
    • x86: C: \ Program Files \ Microsoft \ VSSSDK72 \ TestApps \ vshadow \ bin \ release-server \ vshadow.exe
      • Переименовать в: vshadow_2003_x86.exe
    • x64: мне не удалось найти x64-версию vshadow.exe для Windows 2003 x64
  2. Windows 2008
    • Windows SDK для Windows Server 2008 и .NET Framework 3.5
    • x86: C: \ Program Files \ Microsoft SDK \ Windows \ v6.1 \ Bin \ vsstools \ vshadow.exe
      • Переименовать в: vshadow_2008_x86.exe
    • x64: C: \ Program Files \ Microsoft SDK \ Windows \ v6.1 \ Bin \ x64 \ vsstools \ vshadow.exe
      • Переименовать в: vshadow_2008_x64.exe
  3. Windows 2008R2
    • Microsoft Windows SDK для Windows 7 и .NET Framework 4
    • x86: C: \ Program Files (x86) \ Microsoft SDK \ Windows \ v7.0A \ Bin \ vsstools \ vshadow.exe
      • Переименовать в: vshadow_2008R2_x86.exe
    • x64: C: \ Program Files (x86) \ Microsoft SDK \ Windows \ v7.0A \ Bin \ x64 \ vsstools \ vshadow.exe
      • Переименовать в: vshadow_2008R2_x64.exe

Итак ... я работал над небольшим VBScript, который может:

  • делать постоянные снимки VSS
  • смонтируйте их в папку (из которой вы можете затем сделать резервную копию файлов)
  • размонтировать снимки VSS

Он полагается на vshadow.exe (документация), часть Пакет SDK службы теневого копирования тома 7.2 как доступно в Microsoft. Я работаю с этой версией: "VSHADOW.EXE 2.2 - образец клиента теневого копирования тома, Copyright (C) 2005 Microsoft Corporation."

По сути, это небольшая аккуратная обертка вокруг этих четырех команд vshadow:

vshadow.exe -q                - List all shadow copies in the system
vshadow.exe -p {volume list}  - Manages persistent shadow copies
vshadow.exe -el={SnapID},dir  - Expose the shadow copy as a mount point
vshadow.exe -ds={SnapID}      - Deletes this shadow copy

Вот его справочный экран:

VSS Snapshot Create/Mount Tool

Usage:
cscript /nologo VssSnapshot.vbs /target:path { /volume:X | /unmount } [/debug]

/volume  - drive letter of the volume to snapshot
/target  - the path (absolute or relative) to mount the snapshot to
/debug   - swich on debug output

Examples:
cscript /nologo VssSnapshot.vbs /target:C:\Backup\DriveD /volume:D
cscript /nologo VssSnapshot.vbs /target:C:\Backup\DriveD /unmount

Hint: No need to unmount before taking a new snapshot.

Вот пример вывода:

C:\VssSnapshot>cscript /nologo VssSnapshot.vbs /target:MountPoints\E /volume:E
05/03/2010 17:13:04 preparing VSS mount point...
05/03/2010 17:13:04 mount point prepared at: C:\VssSnapshot\MountPoints\E
05/03/2010 17:13:04 creating VSS snapshot for volume: E
05/03/2010 17:13:08 snapshot created with ID: {4ed3a907-c66f-4b20-bda0-9dcda3b667ec}
05/03/2010 17:13:08 VSS snapshot mounted sucessfully
05/03/2010 17:13:08 finished

C:\VssSnapshot>cscript /nologo VssSnapshot.vbs /target:MountPoints\E /unmount
05/03/2010 17:13:35 preparing VSS mount point...
05/03/2010 17:13:36 nothing else to do
05/03/2010 17:13:36 finished

А вот и сам сценарий. Применяется обычный отказ от ответственности: программное обеспечение предоставляется как есть, я не даю никаких гарантий, используйте на свой страх и риск, если что-то выходит из строя, виноват только вы сами. Я протестировал его довольно тщательно, но он отлично работает. Не стесняйтесь сообщать мне о любых ошибках в комментариях ниже.

''# VssSnapshot.vbs
''# http://serverfault.com/questions/119120/how-to-use-a-volume-shadow-copy-to-make-backups/119592#119592
Option Explicit

Dim fso: Set fso = CreateObject("Scripting.FileSystemObject")

''# -- MAIN SCRIPT -------------------------------------------
Dim args, snapshotId, targetPath, success
Set args = WScript.Arguments.Named
CheckEnvironment

Log "preparing VSS mount point..."
targetPath = PrepareVssMountPoint(args("target"))

If args.Exists("unmount") Then
  Log "nothing else to do"
ElseIf targetPath <> vbEmpty Then
  Log "mount point prepared at: " & targetPath
  Log "creating VSS snapshot for volume: " & args("volume")
  snapshotId = CreateVssSnapshot(args("volume"))

  If snapshotId <> vbEmpty Then
    Log "snapshot created with ID: " & snapshotId
    success = MountVssSnapshot(snapshotId, targetPath)
    If success Then
      Log "VSS snapshot mounted sucessfully"
    Else
      Die "failed to mount snapshot"
    End If
  Else
    Die "failed to create snapshot"
  End If
Else
  Die "failed to prepare mount point"
End If

Log "finished"

''# -- FUNCTIONS ---------------------------------------------
Function PrepareVssMountPoint(target) ''# As String
  Dim cmd, result, outArray
  Dim path, snapshot, snapshotId
  Dim re, matches, match

  PrepareVssMountPoint = VbEmpty
  target = fso.GetAbsolutePathName(target)

  If Not fso.FolderExists(fso.GetParentFolderName(target)) Then 
    Die "Invalid mount point: " & target
  End If

  ''# create or unmount (=delete existing snapshot) mountpoint
  If Not fso.FolderExists(target) Then
    If Not args.Exists("unmount") Then fso.CreateFolder target
  Else
    Set re = New RegExp
    re.MultiLine = False
    re.Pattern = "- Exposed locally as: ([^\r\n]*)"

    cmd = "vshadow -q"
    result = RunCommand(cmd, false)
    outarray = Split(result, "*")

    For Each snapshot In outArray
      snapshotId = ParseSnapshotId(snapshot)
      If snapshotId <> vbEmpty Then
        Set matches = re.Execute(snapshot)
        If matches.Count = 1 Then
          path = Trim(matches(0).SubMatches(0))
          If fso.GetAbsolutePathName(path) = target Then
            cmd = "vshadow -ds=" & snapshotId
            RunCommand cmd, true
            Exit For
          End If
        End If
      End If
    Next

    If args.Exists("unmount") Then fso.DeleteFolder target
  End If

  PrepareVssMountPoint = target
End Function

Function CreateVssSnapshot(volume) ''# As String
  Dim cmd, result

  If Not fso.DriveExists(volume) Then
    Die "Drive " & volume & " does not exist."
  End If

  cmd = "vshadow -p " & Replace(UCase(volume), ":", "") & ":"
  result = RunCommand(cmd, false)
  CreateVssSnapshot = ParseSnapshotId(result)
End Function

Function MountVssSnapshot(snapshotId, target) ''# As Boolean
  Dim cmd, result

  If fso.FolderExists(targetPath) Then
    cmd = "vshadow -el=" & snapshotId & "," & targetPath
    result = RunCommand(cmd, true)
  Else
    Die "Mountpoint does not exist: " & target
  End If

  MountVssSnapshot = (result = "0")
End Function

Function ParseSnapshotId(output) ''# As String
  Dim re, matches, match

  Set re = New RegExp
  re.Pattern = "SNAPSHOT ID = (\{[^}]{36}\})"
  Set matches = re.Execute(output)

  If matches.Count = 1 Then
    ParseSnapshotId = matches(0).SubMatches(0)
  Else
    ParseSnapshotId = vbEmpty
  End If
End Function

Function RunCommand(cmd, exitCodeOnly) ''# As String
  Dim shell, process, output

  Dbg "Running: " & cmd

  Set shell = CreateObject("WScript.Shell")

  On Error Resume Next
  Set process = Shell.Exec(cmd)
  If Err.Number <> 0 Then
    Die Hex(Err.Number) & " - " & Err.Description
  End If
  On Error GoTo 0

  Do While process.Status = 0
    WScript.Sleep 100
  Loop
  output = Process.StdOut.ReadAll

  If process.ExitCode = 0 Then 
    Dbg "OK"
    Dbg output
  Else
    Dbg "Failed with ERRORLEVEL " & process.ExitCode
    Dbg output
    If Not process.StdErr.AtEndOfStream Then 
      Dbg process.StdErr.ReadAll
    End If
  End If  

  If exitCodeOnly Then
    Runcommand = process.ExitCode
  Else
    RunCommand = output
  End If
End Function

Sub CheckEnvironment
  Dim argsOk

  If LCase(fso.GetFileName(WScript.FullName)) <> "cscript.exe" Then
    Say "Please execute me on the command line via cscript.exe!"
    Die ""
  End If

  argsOk = args.Exists("target")
  argsOk = argsOk And (args.Exists("volume") Or args.Exists("unmount"))

  If Not argsOk Then
    Say "VSS Snapshot Create/Mount Tool" & vbNewLine & _
        vbNewLine & _
        "Usage: " & vbNewLine & _
        "cscript /nologo " & fso.GetFileName(WScript.ScriptFullName) & _
          " /target:path { /volume:X | /unmount } [/debug]" & _
        vbNewLine & vbNewLine & _
        "/volume  - drive letter of the volume to snapshot" & _
        vbNewLine & _
        "/target  - the path (absolute or relative) to mount the snapshot to" & _
        vbNewLine & _
        "/debug   - swich on debug output" & _
        vbNewLine & vbNewLine & _
        "Examples: " & vbNewLine & _
        "cscript /nologo " & fso.GetFileName(WScript.ScriptFullName) & _
          " /target:C:\Backup\DriveD /volume:D" &  vbNewLine & _
        "cscript /nologo " & fso.GetFileName(WScript.ScriptFullName) & _
          " /target:C:\Backup\DriveD /unmount" & _
        vbNewLine & vbNewLine & _
        "Hint: No need to unmount before taking a new snapshot." & vbNewLine

    Die ""
  End If
End Sub

Sub Say(message)
  If message <> "" Then WScript.Echo message
End Sub

Sub Log(message)
  Say FormatDateTime(Now()) & " " & message
End Sub

Sub Dbg(message)
  If args.Exists("debug") Then 
    Say String(75, "-")
    Say "DEBUG: " & message
  End If
End Sub

Sub Die(message)
  If message <> "" Then Say "FATAL ERROR: " & message
  WScript.Quit 1
End Sub

Надеюсь, это кому-нибудь поможет. Не стесняйтесь использовать его в соответствии с cc-by-sa. Все, о чем я прошу, это оставить нетронутой ссылку, которая ведет сюда.

  1. Используйте команду vssadmin list shadows чтобы перечислить все доступные теневые копии. Вы получите такой результат ...
C:\> vssadmin list shadows
vssadmin 1.1 - Volume Shadow Copy Service administrative command-line tool
(C) Copyright 2001 Microsoft Corp.

Contents of shadow copy set ID: {b6f6fb45-bedd-4b77-8f51-14292ee921f3}
   Contained 1 shadow copies at creation time: 9/25/2016 12:14:23 PM
      Shadow Copy ID: {321930d4-0442-4cc6-b2aa-ec47f21d0eb1}
         Original Volume: (C:)\\?\Volume{ad1dd231-1200-11de-b1df-806e6f6e6963}\
         Shadow Copy Volume: \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy68
         Originating Machine: joshweb.josh.com
         Service Machine: joshweb.josh.com
         Provider: 'Microsoft Software Shadow Copy provider 1.0'
         Type: ClientAccessible
         Attributes: Persistent, Client-accessible, No auto release, No writers, Differential

Contents of shadow copy set ID: {c4fd8646-57b3-4b39-be75-47dc8e7f881d}
   Contained 1 shadow copies at creation time: 8/25/2016 7:00:18 AM
      Shadow Copy ID: {fa5da100-5d90-493c-89b1-5c27874a23c6}
         Original Volume: (E:)\\?\Volume{4ec17949-12b6-11de-8872-00235428b661}\
         Shadow Copy Volume: \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy3
         Originating Machine: joshweb.josh.com
         Service Machine: joshweb.josh.com
         Provider: 'Microsoft Software Shadow Copy provider 1.0'
         Type: ClientAccessible
         Attributes: Persistent, Client-accessible, No auto release, No writers, Differential

C:\
  1. Обратите внимание Shadow Copy Volume имя нужной теневой копии (проще всего в буфер обмена).

  2. Установить теневую копию

В Windows 2003 ...

Вам нужно будет скачать набор инструментов на 2003 год если у вас его еще нет.

Введите команду ...

linkd c:\shadow \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy69\

...где c:\shadow это путь, по которому должна появиться теневая копия, и \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy69 это имя, которое вы скопировали выше. Обратите внимание, что вы должны добавьте обратную косую черту в конце имени теневой копии!

В Windows 2008 и новее ...

Введите команду ...

mklink c:\shadow \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy69\

...где c:\shadow это путь, по которому должна появиться теневая копия, и \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy69 это имя, которое вы скопировали выше. Обратите внимание, что вы должны добавьте обратную косую черту в конце имени теневой копии!

  1. Используйте любой инструмент, который вы хотите (включая проводник Windows или XCOPY) для доступа к файлам из c:\shadow.

Вы неправильно понимаете, как VSS работает с файловой системой (как это работает с базами данных) полностью разные). В файловой системе VSS используется для реализации функции «Предыдущие версии», которая используется исключительно для создания снимков. изменения в файлы и папки в предопределенные моменты времени для восстановления через вкладку «Предыдущие версии» в клиентах. Затем эти изменения объединяются с данными на томе для создания набора для восстановления. Таким образом, это зависит от того, существует ли исходный том, чтобы выполнить восстановление, что, другими словами, бесполезно для целей надлежащего резервного копирования и восстановления.

Я думаю, вам нужно отойти от того, как вы хотите это сделать, и снова подумать о том, что вы хотите делать.

350 ГБ данных - это немного, и я готов поспорить, что процент тех, которые активно используются на повседневной основе, довольно низок. Рассматривали ли вы возможность выполнять разностное резервное копирование каждую ночь с полным резервным копированием только по выходным? Или использовать запланированную репликацию DFS в альтернативное хранилище, чтобы получить «моментальный снимок» (который затем создается резервной копии)?

Надеюсь, это то, что вы хотите:

diskshadow -s vssbackup.cfg

vssbackup.cfg:

set context persistent
set metadata E:\backup\result.cab
set verbose on
begin backup
     add volume C: alias ConfigVolume
     create
     EXPOSE %ConfigVolume% Y:
     # Y is your VSS drive
     # run your backup script here
     delete shadows exposed Y:
end backup

Используя VSS API, можно сделать «снимок» тома. Затем вам нужно будет смонтировать этот снимок, чтобы скопировать его. Я знаком с уже мертвым продуктом, который использовал эту технику для репликации данных, несмотря на то, что файлы открывались исключительно другими процессами в действующей файловой системе. Могут возникнуть правильные вопросы о том, являются ли файлы в моментальном снимке VSS самосогласованными, если они написаны приложениями, которые не интегрированы с API VSS. Могут быть и другие продукты, предлагающие аналогичные возможности.

Краткий ответ: нельзя.

Чуть более длинный ответ: службу теневого копирования можно использовать программно через ее API, чтобы разрешить резервное копирование открытых файлов, но служба не создает полные снимки системы, а только частичные снимки.