Comment utiliser un cliché instantané de volume pour effectuer des sauvegardes

11

Le plan consiste à créer un cliché instantané d'un volume assez important, lourd en E / S. Il fait 350 Go et contient un index de texte intégral basé sur un système de fichiers organisé en centaines de dossiers et en centaines de milliers de petits fichiers qui doivent être dans un état cohérent pour une restauration réussie.

Actuellement, l'indexeur est arrêté, la tâche de sauvegarde s'exécute, puis l'indexeur est redémarré. Il en résulte que l'index n'est pas disponible pendant des heures pendant la sauvegarde. J'aimerais effectuer des sauvegardes cohérentes via un cliché instantané, idéalement sans jamais avoir à arrêter l'indexeur du tout.

J'ai donc activé le cliché instantané pour ce volume et l'ai configuré pour créer un instantané une fois par nuit, sur un volume différent.

Maintenant, je suis un peu perdu - comment puis-je accéder au cliché instantané dans son ensemble, afin de pouvoir faire une sauvegarde? J'imagine un lecteur en lecture seule qui contient les fichiers tels qu'ils étaient au moment du dernier instantané, mais peut-être que les choses fonctionnent complètement différemment.

Le système d'exploitation est Windows Server 2003 SP2, le logiciel de sauvegarde est CommVault Galaxy 7.0.


EDIT : Notez que - dans l'intervalle - deux réponses ont été créées qui implémentent les fonctionnalités nécessaires sous la forme d'un script:

Tomalak
la source
La galaxie commvault n'utilise-t-elle pas déjà VSS pour créer la sauvegarde? Je me souviens vaguement que commvault a été l'un des premiers fournisseurs à implémenter une solution de sauvegarde basée sur VSS
Jim B
@Jim: Oui, mais uniquement pour les fichiers verrouillés fichier par fichier. Ce dont j'ai besoin, c'est de tous les fichiers du lecteur dans un état cohérent. Mais cela ne se produira que si a) l'indexeur ne s'exécute pas ou b) j'ai une copie d'instantané, comme celles que VSS peut faire.
Tomalak
VSS ne fonctionne pas comme ça - c'est un cliché instantané VOLUME. S'il utilise VSS, la seule différence est que, contrairement à votre logiciel de sauvegarde de clichés persistants, il utilise des clichés temporaires. Je suppose qu'une application pourrait prendre des instantanés de suppression par fichier, mais non seulement vos sauvegardes seraient incohérentes, mais le temps de sauvegarde, même une installation par défaut de Windows, serait de l'ordre de plusieurs jours. Voir msdn.microsoft.com/en-us/library/aa384589(VS.85).aspx pour un diagramme du fonctionnement du traitement VSS. Je contacterais commvault et verrais s'ils peuvent s'assurer que votre configuration de sauvegarde est correcte.
Jim B

Réponses:

10

Alors dans un esprit de réinvention de la roue, je vous présente l'excellent scénario de Tomalak (voir ci-dessus) mais entièrement réécrit en Powershell !!! La principale raison pour laquelle j'ai fait cela était d'évangéliser les pouvoirs impressionnants de Powershell, mais aussi parce que je méprise vbscript avec tout mon être.

C'est surtout une fonctionnalité identique, mais j'ai implémenté certaines choses un peu différemment pour diverses raisons. La sortie de débogage est certainement plus détaillée.

Une chose très importante à noter est que cette version détecte la version du système d'exploitation et bitness et appelle la version appropriée de vshadow.exe. J'ai inclus un tableau ci-dessous pour montrer quelles versions de vshadow.exe utiliser, où les obtenir et comment les nommer.


Voici les informations d'utilisation:

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

Voici le script:

# 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"

