在 Linux 上使用 AzCopy v7 传输数据

AzCopy 是一个命令行实用程序,专用于使用旨在实现最佳性能的简单命令将数据复制到 Microsoft Azure Blob 和文件存储以及从这些位置复制数据。 可在文件系统和存储帐户之间或在存储帐户之间复制数据。

重要

本文介绍较旧版本的 AzCopy。 若要安装最新版本的 AzCopy,请参阅 AzCopy v10

注意

从 AzCopy 7.2 版本开始,.NET Core 依赖项随 AzCopy 包打包在一起。 如果使用的是 7.2 版或更高版本,则安装 .NET Core 不再是先决条件。

下载并安装 AzCopy

在 Linux 上安装

注意

可能需要安装此 .NET Core 先决条件文章中重点介绍的 .NET Core 2.1 依赖项,具体取决于你的发行版。

对于 RHEL 7 发行版,请安装 ICU 和 libunwind 依赖项:yum install -y libunwind icu

安装 AzCopy on Linux(v7.2 或更高版本)很简单,只需要提取一个 tar 包并运行安装脚本。

基于 RHEL 6 的发行版下载链接

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

所有其他 Linux 发行版下载链接

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

安装 AzCopy on Linux 后,可以删除提取的文件。 另外,如果你没有超级用户特权,也可以在提取的文件夹中使用 shell 脚本 azcopy 运行 azcopy

Ubuntu 上的替代安装

Ubuntu 14.04

添加 Microsoft Linux 产品存储库的 apt 源并安装 AzCopy:

sudo echo "deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-trusty-prod/ trusty main" > azure.list
sudo cp ./azure.list /etc/apt/sources.list.d/
sudo apt-key adv --keyserver packages.microsoft.com --recv-keys EB3E94ADBE1229CF
sudo apt-get update
sudo apt-get install azcopy

Ubuntu 16.04

添加 Microsoft Linux 产品存储库的 apt 源并安装 AzCopy:

echo "deb [arch=amd64] https://packages.microsoft.com/repos/microsoft-ubuntu-xenial-prod/ xenial main" > azure.list
sudo cp ./azure.list /etc/apt/sources.list.d/
sudo apt-key adv --keyserver packages.microsoft.com --recv-keys EB3E94ADBE1229CF
sudo apt-get update
sudo apt-get install azcopy

编写第一条 AzCopy 命令

AzCopy 命令的基本语法是:

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

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

Blob:下载

下载单个 blob

azcopy \
    --source https://myaccount.blob.core.windows.net/mycontainer/abc.txt \
    --destination /mnt/myfiles/abc.txt \
    --source-key <key> 

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

从次要区域下载单个 blob

azcopy \
    --source https://myaccount-secondary.blob.core.windows.net/mynewcontainer/abc.txt \
    --destination /mnt/myfiles/abc.txt \
    --source-key <key>

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

下载所有 blob

azcopy \
    --source https://myaccount.blob.core.windows.net/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.windows.net/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.windows.net/mycontainer \
    --destination "/mnt/myfiles" \
    --source-key <key> \
    --preserve-last-modified-time

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

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

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

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

Blob:上传

上传单个文件

azcopy \
    --source /mnt/myfiles/abc.txt \
    --destination https://myaccount.blob.core.windows.net/mycontainer/abc.txt \
    --dest-key <key>

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

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

azcopy \
    --source /mnt/myfiles/abc.txt \
    --destination https://myaccount.blob.core.windows.net/mycontainer/vd/abc.txt \
    --dest-key <key>

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

从 stdin 重定向

gzip myarchive.tar -c | azcopy \
    --destination https://myaccount.blob.core.windows.net/mycontainer/mydir/myarchive.tar.gz \
    --dest-key <key>

上传全部文件

azcopy \
    --source /mnt/myfiles \
    --destination https://myaccount.blob.core.windows.net/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.windows.net/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.windows.net/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.windows.net/myContainer/ \
    --dest-key <key> \
    --include "ab" \
    --set-content-type

自定义 MIME 内容类型映射

