使用 Linux 上的 AzCopy 传输数据

Linux 上的 AzCopy 是一个命令行实用程序,专用于使用具有优化性能的简单命令将数据复制到 Azure Blob 和文件存储以及从这些位置复制数据。 可在存储帐户中将数据从一个对象复制到另一个对象,或者在存储帐户之间复制。

有两个版本的 AzCopy 可供下载。 Linux 上的 AzCopy 使用 .NET Core Framework 构建而成,以提供 POSIX 样式的命令行选项的 Linux 平台为目标。 Windows 上的 AzCopy 使用 .NET Framework 构建而成,提供 Windows 样式的命令行选项。 本文介绍 Linux 上的 AzCopy。

下载并安装 AzCopy

Linux 上的安装

本文包括各种版本 Ubuntu 的命令。 使用 lsb_release -a 命令确认分发版本和代码名称。

AzCopy on Linux 要求在平台上安装 .NET Core 框架(版本 1.1.x)。 请参阅 .NET Core 页面上的安装说明。

例如,在 Ubuntu 16.04 上安装 .NET Core。 有关最新的安装指南,请访问 Linux 上的 .NET Core 安装页面。

curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > microsoft.gpg
sudo mv microsoft.gpg /etc/apt/trusted.gpg.d/microsoft.gpg
sudo sh -c 'echo "deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-xenial-prod xenial main" > /etc/apt/sources.list.d/dotnetdev.list'
sudo apt-get update
sudo apt-get install dotnet-dev-1.1.4

安装 .NET Core 后,下载并安装 AzCopy。

wget -O azcopy.tar.gz https://aka.ms/downloadazcopyprlinux
tar -xf azcopy.tar.gz
sudo ./install.sh

在 Linux 上安装 AzCopy 后,可以删除提取的文件。 或者如果没有超级用户权限,还可以使用提取的文件夹中的 shell 脚本“azcopy”运行 AzCopy。

编写第一条 AzCopy 命令

AzCopy 命令的基本语法是:

azcopy --source <source> --destination <destination> [Options]

以下示例演示了将数据复制到 Azure Blob 和文件以及从这些位置复制数据的各种情况。 请参阅 azcopy --help 菜单,详细了解每个示例中使用的参数。

Blob:下载

下载单个 blob

azcopy \
    --source https://myaccount.blob.core.chinacloudapi.cn/mycontainer \
    --destination /mnt/myfiles \
    --source-key <key> \
    --include "abc.txt"

如果文件夹 /mnt/myfiles 不存在,AzCopy 会创建该文件夹并将 abc.txt 下载到新文件夹中。

从次要区域下载单个 blob

azcopy \
    --source https://myaccount-secondary.blob.core.chinacloudapi.cn/mynewcontainer \
    --destination /mnt/myfiles \
    --source-key <key> \
    --include "abc.txt"

请注意,必须已启用读取访问异地冗余存储。

下载所有 blob

azcopy \
    --source https://myaccount.blob.core.chinacloudapi.cn/mycontainer \
    --destination /mnt/myfiles \
    --source-key <key> \
    --recursive

假定指定的容器中存在以下 blob:

abc.txt
abc1.txt
abc2.txt
vd1/a.txt
vd1/abcd.txt

下载操作完成后,目录 /mnt/myfiles 中将包括以下文件:

/mnt/myfiles/abc.txt
/mnt/myfiles/abc1.txt
/mnt/myfiles/abc2.txt
/mnt/myfiles/vd1/a.txt
/mnt/myfiles/vd1/abcd.txt

如果未指定选项 --recursive,则不会下载任何 blob。

下载具有指定前缀的 blob

azcopy \
    --source https://myaccount.blob.core.chinacloudapi.cn/mycontainer \
    --destination /mnt/myfiles \
    --source-key <key> \
    --include "a" \
    --recursive

假定指定的容器中存在以下 blob。 将下载所有以前缀 a 开头的 blob。

abc.txt
abc1.txt
abc2.txt
xyz.txt
vd1\a.txt
vd1\abcd.txt

下载操作完成后,文件夹 /mnt/myfiles 中将包括以下文件:

/mnt/myfiles/abc.txt
/mnt/myfiles/abc1.txt
/mnt/myfiles/abc2.txt

前缀适用于虚拟目录,后者构成了 blob 名称的第一个部分。 在上述示例中,虚拟目录与指定的前缀不匹配,因此不会下载任何 blob。 此外,如果未指定选项 --recursive,AzCopy 将不会下载任何 blob。

将已导出文件的上次修改时间设置为与源 blob 相同