Voici les versions de vshadow.exe à utiliser:

  1. Windows 2003 / 2003R2
    • SDK 7.2 du service de cliché instantané des volumes
    • x86: C: \ Program Files \ Microsoft \ VSSSDK72 \ TestApps \ vshadow \ bin \ release-server \ vshadow.exe
      • Renommer: vshadow_2003_x86.exe
    • x64: je n'ai pas pu localiser une version x64 de vshadow.exe pour Windows 2003 x64
  2. Windows 2008
    • SDK Windows pour Windows Server 2008 et .NET Framework 3.5
    • x86: C: \ Program Files \ SDK Microsoft \ Windows \ v6.1 \ Bin \ vsstools \ vshadow.exe
      • Renommer: vshadow_2008_x86.exe
    • x64: C: \ Program Files \ SDK Microsoft \ Windows \ v6.1 \ Bin \ x64 \ vsstools \ vshadow.exe
      • Renommer: vshadow_2008_x64.exe
  3. Windows 2008R2
    • SDK Microsoft Windows pour Windows 7 et .NET Framework 4
    • x86: C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v7.0A \ Bin \ vsstools \ vshadow.exe
      • Renommer: vshadow_2008R2_x86.exe
    • x64: C: \ Program Files (x86) \ Microsoft SDKs \ Windows \ v7.0A \ Bin \ x64 \ vsstools \ vshadow.exe
      • Renommer: vshadow_2008R2_x64.exe
John Homer
la source
2
btw ... J'ai pu l'implémenter dans le cadre de notre solution de sauvegarde en utilisant Arcserve comme sauvegarde de fichiers ouverts d'un pauvre. C'est mieux que de payer 800 $ par serveur pour la licence d'agent. Si quelqu'un est intéressé, je posterai ici.
John Homer
+1 C'est assez étonnant. Merci d'avoir pris le temps de porter ceci sur ps (malgré votre haine de VBS) et de le partager ici. J'espère que plus de gens le trouveront utile, car cela mérite certainement plus d'un vote positif.
Tomalak
9

Donc… je travaille sur un petit VBScript qui peut:

  • prendre des instantanés VSS persistants
  • montez-les dans un dossier (à partir duquel vous pouvez ensuite sauvegarder les fichiers)
  • démonter les instantanés VSS

Il s'appuie sur vshadow.exe( documentation ), une partie du SDK 7.2 du service de cliché instantané des volumes disponible auprès de Microsoft. J'ai travaillé avec cette version: " VSHADOW.EXE 2.2 - Exemple de client de cliché instantané de volume, Copyright (C) 2005 Microsoft Corporation. "

Fondamentalement, c'est un petit emballage soigné autour de ces quatre commandes vshadow:

vshadow.exe -q - Liste tous les clichés instantanés du système
vshadow.exe -p {liste de volumes} - Gère les clichés instantanés persistants
vshadow.exe -el = {SnapID}, dir - Exposez le cliché instantané comme point de montage
vshadow.exe -ds = {SnapID} - Supprime ce cliché instantané

Voici son écran d'aide:

Outil de création / montage d'instantanés VSS

Usage:
cscript / nologo VssSnapshot.vbs / target: chemin {/ volume: X | / démonter} [/ debug]

/ volume - lettre de lecteur du volume à l'instantané
/ target - le chemin (absolu ou relatif) vers lequel monter l'instantané
/ debug - swich sur la sortie de débogage

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

Astuce: pas besoin de démonter avant de prendre un nouvel instantané.

Voici quelques exemples de sortie:

C: \ VssSnapshot> cscript / nologo VssSnapshot.vbs / target: MountPoints \ E / volume: E
05/03/2010 17:13:04 préparation du point de montage VSS ...
05/03/2010 17:13:04 point de montage préparé à: C: \ VssSnapshot \ MountPoints \ E
05/03/2010 17:13:04 création d'un instantané VSS pour le volume: E
05/03/2010 17:13:08 instantané créé avec l'ID: {4ed3a907-c66f-4b20-bda0-9dcda3b667ec}
05/03/2010 17:13:08 Instantané VSS monté avec succès
05/03/2010 17:13:08 terminé

C: \ VssSnapshot> cscript / nologo VssSnapshot.vbs / target: MountPoints \ E / unmount
05/03/2010 17:13:35 préparation du point de montage VSS ...
05/03/2010 17:13:36 rien d'autre à faire
05/03/2010 17:13:36 terminé

Et voici le script lui-même. La clause de non-responsabilité habituelle s'applique: Le logiciel est fourni tel quel, je ne donne aucune garantie, utilisez à vos risques et périls, si quelque chose casse le seul à blâmer est vous-même. Cependant, je l'ai testé assez soigneusement et cela fonctionne très bien pour moi. N'hésitez pas à me signaler tout bogue via les commentaires ci-dessous.

''# 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

J'espère que cela aide quelqu'un. N'hésitez pas à l'utiliser conformément à cc-by-sa . Tout ce que je demande, c'est de laisser intact le lien qui pointe ici.

Tomalak
la source
Et avez-vous effectué une reprise après sinistre complète des données de celui-ci sur un nouveau système? Faire une sauvegarde est facile. En restaurer parfois pas tant.
Rob Moir
@Robert: C'est aussi vrai pour cette approche que pour tout autre type de sauvegarde. Je ferai un suivi dès que ce sera par mise en scène.
Tomalak
1
+1 pour ne pas avoir accepté non pour une réponse et avoir poussé à travers pour prouver qu'il existe une solution viable que certaines des autres affiches auraient pu offrir au lieu de répondre que cela ne peut pas être fait.
Chris Magnuson
Cela a-t-il fini par fournir une sauvegarde restaurable? Pourrait-il être utilisé avec Robocopy?
Kev
1
@Kev: Oui, mais vous devez absolument le tester vous-même. Si vous rencontrez un problème, merci de me le signaler ici. Vous pouvez utiliser Robocopy ou tout autre outil que vous préférez, le volume monté se comporte comme un lecteur normal.
Tomalak
6
  1. Utilisez la commande vssadmin list shadowspour répertorier tous les clichés instantanés disponibles. Vous obtiendrez une sortie comme celle-ci ...
Ombres de liste C: \> vssadmin
vssadmin 1.1 - Outil de ligne de commande administrative du service de cliché instantané des volumes
(C) Copyright 2001 Microsoft Corp.

Contenu de l'ID du jeu de clichés instantanés: {b6f6fb45-bedd-4b77-8f51-14292ee921f3}
   Contenu 1 clichés instantanés au moment de la création: 25/09/2016 12:14:23 PM
      ID de cliché instantané: {321930d4-0442-4cc6-b2aa-ec47f21d0eb1}
         Volume d'origine: (C:) \\? \ Volume {ad1dd231-1200-11de-b1df-806e6f6e6963} \
         Volume de cliché instantané: \\? \ GLOBALROOT \ Device \ HarddiskVolumeShadowCopy68
         Machine d'origine: joshweb.josh.com
         Machine de service: joshweb.josh.com
         Fournisseur: «Microsoft Software Shadow Copy provider 1.0»
         Type: ClientAccessible
         Attributs: Persistant, accessible au client, pas de libération automatique, pas d'écrivain, différentiel

Contenu de l'ID du jeu de clichés instantanés: {c4fd8646-57b3-4b39-be75-47dc8e7f881d}
   Contenu 1 clichés instantanés au moment de la création: 25/08/2016 07:00:18
      ID de cliché instantané: {fa5da100-5d90-493c-89b1-5c27874a23c6}
         Volume d'origine: (E:) \\? \ Volume {4ec17949-12b6-11de-8872-00235428b661} \
         Volume de cliché instantané: \\? \ GLOBALROOT \ Device \ HarddiskVolumeShadowCopy3
         Machine d'origine: joshweb.josh.com
         Machine de service: joshweb.josh.com
         Fournisseur: «Microsoft Software Shadow Copy provider 1.0»
         Type: ClientAccessible
         Attributs: Persistant, accessible au client, pas de libération automatique, pas d'écrivain, différentiel

