web-dev-qa-db-ja.com

ボリュームシャドウコピーを使用してバックアップを作成する方法

計画は、非常に大きく、I/Oが多いボリュームのシャドウコピーを作成することです。容量は350GBで、ファイルシステムベースのフルテキストインデックスが含まれ、数百のフォルダと数千の小さなファイルで構成されています。

現在、インデクサーは停止しており、バックアップタスクが実行されてから、インデクサーが再起動されます。これにより、バックアップ中にインデックスが数時間利用できなくなります。理想的にはインデクサーをまったく停止することなく、シャドウコピーを介して一貫したバックアップを作成したいと考えています。

そこで、そのボリュームのシャドウコピーをオンにし、毎晩1回、別のボリュームにスナップショットを作成するように構成しました。

今、私は少し困っています-バックアップを作成できるように、シャドウコピー全体にアクセスするにはどうすればよいですか?最後のスナップショットの時点のファイルが含まれている読み取り専用ドライブを想定していますが、動作がまったく異なる場合があります。

OSはWindows Server 2003 SP2、バックアップソフトウェアはCommVault Galaxy 7.0です。


[〜#〜] edit [〜#〜]:-それまでの間、必要な機能を次の形式で実装する2つの回答が作成されています。スクリプト:

11
Tomalak

だから…私はできるVBScriptに取り組んでいます。

  • 永続的なVSSスナップショットを取得する
  • それらをフォルダーにマウントします(そこからファイルをバックアップできます)
  • vSSスナップショットのマウント解除

Microsoftから提供されている Volume Shadow Copy Service SDK 7.2 の一部であるvshadow.exedocumentation )に依存しています。私はこのバージョンで作業してきました:「VSHADOW.EXE 2.2-ボリュームシャドウコピーサンプルクライアント、Copyright(C)2005 Microsoft Corporation。

基本的に、これは次の4つのvshadowコマンドの端正な小さなラッパーです。

 vshadow.exe -q-システム内のすべてのシャドウコピーを一覧表示します
 vshadow.exe -p {ボリュームリスト}-永続的なシャドウコピーを管理します
 vshadow.exe -el = {SnapID }、dir-シャドウコピーをマウントポイントとして公開します
 vshadow.exe -ds = {SnapID}-このシャドウコピーを削除します

ここにそのヘルプ画面があります:

 VSSスナップショット作成/マウントツール
 
使用量:
 cscript/nologo VssSnapshot.vbs/target:path {/ volume:X |/unmount} [/debug]

/volume-スナップショットへのボリュームのドライブ文字
/target-スナップショットをマウントするパス(絶対または相対)
/debug-デバッグ出力を切り替えます
 
例:
 cscript/nologo VssSnapshot.vbs/target:C:\ Backup\DriveD /volume:D
 cscript/nologo VssSnapshot.vbs/target:C:\ Backup\DriveD /unmount

ヒント:新しいスナップショットを作成する前にマウントを解除する必要はありません。

ここにいくつかのサンプル出力:

 C:\ VssSnapshot> cscript/nologo VssSnapshot.vbs/target:MountPoints\E /volume:E
05/03/2010 17:13:04 VSSマウントポイントを準備しています... 
 05/03/2010 17:13:04マウントポイントがC:\ VssSnapshot\MountPoints\E 
 05/03/2010 17:13:04に作成されました:ボリュームのVSSスナップショットを作成:E 
 05/03/2010 17:13:08 IDで作成されたスナップショット:{4ed3a907-c66f-4b20-bda0-9dcda3b667ec} 
 05/03/2010 17:13:08 VSSスナップショットが正常にマウントされました。 ____。] 05/03/2010 17:13:08終了
 
 C:\ VssSnapshot> cscript/nologo VssSnapshot.vbs/target:MountPoints\E /unmount
05/ 03/2010 17:13:35 VSSマウントポイントを準備しています... 
 05/03/2010 17:13:36他に何もしません
 2010/03/05 17:13:36終了しました

そして、これがスクリプト自体です。通常の免責事項が適用されます。ソフトウェアは現状のまま提供されます。保証はありません。責任を負うものが自分にある場合、責任は負いません。私はそれをかなり徹底的にテストしました、そしてそれは私にとってはうまくいきます。以下のコメントを介して私にバグを知らせてください。

''# 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 に従って自由に使用してください。私が尋ねるのは、ここに戻るリンクをそのままにしておくことだけです。

9
Tomalak

ホイールを再発明するという精神で、トマラックの優れたスクリプト(上記を参照)をお見せしますが、完全に書き直したPowershell !!!私がこれを行った主な理由は、Powershellの素晴らしい力を伝道することでしたが、vbscriptを自分の存在全体で軽蔑したためでもありました。

機能はまったく同じですが、さまざまな理由により、実装方法が少し異なります。デバッグ出力は間違いなくもっと冗長です。

