本文介绍如何使用通用复制工具在 Azure 文件共享之间复制文件。 可以在 HDD 和 SSD 文件共享、使用不同的计费模型或不同 Azure 区域中的文件共享之间复制文件。
本文不提供迁移到 Azure 文件存储的指导。 如果要迁移到 Azure 文件存储,请参阅 “迁移到 SMB Azure 文件共享 ”或 “迁移到 NFS Azure 文件共享”。 如果使用的是 Azure 文件同步,并且想要在 Azure 文件共享之间迁移,请参阅 使用 Azure 文件同步时,将文件从一个 Azure 文件共享迁移到另一个文件共享。
选择文件复制工具
应选择的文件复制工具取决于是要在 SMB 文件共享还是 NFS 文件共享之间复制文件。 下表列出了可用的各种复制工具及其兼容性。
| 复制工具 | SMB | NFS | 说明 |
|---|---|---|---|
| AzCopy |
|
|
通常建议使用 AzCopy,因为它使用服务器到服务器 API,这意味着数据直接在存储服务器之间复制,而无需通过本地计算机传递。 这提供更好的性能。 可以从 Windows、Linux 或 macOS 运行 AzCopy。 |
| Robocopy |
|
|
Robocopy 是一个 Windows 命令行实用工具,它使用 SMB 协议执行文件复制作。 它需要将这两个文件共享装载到 Windows 虚拟机(VM)。 虽然这增加了开销和成本,但如果需要高级选项(例如镜像、精细重试控制或实时日志记录),则可以选择 Robocopy。 |
| fpsync/rsync |
|
|
rsync 是一种通用的单线程开源文件复制工具。 它可以在本地复制、通过任何远程 shell 从/向另一台主机复制,或者从/向远程 rsync 守护程序复制。 fpsync 是多线程的,因此提供了一些优势,包括能够并行运行 rsync 作业。 这两种工具都需要在 VM 上挂载共享。 |
使用 AzCopy 复制文件
可以使用命令行实用工具 AzCopy 在 Azure 文件共享之间复制文件。 AzCopy 使用服务器到服务器 API,因此数据直接在存储服务器之间复制。 说明因使用的是 SMB 还是 NFS 文件共享而异。
尽管 AzCopy 不需要将文件共享装载到 VM,但它确实需要轻型 VM 运行其二进制文件,并通过 REST 协调两个文件共享之间的复制。
本文中的 AzCopy 命令使用 azcopy copy 命令复制文件。 该 azcopy sync 命令可以帮助从初始基线同步差异,这对于设置其他区域的复制操作非常有用。 有关详细信息,请参阅 同步文件 。
AzCopy 缩放限制和性能
如果只是复制几个文件,则不应遇到任何规模限制。 但是,为了获得最佳性能,每个 AzCopy 作业应传输少于 1000 万个文件。 传输超过 5000 万文件的作业可能会遇到性能下降,因为 AzCopy 作业跟踪机制会产生很大的开销。 若要降低开销,请考虑将大型作业划分为较小作业。 单个文件大小没有硬性限制。
复制所需的时间可能会因多种因素而异,包括:要传输的文件和目录总数、平均文件大小(许多小型文件处理时间比少量的大文件要长)、源和目标之间的网络带宽和延迟、存储账户的限流限制,以及在源或目标共享上的并发操作。
使用 AzCopy 复制文件时保留的属性
使用 --preserve-info 和 --preserve-permissions 标志时,AzCopy 保留以下文件属性和权限:
| 类型 | 属性 (--preserve-info) | 权限(--preserve-permissions) |
|---|---|---|
| SMB 文件共享 | 文件属性(只读,隐藏,系统,目录,存档,无,临时,离线,未编入内容索引,无擦除数据),创建时间,上次写入时间 | ACL |
| NFS 文件共享 | 创建时间,上次写入时间 | 所有者、组、文件模式 |
在 SMB 文件共享之间复制文件
若要在 SMB 文件共享之间复制文件,请使用 azcopy copy 命令。
小窍门
这些示例将路径参数括在单引号 ('') 内。 在除 Windows 命令 Shell (cmd.exe) 以外的所有命令 shell 中,都请使用单引号。 如果使用 Windows 命令 Shell (cmd.exe),请用双引号 ("") 而不是单引号 ('') 括住路径参数。
在 SMB 文件共享之间复制单个文件
使用以下命令将单个文件从一个 SMB 文件共享复制到另一个 SMB 文件共享。
azcopy copy 'https://<source-storage-account-name>.file.core.chinacloudapi.cn/<file-share-name>/<file-path><SAS-token>' 'https://<destination-storage-account-name>.file.core.chinacloudapi.cn/<file-share-name>/<file-path><SAS-token>' --preserve-permissions=true --preserve-info=true
在 SMB 文件共享之间复制目录
使用以下命令将目录及其所有文件从一个 SMB 文件共享复制到另一个 SMB 文件共享。 结果是目标文件共享中具有相同名称的目录。
azcopy copy 'https://<source-storage-account-name>.file.core.chinacloudapi.cn/<file-share-name>/<directory-path><SAS-token>' 'https://<destination-storage-account-name>.file.core.chinacloudapi.cn/<file-share-name><SAS-token>' --recursive --preserve-permissions=true --preserve-info=true
将整个 SMB 文件共享复制到另一个存储帐户
使用以下命令将整个 SMB 文件共享复制到另一个存储帐户。
azcopy copy 'https://<source-storage-account-name>.file.core.chinacloudapi.cn/<file-share-name><SAS-token>' 'https://<destination-storage-account-name>.file.core.chinacloudapi.cn/<file-share-name><SAS-token>' --recursive --preserve-permissions=true --preserve-info=true
将所有 SMB 文件共享、目录和文件复制到另一个存储帐户
使用以下命令将所有 SMB 文件共享、目录和文件从一个存储帐户复制到另一个存储帐户。
azcopy copy 'https://<source-storage-account-name>.file.core.chinacloudapi.cn/<SAS-token>' 'https://<destination-storage-account-name>.file.core.chinacloudapi.cn/<SAS-token>' --recursive --preserve-permissions=true --preserve-info=true
在 NFS 文件共享之间复制文件
若要在 NFS Azure 文件共享之间复制文件,请使用带有标志的 --from-to=FileNFSFileNFS 命令。 此 FileNFSFileNFS 方案使用服务器到服务器复制 API。 或者,可以使用开源文件复制工具,如 fpsync 和 rsync。
小窍门
这些示例将路径参数括在单引号 ('') 内。 在除 Windows 命令 Shell (cmd.exe) 以外的所有命令 shell 中,都请使用单引号。 如果使用 Windows 命令 Shell (cmd.exe),请用双引号 ("") 而不是单引号 ('') 括住路径参数。
在 NFS 文件共享之间复制单个文件
使用以下命令将单个文件从一个 NFS 文件共享复制到另一个文件共享。
azcopy copy 'https://<source-storage-account-name>.file.core.chinacloudapi.cn/<file-share-name>/<file-path><SAS-token>' 'https://<destination-storage-account-name>.file.core.chinacloudapi.cn/<file-share-name>/<file-path><SAS-token>' --preserve-permissions=true --preserve-info=true --from-to=FileNFSFileNFS
在 NFS 文件共享之间复制目录
使用以下命令将目录及其所有文件从一个 NFS 文件共享复制到另一个文件共享。 结果是目标文件共享中具有相同名称的目录。
azcopy copy 'https://<source-storage-account-name>.file.core.chinacloudapi.cn/<file-share-name>/<directory-path><SAS-token>' 'https://<destination-storage-account-name>.file.core.chinacloudapi.cn/<file-share-name><SAS-token>' --recursive --preserve-permissions=true --preserve-info=true --from-to=FileNFSFileNFS
将整个 NFS 文件共享复制到另一个存储帐户
使用以下命令将整个 NFS 文件共享复制到另一个存储帐户。
azcopy copy 'https://<source-storage-account-name>.file.core.chinacloudapi.cn/<file-share-name><SAS-token>' 'https://<destination-storage-account-name>.file.core.chinacloudapi.cn/<file-share-name><SAS-token>' --recursive --preserve-permissions=true --preserve-info=true --from-to=FileNFSFileNFS
将所有 NFS 文件共享、目录和文件复制到另一个存储帐户
使用以下命令将所有 NFS 文件共享、目录和文件从一个存储帐户复制到另一个存储帐户。
azcopy copy 'https://<source-storage-account-name>.file.core.chinacloudapi.cn/<SAS-token>' 'https://<destination-storage-account-name>.file.core.chinacloudapi.cn/<SAS-token>' --recursive --preserve-permissions=true --preserve-info=true --from-to=FileNFSFileNFS
使用 Robocopy 复制文件
按照以下步骤使用 Windows 附带的命令行实用工具 Robocopy 复制文件。 只能将此方法用于 Windows 和 SMB 文件共享。
在 Azure 中部署与源文件共享相同的区域中的 Windows 虚拟机(VM)。 在 Azure 中保留数据和网络速度更快,并避免出站数据传输费用。 为了获得最佳性能,我们建议使用至少具有 56 GiB 内存的多核 VM 类型,例如 Standard_DS5_v2。
将源文件共享和目标文件共享都装载到 VM。 若要确保 VM 有权访问所有文件,请装载具有 管理员级访问权限的 Azure 文件共享:具有具有管理员级 Azure RBAC 角色(建议)的基于标识的访问权限(建议)或存储帐户密钥(安全性较低)。
在 Windows 命令提示符处运行此命令。 可以选择添加标志以记录日志功能,作为一种最佳实践(/NP、/NFL、/NDL、/UNILOG)。 请记得根据需要将
s:\和t:\替换为已装载的源共享和目标共享的路径。robocopy s:\ t:\ /MIR /COPYALL /MT:16 /R:2 /W:1 /B /IT /DCOPY:DAT当源仍处于联机状态时,可以运行该命令,但用于 Robocopy 作业的 IOPS 和吞吐量根据文件共享限制进行计数。
初始运行完成后,再次运行相同的 Robocopy 命令,以复制自初始运行以来发生的所有更改。 跳过自上次复制作业以来未更改的任何数据。
在切换到新的文件共享之前,您可以根据需要多次重复步骤 4。