C: \
  1. Notez le Shadow Copy Volumenom du cliché instantané souhaité (le plus simple pour le presse-papiers).

  2. Montez le cliché instantané

Sous Windows 2003 ...

Vous devrez télécharger les outils du kit de ressources pour 2003 si vous ne l'avez pas déjà.

Entrez la commande ...

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

... où c:\shadowest le chemin où vous souhaitez que le cliché instantané apparaisse et \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy69est le nom que vous avez copié ci-dessus. Notez que vous devez ajouter une barre oblique inversée à la fin du nom du cliché instantané!

Sous Windows 2008 et versions ultérieures ...

Entrez la commande ...

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

... où c:\shadowest le chemin où vous souhaitez que le cliché instantané apparaisse et \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy69est le nom que vous avez copié ci-dessus. Notez que vous devez ajouter une barre oblique inversée à la fin du nom du cliché instantané!

  1. Utilisez l'outil de votre choix (y compris l'explorateur Windows ou XCOPY) pour accéder aux fichiers c:\shadow.
Tero Kilkanen
la source
Donc ... pour automatiser cela, vous devez analyser la sortie list shadows?
Kev
J'aime cette réponse, mais cela n'a pas vraiment fonctionné pour moi lors du montage de \\? \ GLOBALROOT \ Device \ HarddiskVolumeShadowCopy_n_ Au lieu de cela, j'ai utilisé le fichier référencé et l'heure de l'instantané du partage racine (C $ par exemple) mklink / DD: \ TempMount \\ localhost \ C $ \ @ GMT-2011.01.01-06.00.08 - malheureusement, il s'agit probablement d'un processus manuel, mais en cas d'urgence, cela fonctionne.
Lewis
2

Vous ne comprenez pas comment VSS fonctionne avec le système de fichiers (comment il fonctionne avec les bases de données est complètement différent). Sur le système de fichiers, VSS est utilisé pour implémenter la fonctionnalité "Versions précédentes", qui est uniquement utilisée pour prendre des clichés des modifications des fichiers et des dossiers à des moments prédéfinis pour la récupération via l'onglet Versions précédentes dans les clients. Ces modifications sont ensuite fusionnées avec les données sur le volume pour la construction de l'ensemble de récupération. Cela dépend donc du volume d'origine qui est toujours là pour effectuer la récupération, ce qui est en d'autres termes inutile aux fins d'une sauvegarde et d'une restauration appropriées.

Je pense que vous devez prendre du recul par rapport à la façon dont vous voulez faire cela et repenser à ce que vous voulez faire.

350 Go de données, ce n'est pas beaucoup, et je suis prêt à parier que le pourcentage de ce qui est activement utilisé au jour le jour est assez faible. Avez-vous envisagé de faire des sauvegardes différentielles nocturnes avec des sauvegardes complètes uniquement le week-end? Ou utiliser la réplication DFS planifiée vers un stockage alternatif afin d'obtenir un "instantané" (qui est ensuite sauvegardé)?

Maximus Minimus
la source
Le nombre de modifications est d'environ 60 Go par jour, en termes de sauvegarde différentielle. Une interruption de service régulière est suffisamment longue pour déranger les utilisateurs de temps en temps, peut-être que les «heures» étaient un peu exagérées. Mon point est - lorsque je sauvegarde l'instantané VSS sur bande, alors j'ai tout ce dont j'ai besoin pour restaurer les données avec succès. Je travaille sur un script qui fait ce dont j'ai besoin actuellement, il semble assez prometteur. Je le posterai ici une fois terminé.
Tomalak
@mh: J'ai publié mon script. Il est devenu un peu plus grand que je ne le pensais, mais il fonctionne bien et est pratique à utiliser. Regarde! :)
Tomalak
1
-1 Vous avez mal interprété la question. Il n'essaie pas d'utiliser VSS comme source d'une sauvegarde, il essaie de l'utiliser pour créer un instantané en lecture seule de ses fichiers qu'il peut ensuite transférer vers un lecteur de bande ou un autre support. Je ne comprends pas pourquoi ce n'est pas un bon cas d'utilisation pour cette technologie?
Chris Magnuson
2

J'espère que c'est ce que vous voulez:

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
jackbean
la source
diskshadow est Windows Server 2008, AFAIK.
Tomalak
@jackbean: J'ai créé un script qui fait quelque chose de similaire pour Windows 2003, car je n'ai jusqu'à présent rien trouvé de convaincant sur Internet. Jetez un oeil à ma réponse.
Tomalak
mes excuses, je sais que c'est pour 2008, mais d'une manière ou d'une autre je l'avais dans ma tête, vous avez 2008 R2.
jackbean
0

En utilisant l'API VSS, il est possible de prendre un "instantané" du volume. Ensuite, vous devez monter cet instantané pour pouvoir le copier. Je connais un produit désormais mort qui utilisait cette technique pour répliquer des données malgré l'ouverture exclusive de fichiers par d'autres processus dans le système de fichiers en direct. Des questions valides peuvent être posées pour savoir si les fichiers de l'instantané VSS sont cohérents s'ils sont écrits par des applications qui ne sont pas intégrées aux API VSS. Il peut y avoir d'autres produits qui offrent des capacités similaires.

Fred
la source
@Fred: C'est ce que j'ai fait, en utilisant un VBScript et un outil de ligne de commande Microsoft. Voir ma réponse.
Tomalak
-1

Réponse courte: vous ne pouvez pas.

Réponse légèrement plus longue: le service de cliché instantané peut être utilisé par programme via son API pour permettre la sauvegarde de fichiers ouverts, mais le service ne crée pas d'instantanés complets du système, seulement des instantanés partiels.

John Gardeniers
la source
2
Je refuse de croire que cela est impossible. Je n'ai pas besoin d'un "instantané complet du système", seulement d'une copie ponctuelle d'un seul volume. Je sais à peu près comment le cliché instantané fonctionne en interne et je sais qu'il peut être utilisé pour effectuer des sauvegardes de fichiers en cours d'utilisation (les exemples les plus importants sur le net sont les bases de données Exchange ou SQL).
Tomalak
1
@John: Il s'avère que je peux. Jetez un oeil à ma réponse!
Tomalak
Je vois que vous utilisez l'API de la même manière que le ferait un logiciel de sauvegarde. Ainsi, pendant que vous utilisez le service VSS, c'est très différent de l'utilisation de Volume Shadow Copy. Néanmoins, s'il fait ce que vous voulez, c'est tout ce qui compte vraiment. Bien joué.
John Gardeniers
1
Vos réponses courtes et longues sont toutes les deux erronées et le terme "Volume Shadow Copy" aurait dû être suffisant pour indiquer ce que l'utilisateur recherchait même si ce terme est légèrement ambigu. en.wikipedia.org/wiki/Shadow_Copy
Chris Magnuson
1
Peut-être que tu as raison. Je ne comprends pas comment votre réponse, "Vous ne pouvez pas" est correcte lorsque le PO a trouvé un moyen de faire ce qu'il a décrit. Votre longue réponse n'est pas pertinente pour la question posée, car même si l'API ne permet que des «instantanés partiels», vous pouvez toujours monter une représentation de l'intégralité du volume à un moment donné et la sauvegarder comme l'OP souhaité. Si vous pouviez clarifier ce que vous voulez dire dans votre message d'origine afin qu'il soit modifié pour répondre à ce que le PO a pu accomplir, je retirerai volontiers le vote négatif et ajouterai une mise à jour si les informations sont pertinentes.
Chris Magnuson