azcopy \
    --source https://myaccount.blob.core.chinacloudapi.cn/mycontainer \
    --destination "/mnt/myfiles" \
    --source-key <key> \
    --preserve-last-modified-time

还可以根据 Blob 的上次修改时间将其从下载操作中排除。 例如,如果希望排除其上次修改时间与目标文件相同或晚于目标文件的 blob,则添加 --exclude-newer 选项:

azcopy \
    --source https://myaccount.blob.core.chinacloudapi.cn/mycontainer \
    --destination /mnt/myfiles \
    --source-key <key> \
    --preserve-last-modified-time \
    --exclude-newer

或者,如果想要排除其上次修改时间与目标文件相同或早于目标文件的 blob,则添加 --exclude-older 选项:

azcopy \
    --source https://myaccount.blob.core.chinacloudapi.cn/mycontainer \
    --destination /mnt/myfiles \
    --source-key <key> \
    --preserve-last-modified-time \
    --exclude-older

Blob:上传

上传单个文件

azcopy \
    --source /mnt/myfiles \
    --destination https://myaccount.blob.core.chinacloudapi.cn/mycontainer \
    --dest-key <key> \
    --include "abc.txt"

如果指定的目标容器不存在,则 AzCopy 将创建它并将文件上传到其中。

将单个文件上传到虚拟目录

azcopy \
    --source /mnt/myfiles \
    --destination https://myaccount.blob.core.chinacloudapi.cn/mycontainer \
    --dest-key <key> \
    --include "abc.txt"

如果指定的虚拟目录不存在,AzCopy 将上传文件以在其 blob 名称中包括虚拟目录(例如,上述示例中的 vd/abc.txt)。

上传全部文件

azcopy \
    --source /mnt/myfiles \
    --destination https://myaccount.blob.core.chinacloudapi.cn/mycontainer \
    --dest-key <key> \
    --recursive

指定选项 --recursive 会以递归方式将指定目录的内容上传到 Blob 存储,这意味着也会上传所有子文件夹及其文件。 例如,假定以下文件位于文件夹 /mnt/myfiles 中:

/mnt/myfiles/abc.txt
/mnt/myfiles/abc1.txt
/mnt/myfiles/abc2.txt
/mnt/myfiles/subfolder/a.txt
/mnt/myfiles/subfolder/abcd.txt

上传操作完成后,容器中将包括以下文件:

abc.txt
abc1.txt
abc2.txt
subfolder/a.txt
subfolder/abcd.txt

未指定选项 --recursive 时,只会上传以下三个文件:

abc.txt
abc1.txt
abc2.txt

上传与指定模式相匹配的文件

azcopy \
    --source /mnt/myfiles \
    --destination https://myaccount.blob.core.chinacloudapi.cn/mycontainer \
    --dest-key <key> \
    --include "a*" \
    --recursive

假定以下文件位于文件夹 /mnt/myfiles 中:

/mnt/myfiles/abc.txt
/mnt/myfiles/abc1.txt
/mnt/myfiles/abc2.txt
/mnt/myfiles/xyz.txt
/mnt/myfiles/subfolder/a.txt
/mnt/myfiles/subfolder/abcd.txt

上传操作完成后,容器中将包括以下文件:

abc.txt
abc1.txt
abc2.txt
subfolder/a.txt
subfolder/abcd.txt

未指定选项 --recursive 时,AzCopy 会跳过子目录中的文件:

abc.txt
abc1.txt
abc2.txt

指定目标 blob 的 MIME 内容类型

默认情况下,AzCopy 将目标 blob 的内容类型设置为 application/octet-stream。 但可以通过选项 --set-content-type [content-type] 显式指定内容类型。 此语法会在上传操作中设置所有 blob 的内容类型。

azcopy \
    --source /mnt/myfiles \
    --destination https://myaccount.blob.core.chinacloudapi.cn/myContainer/ \
    --dest-key <key> \
    --include "ab" \
    --set-content-type "video/mp4"

如果指定 --set-content-type 选项不带任何值,则 AzCopy 会根据文件扩展名设置每个 Blob 或文件的内容类型。

azcopy \
    --source /mnt/myfiles \
    --destination https://myaccount.blob.core.chinacloudapi.cn/myContainer/ \
    --dest-key <key> \
    --include "ab" \
    --set-content-type

Blob:复制

在存储帐户内复制单个 blob

azcopy \
    --source https://myaccount.blob.core.chinacloudapi.cn/mycontainer1 \
    --destination https://myaccount.blob.core.chinacloudapi.cn/mycontainer2 \
    --source-key <key> \
    --dest-key <key> \
    --include "abc.txt"