AzCopy 使用一个配置文件,其中包含文件扩展名到内容类型的映射。 可以自定义此映射,并根据需要添加新对。 此映射位于 /usr/lib/azcopy/AzCopyConfig.json

Blob:复制

在存储帐户内复制单个 blob

azcopy \
    --source https://myaccount.blob.core.windows.net/mycontainer1/abc.txt \
    --destination https://myaccount.blob.core.windows.net/mycontainer2/abc.txt \
    --source-key <key> \
    --dest-key <key>

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

跨存储帐户复制单个 blob

azcopy \
    --source https://sourceaccount.blob.core.windows.net/mycontainer1/abc.txt \
    --destination https://destaccount.blob.core.windows.net/mycontainer2/abc.txt \
    --source-key <key1> \
    --dest-key <key2>

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

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

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

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

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

azcopy \
    --source https://sourceaccount.blob.core.windows.net/mycontainer1/ \
    --destination https://destaccount.blob.core.windows.net/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.windows.net/myContainer/ \
    --destination https://myaccount2.blob.core.windows.net/myContainer/ \
    --source-key <key1> \
    --dest-key <key2> \
    --include "ab" \
    --sync-copy

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

文件:下载

下载单个文件

azcopy \
    --source https://myaccount.file.core.windows.net/myfileshare/myfolder1/abc.txt \
    --destination /mnt/myfiles/abc.txt \
    --source-key <key>

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

下载所有文件

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

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

文件:上传

上传单个文件

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

上传全部文件

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

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

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

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

文件:复制

跨文件共享复制

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

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

从文件共享复制到 blob

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

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

从 blob 复制到文件共享

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

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

同步复制文件

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

azcopy \
    --source https://myaccount1.file.core.windows.net/myfileshare1/ \
    --destination https://myaccount2.file.core.windows.net/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.windows.net/mycontainer --destination /mnt/myfiles --source-key <sourcekey> --recursive --exclude-older --exclude-newer

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

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

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

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

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

假设有一个名为 copyoperation 的配置文件,其中包含以下行: 可以在同一行或多行中指定

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

每个 AzCopy 参数:

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

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

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

指定共享访问签名 (SAS)

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

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

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

日志文件文件夹

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

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

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

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

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

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

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

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

若要恢复 AzCopy 操作,请重复相同的命令。 然后,AzCopy on Linux 会提示确认:

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.windows.net/mycontainer \
    --dest-key <key> \
    --verbose

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

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

提示

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

AzCopy 7.1 和更低版本的安装步骤

AzCopy on Linux(仅限 v7.1 和更低版本)需要 .NET Core 框架。 .NET Core 安装页上提供了安装说明。

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

sudo sh -c 'echo "deb [arch=amd64] https://apt-mo.trafficmanager.net/repos/dotnet-release/ yakkety main" > /etc/apt/sources.list.d/dotnetdev.list' 
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 417A0893
sudo apt-get update
sudo apt-get install dotnet-sdk-2.0.0

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

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

安装 AzCopy on Linux 后,可以删除提取的文件。 另外,如果你没有超级用户特权,也可以在提取的文件夹中使用 shell 脚本 azcopy 运行 azcopy

已知问题和最佳做法

安装 AzCopy 时出错

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

cd azcopy
./azcopy

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

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

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

运行多个 AzCopy 进程

如果你使用不同的日志文件夹,则可以在单个客户端上运行多个 AzCopy 进程。 不支持将单个日志文件夹用于多个 AzCopy 进程。

第 1 个进程:

azcopy \
    --source /mnt/myfiles1 \
    --destination https://myaccount.blob.core.windows.net/mycontainer/myfiles1 \
    --dest-key <key> \
    --resume "/mnt/myazcopyjournal1"

第 2 个进程:

azcopy \
    --source /mnt/myfiles2 \
    --destination https://myaccount.blob.core.windows.net/mycontainer/myfiles2 \
    --dest-key <key> \
    --resume "/mnt/myazcopyjournal2"

后续步骤

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

Azure 存储文档:

Azure 存储博客文章: