VSS卷影复制服务编程学习心得.doc_第1页
VSS卷影复制服务编程学习心得.doc_第2页
VSS卷影复制服务编程学习心得.doc_第3页
VSS卷影复制服务编程学习心得.doc_第4页
VSS卷影复制服务编程学习心得.doc_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

VSS学习记录- fan1前言22定义23备份概述54限制75原理76误区117使用VSS118小结201 前言1.1 参考1.1.1 MSDN上Volume Shadow Copy Service/en-us/library/aa384649.aspx1.1.2 信息存储/magazine/2006-02-06/0000926218.shtml1.1.3 中国网管联盟/stor/backup/200608/56701.html1.1.42 误区2.1 VSS并不能实现应用程序写数据和备份任务同时进行,也不可能同时进行。如果它有数据更新操作,有一小段时间应用程序是必须会被打断的,为了确保数据的完整性。2.2 VSS的备份任务并不是从实际的卷拷贝,而是先建立卷影拷贝,备份任务再从卷影备份(bacula是这样的,先建立卷影,备份完毕后删除卷影)。2.3 制作卷影的时候并不是对所有卷、文件和目录执行的操作都一样,不同的卷影拷贝执行机制可能使用不同的途径(不同的provider)来实现卷影拷贝。不过所有的应用程序(requester)都使用统一的VSS API来操作卷影,所有的卷影都在同一时刻完成。2.4 VSS和盘阵的快照很不同,它进行备份时要求有VSS Requestor发令,VERITAS,CA的备份软件不是什么采用,而是VSS把VERITAS,CA当作Requestor,由备份软件来发令。而盘阵不是。2.5 当使用VSS的时候,备份肯定能成功,即使文件是被加锁打开的,但并不保证数据是完全正确的,当应用程序不提供VSS writer的时候。所以只有当应用程序提供VSS writer的时候才使用VSS,不然不保证数据正确。2.6 VSS是对整个磁盘分驱(一个卷,比如C盘)做卷影,然后备份程序读取所需要的部分,之后一般都删除卷影。2.73 使用VSS3.1 Compiling VSS Applications (开发VSS应用程序)3.1.1 开发一个requestor包含下面的头文件: Vss.h VsWriter.h VsBackup.h链接下面的动态库: VssApi.Lib3.1.2 开发一个writer包含下面的头文件: Vss.h VsWriter.h VsBackup.h链接下面的动态库: VssApi.Lib3.2 Configuring VSS (初始VSS信息)3.2.1 Shadow Copy Context Configurations (卷影上下文配置)Requestor通过设置它的上下文来控制一个卷影的特征。上下文指出了一个卷影是否继续存在当当前操作结束后,也指出了需要writer/provider协调的程度。(主要是用到了枚举_VSS_SNAPSHOT_CONTEXT里的内容。) Persistence and Shadow Copy Context (是否生成一个持久卷影) Writer Participation and Shadow Copies (是否需要writer的参与) Obtaining Shadow Copy Information (获取卷影的信息,需要知道VSS_ID)3.2.2 VSS Backup Configurations (备份初始配置)包括设置全量/增量/差量备份类型。系统的一个requestor和writer指出数据将以什么方式写到存储设备上,什么卷影机制将会被部署,什么信息需要保存。Writer根据requestor设置的信息来设置自身的机制。(主要调用IVssBackupComponents:SetBackupState) VSS Backup State (需要在备份介质中存储备份的状态信息) Writer Backup Schema Support (多数在vista中支持) File Level Schema Support3.2.3 VSS Restore Configurations (恢复初始配置)在正在运行的系统中执行恢复操作可能产生问题,当差异产生的时候指明需要做什么很重要,例如恢复一个正在使用的文件。VSS用两种方法来管理恢复restore methods 和restore targets,以确定是否要重写当前存在的文件。 VSS Restore State (设置恢复的类型,从备份设备/还是从卷影) Setting VSS Restore Methods (恢复源于备份,在备份的时候,writers在元数据中写明了备份数据的恢复方式。恢复的时候需要停止应用服务吗/需要替换存在的文件吗) Setting VSS Restore Targets (设置在一个component-by-component为基础的备份/恢复中文件如何被恢复,组件的关联恢复问题) Setting VSS Restore Options (允许requestor定制writer的恢复选项) 3.3 VSS Metadata (VSS元数据)Writers和requestors通过他们各自的元数据信息文档来维护一个备份/恢复操作。主要包括 Writer Metadata Document 和 Backup Components Document,writers和requestors通过互相访问这些文档来通信和协调一次备份/恢复。It should always be saved to the backup media during a backup operation, and will need to be retrieved from that media in the course of a restore operation.一个元数据文件应该在备份期间生成,在恢复的时候能被找到。文档是XML格式的,开发人员应避免直接修改文件的内容,因为它里面的格式内容是供系统使用的。而且有些是生成后就是只读的。3.3.1 Working with the Writer Metadata Document每个writer会生成一个Writer Metadata Document,备份应用程序使用这个文档来获取关于writer的信息(writer的数据/如何恢复哪些数据),一旦这份文档产生,则对于备份应用程序来说是只读的。A Writer Metadata Document contains the list of all of a writers components, any one of which might participate in a backup. This differs from the requestors Backup Components Document, which contains only those components explicitly included for a backup or restore operation.Writer元数据文档包含writer所有的组件,这些组件有可能参加一次备份。备份组件文档则只包含那些要参加备份/恢复的组件。文档中必须包含一些必要的信息、恢复信息和组件信息。(注意恢复不是仅仅依据此文档就能进行的)一般包括以下信息: 应用程序 ID 和友好名称。 文件和组件的位置。 需要包含在备份中或从备份中排除的文件。 还原时应使用的选项。 这将通过 VSS 框架传递回请求程序。3.3.2 Working with the Backup Components Document一个requestor在一个备份开始的时候生成一个Backup Components Document,如果是备份操作,刚开始的时候被初始化为空的,只描述本次备份操作的状态,然后可能添加明确包含的组件信息和状态信息等。如果是恢复,这个文档一般从一个已存储的备份组件文档载入,应该提供一个requestor应该如何处理文件恢复的指示用法。在恢复期间,文档会被修改,而指明那些恢复操作的状态。If any component of a writer is backed up or restored, all nonselectable components without any selectable ancestors must be explicitly included in a backup or restore operation.When handling restore operations, the requestor uses selectability for restore instead of selectability for backup in conjunction with logical path information and its own internal logic to decide which files to restore. If a component that had been implicitly added to the backup is now to be explicitly added to the restore, the requestor will update the Backup Components Document with that components information.这个文档不是只读的,在一次备份完成或者中断前,一次恢复完成前,都会被requestors和writers修改。一个组件(component)是必须被当作一个单元来备份的一组文件。3.3.3 VSS Metadata Componentscomponents允许一个writer为一个备份引擎指明它的文件是怎么组织的,包含哪些数据。这有利于备份程序最大效率的存储文件。VSS存储components的信息在上面两个元数据文件中,在两个文件中关于同一个组件的信息是不同的。3.4 Working with Selectability and Logical Paths在一个备份和恢复操作中,一个writer的参与和它的数据的保存,依赖于明确包含在Backup Components Document中的它的components,和那些组件间的关系,以及其他components在Writer Metadata Document中的logical path。3.5 Overview of Processing a Backup under VSS在进行一个备份的时候,requestor和writers协调为备份任务提供一个一致的系统映像(做卷影的卷),这个操作要求最小打断writer的正常工作。一个requestor在开始做卷影的前面向writers请求他们的元数据,然后处理数据,然后进行备份操作,当卷影做完和备份完成后它又通知writers正常工作。为了响应那些请求,writers需要提供需要备份的文件的信息(包括components文件组),在做卷影的前面暂停I/O操作,然后在卷影完成或者备份完成之后恢复正常操作。在备份流程中,一个writer指定它形成的Writer Metadata Document文件,requestor获取它并解释元数据,决定需要备份什么,然后在Backup Components Document中自己的元数据对象中存储那些决定,Backup Components Document文档在备份和恢复过程中可以被writers看到和修改。下图显示了在一次备份中通常涉及的各方的交互过程:3.5.1 Backup Initialization (备份初始化)writer和requestor的初始化工作,填充他们各自的数据结构,requestor让writers收集元数据的信息。 各部分的主要活动Requestor actionEventWriter action建立(CreateVssBackupComponents)一个 IVssBackupComponents 接口,并初始化它(IVssBackupComponents:InitializeForBackup)来管理一个备份,and optionally enable or disable writers on the system.让writers收集各自的元数据信息 (IVssBackupComponents:GatherWriterMetadata) 让writers建立当前的元数据信息(Identify)建立Writer Metadata Document (Working with the Writer Metadata Document, CVssWriter:OnIdentify, IVssCreateWriterMetadata) Requestor Actions during Backup Initialization.1 一个IVssBackupComponents对象只能在一个备份中使用,一个requestor在备份终止或完成的时候必须释放IVssBackupComponents对象。不能在使用的时候重新初始IVssBackupComponents 接口。.2 一个requestor的Backup Components Document通常被初始化为空的,通过IVssBackupComponents:InitializeForBackup被加载。.3 所有的requestors在执行备份/恢复操作的时候必须调用IVssBackupComponents:GatherWriterMetadata,这个方法会产生一个Identify事件,一个writer响应这个事件就会建立metadata document。.4 在调用GatherWriterMetadata方法前,一个requestor可以调用方法来明确要使用/不使用哪些writers和writer classes。默认是所有classes都使用。(IVssBackupComponents:EnableWriterClasses,DisableWriterInstances,DisableWriterClasses).5 因为在调用GatherWriterMetadata前,没有方法来获取系统上所有writers的列表,requestors可以考虑建立和删除另一个IVssBackupComponents的实例来获取。.6 没必要在调用了IVssBackupComponents:GatherWriterMetadata后调用IVssBackComponents:GatherWriterStatus来让writer重收集自己的状态。因为Identify事件调用的文件不是writers提供的metadata的一部分。 Writer Actions during Backup Initialization.1 为了响应Identify事件,VSS会调用writer们的一些方法和接口来建立他们的元数据,Writer Metadata Document建立后是只读的。3.5.2 Backup Discovery Phase 在调用了IVssBackupComponents:GatherWriterMetadata后,一个requestor使用IVssAsync的实例来获得返回值,确定什么时候系统上所有的writers完成了Writer Metadata Documents的构造。至此,requestor开始了discovery阶段,检测元数据以确定什么应用程序正在运行,哪些卷需要做卷影。 活动Requestor actionEventWriter action得到Writer的元数据文件,建立分析接口(IVssBackupComponents:GetWriterMetadata, IVssExamineWriterMetadata)在这段期间,writer可以进行正常的工作分析元数据,使用组件的列表和他们有关的文件集,获取需要备份的卷的列表和文件列表(IVssWMComponent, IVssWMFiledesc)为做卷影设置context,查询系统支持的providers (IVssBackupComponents:SetContext, IVssBackupComponents:Query).初始化卷影集、上下文和检查支持的卷(IVssBackupComponents:StartSnapshotSet, IVssBackupComponents:IsVolumeSupported).获得writer的元数据后,requestor就可以增加卷到卷影集中,增加包含组件到Backup Components Document中(Working with Selectability for Backup and Working with the Backup Components Document, IVssBackupComponents:AddToSnapshotSet, IVssBackupComponents:AddComponent). Requestor Actions during the Discovery Phase.1 一个requestor通过IVssExamineWriterMetadata对象判断从IVssBackupComponents:GetWriterMetadata获取的元数据信息,确定哪些writers的哪些数据需要备份。.2 requestor需要为每一个writer产生一个组件列表(通过writer的元数据判断哪些组件被选择和哪些组件没有被选择),设置备份上下文(默认是VSS_CTX_BACKUP),增加卷到卷影集中。至此,Backup Components Document被初始化和填充完成,在以后的操作中,writers和requestor可以通过IVssComponent接口来互相通信。.3 直到卷影被做完,writers仍然可以在他们正常的工作流程中,从磁盘增加或者删除文件,所以你不应该在现在生成实际需要备份文件的列表。 Writer Actions during the Discovery Phase本阶段主要是requestor根据从writers获取的元数据,进行处理。理论上writer可以继续执行正常的工作,但最好让writer开始为做卷影/备份准备。3.5.3 Pre-Backup TasksPre-backup阶段主要为备份包含的数据所在的卷做卷影。Writer必须确定它是否参加本次备份,如果参加,需要配置它的文件和它自己来为备份和卷影准备。Requestor需要等待所有writers完成准备工作后才发起建立卷影的请求。 各部分的活动Requestor actionEventWriter actionRequestor在处理备份/恢复操作的时候能增加一些附加信息(IVssBackupComponents:SetBackupState, IVssBackupComponents:SetBackupOptions)检测/设置备份时间戳来支持增量和差量备份(IVssComponent:GetBackupStamp, IVssBackupComponents:SetPreviousBackupStamp)通知参加的writers准备即将来临的备份 IVssBackupComponents:PrepareForBackup,之后writers可以使用requestor的元数据文件PrepareForBackupwriter准备确定备份要包括的文件,是否writer在freeze的时候需要配合,设置支持增量/差量备份writer元数据,和设置一些自身内部的选项(CVssWriter:OnPrepareBackup, CVssWriter:IsPathAffected, IVssWriterComponents, IVssComponent, IVssComponent:GetBackupOptions, CVssWriter:AreComponentsSelected, IVssComponent:SetBackupMetadata, IVssComponent:AddDifferencedFilesByLastModifyTime, IVssComponent:AddDifferencedFilesByLastModifyLSN, IVssComponent:GetPreviousBackupStamp, IVssComponent:SetBackupStamp)Requestor等待writers完成备份准备通过IVssAsyncRequestor检查writers的状态(IVssBackupComponents:GatherWriterStatus, IVssBackupComponents:GetWriterStatus)Requestor请求做卷影通过 IVssBackupComponents:DoSnapshotSetPrepareForSnapshotCVssWriter:OnPrepareSnapshot: 把writer置于准备做卷影状态FreezeCVssWriter:OnFreeze: 做卷影前的最后设置,writer完成在做卷影过程中需要进行的操作ThawCVssWriter:OnThaw: 恢复正常使用I/O操作PostSnapshotCVssWriter:OnPostSnapshot: writer最后更新一些备份元数据,和删除一些准备备份时的临时文件Requestor等待卷影完成通过IVssAsync, 仍然检查writers的状态(IVssBackupComponents:GatherWriterStatus, IVssBackupComponents:GetWriterStatus Requestor Pre-Backup Tasks.1 在备份发起之前,一个requestor必须调用IVssBackupComponents:SetBackupState来进行一些设置显示给writers看备份的类型(VSS_BACKUP_TYPE)是否备份包括引导系统的状态是否requestor支持单组件选择或者支持完整卷 Writer Pre-Backup Tasks.1 一个writer能通过CVssWriter:GetBackupType,CVssWriter:IsBootableStateBackedUp,CVssWriter:AreComponentsSelected来获取备份的信息,3.5.4 Actual Backup Of Files因为当处理BackupComplete事件的时候writers能修改Backup Components Document,所以在BacupComplete事件后,一个requestor应该保存它的状态在备份介质上。 各部分的活动Requestor actionEventWriter action访问在卷影卷上的数据(IVssBackupComponents:GetSnapshotProperties, VSS_SNAPSHOT_PROP) 生成备份列表,复制数据到备份介质上显示一个备份成功还是失败IVssBackupComponents:SetBackupSucceeded. 发信号给writer说备份完成 IVssBackupComponents:BackupComplete. BackupComplete备份完成的清除工作(CVssWriter:OnBackupComplete, IVssWriterComponents, IVssComponent). Requestor等待所有的writers确认了 IVssBackupComponents:BackupComplete 事件,通过IVssAsync.它也可以检测writers的状态(IVssBackupComponents:GatherWriterStatus, IVssBackupComponents:GetWriterStatus). 可以保存Backup Components Document和每个writer的Writer Metadata Document为XML 格式的文档写到备份介质上(IVssBackupComponents:SaveAsXML and IVssExamineWriterMetadata:SaveAsXML). Requestor Actions during Backup of Files Writer Actions during Backup of Files3.5.5 Backup TerminationRequestor actionEventWriter actionRequestor完成一个卷影随着释放IVssBackupComponents接口或者调用IVssBackupComponents: DeleteSnapshots.IVssBackupComponents接口释放通过调用IUnknown:Release.BackupShutdownWriter处理这个事件 CVssWriter:OnBackupShutdown, 来允许自己清除任何关于卷影的状态,如果备份操作失败,不会产生这个事件BackupComplete,writer也许会进行错误处理,Handling BackupShutdown Events3.6 Overview of Processing a Restore under VSS恢复操作不需要卷影,VSS主要完成建立一致的磁盘数据,让writers进行必要的验证和合并数据操作。Like a backup operation, a VSS restore requires access to both a Backup Components Document and to Writer Metadata Documents. These documents are not generally obtained by querying running applications, but instead are retrieved from versions stored as XML documents on backup media.恢复需要访问备份组件文档和writer的元数据,和备份不同的是,这些文档不是由正在运行的应用程序去收集,而是由备份的时候生成的,在这里加载。(所以备份的时候还要保存两个XML文档)和备份一样,writer收集的信息仍然是只读的,但备份组件文档可以被requestor和writers修改,可以修改恢复的方法而忽略备份组件里的,修改新的还原路径等。3.6.1 Overview of Restore Initialization(初始)完成恢复初始化工作,需要使用备份组件文档和writer的元数据(备份的时候保存的)参与,writer需要收集各自当前的信息,因为要协调恢复。Requestor actionEventWriter actionCreate an IVssBackupComponents interface, initialize it to manage a restore, and load stored requestor metadata (see CreateVssBackupComponents, IVssBackupComponents:InitializeForRestore).Create IVssExamineWriterMetadata interfaces and load them with stored writer metadata. (See CreateVssExamineWriterMetadata, IVssExamineWriterMetadata:LoadFromXML.)Initiate asynchronous contact with writers (see IVssBackupComponents:GatherWriterMetadata.)IdentifyThe writer begins event handling in support of the restore. Creates the Writer Metadata Document (see Working with the Writer Metadata Document, CVssWriter:OnIdentify, IVssCreateWriterMetadata).The requestor waits on writers to initialize with IVssAsync. It should also verify writer status (see IVssBackupComponents:GatherWriterStatus, IVssBackupComponents:GetWriterStatus). Requestor Actions during Restore Initialization在恢复初始阶段,requestor需要访问备份组件文档和与包含组件有关的writer元数据文档。(需要我们把存储在磁盘上的XML文档内容转成BSTR格式的内容,后通过相应的函数参数传递)requestor建立了一个IVssBackupComponents组件后,通过IVssBackupComponents:InitializeForRestore方法获取原来保存的备份组件文档的内容,初始还原。requestor通过CreateVssExamineWriterMetadata函数(不是通过GetWriterMetadata方法)建立一个IVssExamineWriterMetadata接口,并把某个writer的元数据信息传递给它。A requestor reads in stored writer metadata by creating IVssExamineWriterMetadata interfaces for those writers whose data was backed up and now is to be restored (using CreateVssExamineWriterMetadata), retrieving the XML documents containing that metadata from the storage media, and loading it into the interfaces with IVssExamineWriterMetadata:LoadFromXML.(为什么需要加载两次呢?)为了协调恢复使用的原来备份的writer元数据和活动的writer,requestor需要调用GatherWriterMetata来让当前活动的writer来收集元数据信息。(只是收集,恢复操作用不到GetWriterMetadata来检测运行的writer的元数据信息)requestor可以使用IVssBackupComponents:GatherWriterStatus, IVssBackupComponents:GetWriterStatus来获取运行的writers的信息,这样就没必要使用GetWriterMetadata来获取详细信息。Generating a Restore Set用得到吗,我们这种备份方式。 Writer Actions during Restore Initialization只进行信息的收集。3.6.2 Overview of Preparing for Restore (准备)在恢复准备阶段,requestor使用以前的writer元数据和备份组件文档来决定恢复什么内容和怎么恢复。writer通过访问备份组件文档(已经载入),根据里面的内容来协调在恢复过程中最小化影响正常服务。这个阶段结束后,requestor应该知道哪些文件需要被恢复和怎么被恢复。Requestor actionEventWriter actionRetrieve information from the Backup Components Document about the components explicitly included in the backup operation (see IVssBackupComponents:GetWriterComponents) Examine retrieved Writer Metadata Documents to get details about those components explicitly included in the backup, and any find implicitly included subcomponents. (See IVssExamineWriterMetadata, IVssWMComponent.)Select components and component sets to be restored (see IVssBackupComponents:SetSelectedForRestore, IVssBackupComponents:AddRestoreSubcomponent, IVssBackupComponents:SetRestoreOptions.)The requestor allows the writer to update the Backup Components Document and may optionally communicate any special restore options to the writer. (See IVssBackupComponents:PreRestore, IVssBackupComponents:SetRestoreOptions.)PreRestoreThe writer determines participation in the restore, prepares files to restore, and optionally modifies Backup Components Document if necessary. (See CVssWriter:OnPreRestore, IVssComponent, IVssComponent:IsSelectedForRestore, IVssComponent:GetRestoreOptions, IVssComponent:SetRestoreTarget, IVssComponent:SetRestoreMetadata, IVssComponent:AddDirectedTarget.)The requestor waits on writers to handle the PreRestore event with IVssAsync. It should also verify writer status. (See IVssBackupComponents:GatherWriterStatus, IVssBackupComponents:GetWriterStatus.) Requestor Actions during Restore Preparationsrequestor可以通过IVssBackupComponents:GetWriterComponents获取包含在备份组件文档里的组件信息,requestor还需要使用IVssExamineWriterMetadata接口(前面已经加载过)从原来的writer元数据信息里,来获取组件里没有提到的一些细致的信息,比如说文件的路径等。然后requestor就知道了哪些组件是需要恢复的,通过IVssBackupComponents:SetSelectedForRestore或者IVssBackupComponents:AddRestoreSubcomponent把明确需要恢复的组件/子组件加到恢复中。A requestor may explicitly include none of a currently executing writers components for restore using IVssBackupComponents:SetSelectedForRestore or IVssBackupComponents:AddRestoreSubcomponent. In this case, that writer will not receive any VSS events for the remainder of the restore operation.(如果某个writer收集的信息中没有对应的要恢复的组件存在,那么此writer不会参加剩下的本次VSS还原过程。)Explicitly using either IVssBackupComponents:SetSelectedForRestore or IVssBackupComponents:AddRestoreSubcomponent to select a component of a writer that is not currently running returns a VSS_E_OBJECT_NOT_FOUND error. (如果要恢复的组件,没有在当前运行的writer中找到对应的项则返回错误信息。)See Restores without Writer Participation for information on restoring the data of missing writers.(指出了在一些情况下,不需要writer参加恢复)Requestor可以通过调用IVssBackupComponents:SetRestoreOptions来设置选项,为writer提供一些更加完整的恢复信息。(IVssBackupComponents:SetAdditionalRestores用来设置增量和差量中)至此,requestor完成了恢复准备工作,产生PreRestor事件让相关writer去准备恢复操作。 Writer Actions during Restore PreparationsThe OnPreRestore method is called by a writer following a PreRestore event. This method is used to put the writer in a state to support the restorefor instance, taking database services offlineand to make modifications in the Backup Components Document of the requestor that is restoring files (such as setting the restore target to override the original restore method).(把writer置于恢复状态,可能把数据库置于离线状态)通过这个阶段后,writer就知道了要恢复什么和怎么恢复。3.6.3 Overview of Actual File Restoration (实际恢复)在这个阶段requestor可以利用足够的信息来恢复文件。这个阶段不需要writer的参与。Requestor actionEventWriter actionGenerate a restore set listing for fil

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论