不使用 --sync-copy 选项复制 blob 时,将执行服务器端复制操作。

跨存储帐户复制单个 blob

azcopy \
    --source https://sourceaccount.blob.core.chinacloudapi.cn/mycontainer1 \
    --destination https://destaccount.blob.core.chinacloudapi.cn/mycontainer2 \
    --source-key <key1> \
    --dest-key <key2> \
    --include "abc.txt"

不使用 --sync-copy 选项复制 blob 时,将执行服务器端复制操作。

将单个 blob 从次要区域复制到主要区域

azcopy \
    --source https://myaccount1-secondary.blob.core.chinacloudapi.cn/mynewcontainer1 \
    --destination https://myaccount2.blob.core.chinacloudapi.cn/mynewcontainer2 \
    --source-key <key1> \
    --dest-key <key2> \
    --include "abc.txt"

请注意,必须已启用读取访问异地冗余存储。

跨存储帐户复制单个 blob 及其快照

azcopy \
    --source https://sourceaccount.blob.core.chinacloudapi.cn/mycontainer1 \
    --destination https://destaccount.blob.core.chinacloudapi.cn/mycontainer2 \
    --source-key <key1> \
    --dest-key <key2> \
    --include "abc.txt" \
    --include-snapshot

复制操作完成后,目标容器中将包括 blob 及其快照。 容器包括以下 blob 及其快照:

abc.txt
abc (2013-02-25 080757).txt
abc (2014-02-21 150331).txt

跨存储帐户同步复制 blob

默认情况下,AzCopy 以异步方式复制两个存储终结点之间的数据。 因此,复制操作根据复制 blob 的速度,在后台使用没有 SLA 的空闲带宽容量运行。

--sync-copy 选项可确保复制操作的速度一致。 AzCopy 通过下载 blob,将 blob 从指定的源复制到本地内存,然后将上传到 Blob 存储目标,以实现同步复制。

azcopy \
    --source https://myaccount1.blob.core.chinacloudapi.cn/myContainer/ \
    --destination https://myaccount2.blob.core.chinacloudapi.cn/myContainer/ \
    --source-key <key1> \
    --dest-key <key2> \
    --include "ab" \
    --sync-copy

--sync-copy 可能会产生额外的数据传出费用,而异步复制则不会。 在与源存储帐户所在的同一区域的 Azure VM 中,建议使用此选项,避免产生数据传出费用。

文件:下载

下载单个文件

azcopy \
    --source https://myaccount.file.core.chinacloudapi.cn/myfileshare/myfolder1/ \
    --destination /mnt/myfiles \
    --source-key <key> \
    --include "abc.txt"

如果指定的源是 Azure 文件共享,则必须指定确切的文件名(例如 abc.txt)以下载单个文件,或者指定选项 --recursive 以递归方式下载该共享中的所有文件。 尝试同时指定文件模式和选项 --recursive 会导致错误。

下载所有文件

azcopy \
    --source https://myaccount.file.core.chinacloudapi.cn/myfileshare/ \
    --destination /mnt/myfiles \
    --source-key <key> \
    --recursive

请注意,不会下载任何空文件夹。

文件:上传

上传单个文件

azcopy \
    --source /mnt/myfiles \
    --destination https://myaccount.file.core.chinacloudapi.cn/myfileshare/ \
    --dest-key <key> \
    --include abc.txt

上传全部文件

azcopy \
    --source /mnt/myfiles \
    --destination https://myaccount.file.core.chinacloudapi.cn/myfileshare/ \
    --dest-key <key> \
    --recursive

请注意,不会上传任何空文件夹。

上传与指定模式相匹配的文件

azcopy \
    --source /mnt/myfiles \
    --destination https://myaccount.file.core.chinacloudapi.cn/myfileshare/ \
    --dest-key <key> \
    --include "ab*" \
    --recursive

文件:复制

跨文件共享复制

azcopy \
    --source https://myaccount1.file.core.chinacloudapi.cn/myfileshare1/ \
    --destination https://myaccount2.file.core.chinacloudapi.cn/myfileshare2/ \
    --source-key <key1> \
    --dest-key <key2> \
    --recursive

跨文件共享复制某个文件时,将执行服务器端复制操作。

从文件共享复制到 blob

azcopy \ 
    --source https://myaccount1.file.core.chinacloudapi.cn/myfileshare/ \
    --destination https://myaccount2.blob.core.chinacloudapi.cn/mycontainer/ \
    --source-key <key1> \
    --dest-key <key2> \
    --recursive