このバージョンではOSのバージョンとビット数が検出され、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:Windows 2003 x64用のvshadow.exeのx64バージョンを見つけることができませんでした
  2. Windows 2008
    • Windows Server 2008および.NET Framework 3.5用のWindows SDK
    • x86:C:\ Program Files\Microsoft SDKs\Windows\v6.1\Bin\vsstools\vshadow.exe
      • 名前を変更:vshadow_2008_x86.exe
    • x64:C:\ Program Files\Microsoft SDKs\Windows\v6.1\Bin\x64\vsstools\vshadow.exe
      • 名前を変更:vshadow_2008_x64.exe
  3. Windows 2008R2
    • Microsoft Windows SDK for Windows 7および.NET Framework 4
    • x86:C:\ Program Files(x86)\ Microsoft SDKs\Windows\v7.0A\Bin\vsstools\vshadow.exe
      • 名前を変更:vshadow_2008R2_x86.exe
    • x64:C:\ Program Files(x86)\ Microsoft SDKs\Windows\v7.0A\Bin\x64\vsstools\vshadow.exe
      • 名前を変更:vshadow_2008R2_x64.exe
10
John Homer
  1. コマンドvssadmin list shadowsを使用して、使用可能なすべてのシャドウコピーを一覧表示します。次のような出力が得られます...
 C:\> vssadminリストシャドウ
 vssadmin 1.1-ボリュームシャドウコピーサービス管理コマンドラインツール
(C)Copyright 2001 Microsoft Corp。
 
シャドウコピーセットIDの内容:{b6f6fb45-bedd-4b77-8f51-14292ee921f3} 
作成時に1つのシャドウコピーが含まれていました:2016年9月25日12:14:23 PM 
シャドウコピーID:{321930d4-0442-4cc6-b2aa-ec47f21d0eb1} 
元のボリューム:(C:)\\?\ Volume {ad1dd231-1200-11de-b1df-806e6f6e6963}\
シャドウコピーボリューム:\\?\ GLOBALROOT\Device\HarddiskVolumeShadowCopy68 
発信元マシン:joshweb.josh.com 
サービスマシン:joshweb.josh.com 
プロバイダー: 'Microsoftソフトウェアシャドウコピープロバイダー1.0 '
タイプ:ClientAccessible 
属性:永続的、クライアントアクセス可能、自動解放なし、ライターなし、差分
 
シャドウコピーセットIDの内容:{c4fd8646 -57b3-4b39-be75-47dc8e7f881d} 
含まれるシャドウコピーは1つt作成時間:8/25/2016 7:00:18 AM 
シャドウコピーID:{fa5da100-5d90-493c-89b1-5c27874a23c6} 
元のボリューム:(E:)\\?\Volume {4ec17949-12b6-11de-8872-00235428b661}\
シャドウコピーボリューム:\\?\ GLOBALROOT\Device\HarddiskVolumeShadowCopy3 
元のマシン:joshweb.josh.com 
サービスマシン:joshweb.josh.com 
プロバイダー: 'Microsoft Software Shadow Copy provider 1.0' 
タイプ:ClientAccessible 
属性:永続的、クライアントアクセス可能、自動リリースなし、ライターなし、微分
 
 C:\ 
  1. 目的のシャドウコピーのShadow Copy Volume名をメモします(クリップボードに最も簡単です)。

  2. シャドウコピーをマウントする

Windows 2003の場合...

2003のリソースキットツール をまだダウンロードしていない場合は、ダウンロードする必要があります。

コマンドを入力...

リンクされた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 ExplorerまたはXCOPYを含む)を使用して、c:\shadowからファイルにアクセスします。
6
Will V

これがあなたが望むものであることを願っています:

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
2
jackbean

VSSがファイルシステムでどのように機能するかを誤解しています(データベースでの機能は完全に異なります)。ファイルシステムでは、VSSを使用して「以前のバージョン」機能を実装します。これは、クライアントの[以前のバージョン]タブを使用してリカバリするために、事前定義された時点でファイルとフォルダのスナップショットchangesにのみ使用されます。これらの変更は、リカバリセットを構築するためのボリューム上のデータとマージされます。そのため、リカバリを実行するために元のボリュームがまだ残っているかどうかに依存します。つまり、適切なバックアップと復元には役に立たないのです。

私はあなたがこれをどのようにしたいかから一歩離れて、それがあなたが何をしたいのかについてもう一度考える必要があると思います。

350 GBのデータはそれほど多くはありませんが、日々アクティブに使用されているデータの割合は非常に低いと思います。週末のみフルバックアップを行う夜間差分バックアップを行うことを検討しましたか?または、「スナップショット」を取得するために代替ストレージへのスケジュールされたDFSレプリケーションを使用します(その後、バックアップされます)?

2
Maximus Minimus

VSS APIを使用して、ボリュームの「スナップショット」を取得することが可能です。次に、そのスナップショットからコピーするために、そのスナップショットをマウントする必要があります。ライブファイルシステム内の他のプロセスによってファイルが排他的に開かれているにもかかわらず、この手法を使用してデータを複製する死んだ製品に精通しています。 VSS APIと統合されていないアプリによってファイルが書き込まれている場合、VSSスナップショット内のファイルに一貫性があるかどうかについて、有効な質問をすることができます。同様の機能を提供する他の製品があるかもしれません。

0
Fred