将文件从文件共享复制到 Blob 时,将执行服务器端复制操作。

从 blob 复制到文件共享

azcopy \
    --source https://myaccount1.blob.core.chinacloudapi.cn/mycontainer/ \
    --destination https://myaccount2.file.core.chinacloudapi.cn/myfileshare/ \
    --source-key <key1> \
    --dest-key <key2> \
    --recursive

将文件从 Blob 复制到文件共享时,将执行服务器端复制操作。

同步复制文件

可以指定选项 --sync-copy,将数据从文件存储复制到文件存储、从文件存储复制到 Blob 存储以及从 Blob 存储复制到文件存储,同步进行。 AzCopy 通过将源数据下载到本地内存,然后再将其上传到目标来运行此操作。 在这种情况下,将采用标准数据传出费用。

azcopy \
    --source https://myaccount1.file.core.chinacloudapi.cn/myfileshare1/ \
    --destination https://myaccount2.file.core.chinacloudapi.cn/myfileshare2/ \
    --source-key <key1> \
    --dest-key <key2> \
    --recursive \
    --sync-copy

当从文件存储复制到 Blob 存储时,默认的 blob 类型是块 blob,用户可以指定选项 --blob-type page 以更改目标 blob 类型。 可用类型为 page | block | append

请注意,--sync-copy 可能会产生额外的数据传出费用,而异步复制则不会。 在与源存储帐户所在的同一区域的 Azure VM 中,建议使用此选项,避免产生数据传出费用。

AzCopy 的其他功能

仅复制目标中不存在的数据

--exclude-older--exclude-newer 参数分别用于阻止复制较早或较新的源资源。 如果只想复制目标中不存在的源资源,可以在 AzCopy 命令中指定这两个参数:

--source http://myaccount.blob.core.chinacloudapi.cn/mycontainer --destination /mnt/myfiles --source-key <sourcekey> --recursive --exclude-older --exclude-newer

--source /mnt/myfiles --destination http://myaccount.file.core.chinacloudapi.cn/myfileshare --dest-key <destkey> --recursive --exclude-older --exclude-newer

--source http://myaccount.blob.core.chinacloudapi.cn/mycontainer --destination http://myaccount.blob.core.chinacloudapi.cn/mycontainer1 --source-key <sourcekey> --dest-key <destkey> --recursive --exclude-older --exclude-newer

使用配置文件指定命令行参数

azcopy --config-file "azcopy-config.ini"

可以在配置文件中包括任何 AzCopy 命令行参数。 AzCopy 会像处理在命令行上指定的参数一样处理该文件中的参数,使用该文件的内容执行直接替换。

假定有一个名为 copyoperation 的配置文件,其中包含以下行。 可以在一行中指定每个 AzCopy 参数。

--source http://myaccount.blob.core.chinacloudapi.cn/mycontainer --destination /mnt/myfiles --source-key <sourcekey> --recursive --quiet

每个 AzCopy 参数:

--source http://myaccount.blob.core.chinacloudapi.cn/mycontainer
--destination /mnt/myfiles
--source-key<sourcekey>
--recursive
--quiet

如果将参数拆分到两行(如此处所示的 --source-key 参数),AzCopy 将会失败:

http://myaccount.blob.core.chinacloudapi.cn/mycontainer
/mnt/myfiles
--sourcekey
<sourcekey>
--recursive
--quiet

指定共享访问签名 (SAS)

azcopy \
    --source https://myaccount.blob.core.chinacloudapi.cn/mycontainer1 \
    --destination https://myaccount.blob.core.chinacloudapi.cn/mycontainer2 \
    --source-sas <SAS1> \
    --dest-sas <SAS2> \
    --include abc.txt

此外,还可以在容器 URI 上指定一个 SAS:

azcopy \
    --source https://myaccount.blob.core.chinacloudapi.cn/mycontainer1/?SourceSASToken \
    --destination /mnt/myfiles \
    --recursive

请注意,AzCopy 当前仅支持帐户 SAS

日志文件文件夹

每次向 AzCopy 发出命令时,它都会检查默认文件夹中是否存在日志文件,或者通过此选项指定的文件夹中是否存在日志文件。 如果这两个位置中都不存在日志文件,AzCopy 则会将操作视为新操作并生成一个新的日志文件。

如果存在日志文件,AzCopy 会检查输入的命令行是否与该日志文件中的命令行相匹配。 如果两个命令行相匹配,AzCopy 则将恢复未完成的操作。 如果它们不匹配,AzCopy 会提示用户是选择覆盖该日志文件以启动新操作,还是取消当前操作。

如果想要为日志文件使用默认位置:

azcopy \
    --source /mnt/myfiles \
    --destination https://myaccount.blob.core.chinacloudapi.cn/mycontainer \
    --dest-key <key> \
    --resume

如果省略了选项 --resume,或者指定了选项 --resume 但未指定文件夹路径(如上所示),AzCopy 则会在默认位置中创建日志文件,默认位置为 ~\Microsoft\Azure\AzCopy。 如果日志文件已存在,AzCopy 则将继续根据日志文件恢复操作。

如果想要为日志文件指定自定义位置:

azcopy \
    --source /mnt/myfiles \
    --destination https://myaccount.blob.core.chinacloudapi.cn/mycontainer \
    --dest-key key \
    --resume "/mnt/myjournal"

如果日志文件尚不存在,此示例将创建日志文件。 如果它已存在,AzCopy 则根据该日志文件恢复操作。

如果希望恢复 AzCopy 操作,请重复相同的命令。 然后 Linux 上的 AzCopy 会提示进行确认:

Incomplete operation with same command line detected at the journal directory "/home/myaccount/Microsoft/Azure/AzCopy", do you want to resume the operation? Choose Yes to resume, choose No to overwrite the journal to start a new operation. (Yes/No)

输出详细日志

azcopy \
    --source /mnt/myfiles \
    --destination https://myaccount.blob.core.chinacloudapi.cn/mycontainer \
    --dest-key <key> \
    --verbose

指定要启动的并发操作的数量

选项 --parallel-level 指定并发复制操作的数量。 默认情况下,AzCopy 会启动一定数量的并发操作以提高数据传输吞吐量。 并发操作的数量是所拥有处理器数量的 8 倍。 如果正在低带宽网络中运行 AzCopy,则可为 --parallel-level 指定较低的数量以避免由于资源争用所导致的故障。

Tip

若要查看 AzCopy 参数的完整列表,请查看“azcopy --help”菜单。

已知问题和最佳做法

错误: 系统中未找到 .NET Core。

如果遇到指出系统中未安装 .NET Core 的错误,.NET Core 二进制文件 dotnet 的 PATH 可能丢失。

为了解决此问题,请在系统中查找 .NET Core 二进制文件:

sudo find / -name dotnet

这会返回 dotnet 二进制文件的路径。

/opt/rh/rh-dotnetcore11/root/usr/bin/dotnet
/opt/rh/rh-dotnetcore11/root/usr/lib64/dotnetcore/dotnet
/opt/rh/rh-dotnetcore11/root/usr/lib64/dotnetcore/shared/Microsoft.NETCore.App/1.1.2/dotnet

现在将此路径添加到 PATH 变量中。 对于 sudo,请编辑 secure_path,使其中包含 dotnet 二进制文件的路径:

sudo visudo
### Append the path found in the preceding example to 'secure_path' variable

在此示例中,secure_path 变量读取为:

secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/opt/rh/rh-dotnetcore11/root/usr/bin/

对于当前用户,请编辑 .bash_profile/.profile,使 dotnet 二进制文件的路径包含在 PATH 变量中

vi ~/.bash_profile
### Append the path found in the preceding example to 'PATH' variable

验证 .NET Core 现在是否位于 PATH 中:

which dotnet
sudo which dotnet

安装 AzCopy 时出错

如果遇到 AzCopy 安装问题,可尝试使用提取的 azcopy 文件夹中的 bash 脚本运行 AzCopy。

cd azcopy
./azcopy

限制复制数据时的并发写入

在使用 AzCopy 复制 blob 或文件时,请记住,在复制数据时其他应用程序可能正在修改该数据。 如果可能,请确保要复制的数据在复制操作期间不会被修改。 例如,当复制与 Azure 虚拟机关联的 VHD 时,请确保当前没有其他应用程序正在向该 VHD 进行写入。 执行此操作的一个好方法是租用要复制的资源。 另外,还可以先创建 VHD 的快照,然后复制该快照。

如果在复制 blob 或文件时无法阻止其他应用程序向其进行写入,请记住,在作业完成时,复制的资源可能不再与源资源完全相同。

在一台计算机上运行一个 AzCopy 实例。

AzCopy 旨在最大程度上利用计算机资源来加快数据传输,如果需要更多的并发操作,我们建议在一台计算机上只运行一个 AzCopy 实例并指定选项 --parallel-level 。 有关详细信息,请在命令行中键入 AzCopy --help parallel-level

后续步骤

有关 Azure 存储和 AzCopy 的更多信息,请参阅以下资源:

Azure 存储文档:

Azure 存储博客文章: