CRC32C 和安装 crcmod

概览

Cloud Storage 提供循环冗余校验 (CRC) 标头,以允许客户端验证对象内容的完整性。对于非复合对象,Cloud Storage 还提供了 MD5 标头以允许客户端验证对象的完整性。但对于复合对象,仅提供了 CRC。gsutil 会自动对所有上传和下载执行完整性检查。此外,您还可以使用 gsutil hash 命令对任何本地文件计算 CRC。

Cloud Storage 使用的 CRC 变体称为 CRC32C (Castagnoli),这在标准 Python 发行版中不提供。gsutil 使用的 CRC32C 实现由名为 crcmod 的第三方 Python 模块提供。

crcmod 模块包含 CRC32C 的纯 Python 实现,但使用它会导致性能非常差。Python C 扩展程序也由 crcmod 提供,crcmod 需要编译为二进制文件模块才能供使用。gsutil 附带有预编译的适用于 macOS 的 crcmod C 扩展程序;对于其他平台,请参阅下面的安装说明。

在每个复制操作结束时,gsutil cpgsutil rsync 命令会验证源文件/对象的校验和是否与目标文件/对象的校验和匹配。如果校验和不匹配,gsutil 将删除无效副本并输出一条警告消息。这种情况很少发生,但如果确实发生,请联系 gs-team@google.com

配置

如需确定 Python 环境中是否提供编译版 crcmod,您可以检查 gsutil version 命令的输出中是否存在“compiled crcmod”条目:

$ gsutil version -l
...
compiled crcmod: True
...

如果您的 crcmod 库编译为原生二进制文件,则此值将为 True。如果使用纯 Python 版本,则此值将为 False。

如需控制 gsutil 的行为以响应 crcmod 的状态,您可以设置“check_hashes”配置变量。如需详细了解此变量,请参阅 boto 配置文件中的相关注释。如果您的配置文件中不存在“check_hashes”,请重新运行 gsutil config 以重新生成该文件。

安装

以下安装说明假定:

  • 您已安装 pip。如需详细了解如何安装 pip,请参阅 pip 安装说明
  • 您可以在 PATH 环境变量中找到安装的 pip。如果找不到,您可能需要将以下命令中的 pip3 替换为可执行文件的完整路径。
  • 您安装的是要与系统安装的 Python 结合使用的 crcmod 软件包,因此使用 sudo 命令。如果为其他 Python 环境(例如,在 virtualenv 中)安装 crcmod,应忽略以下命令中的 sudo
  • 您通过 gsutil 使用 Python 3 版本。通过运行 gsutil version -l 并查找 python version: 2.x.xpython version: 3.x.x 行,您可以确定 gsutil 使用的 Python 版本。

CentOS、RHEL、Fedora

如需编译和安装 crcmod,请运行以下命令:

yum install gcc python3-devel python3-setuptools redhat-rpm-config
sudo pip3 uninstall crcmod
sudo pip3 install --no-cache-dir -U crcmod

Debian 和 Ubuntu

如需编译和安装 crcmod,请运行以下命令:

sudo apt-get install gcc python3-dev python3-setuptools
sudo pip3 uninstall crcmod
sudo pip3 install --no-cache-dir -U crcmod

企业版 SUSE

如需编译和安装 crcmod,请运行以下命令:

sudo zypper install gcc python3-devel
sudo pip3 uninstall crcmod
sudo pip3 install --no-cache-dir -U crcmod

macOS

gsutil 分发了适用于 macOS 的预编译版 crcmod,因此您无需自行编译和安装该版本。如果由于某种原因未检测到预编译版本,请告知 Cloud Storage 团队(参阅 gsutil help support)。

如需在 macOS 上手动编译,您需要先安装 XCode,然后运行以下命令:

pip3 install -U crcmod

Windows

安装程序适用于以下网址中的 Python Package Index (PyPi) 提供的编译版 crcmod:

https://pypi.python.org/pypi/crcmod/1.7

MSI 安装程序适用于 32 位版本的 Python 2.7。请务必安装到 32 位 Python 目录。如果您使用的是 64 位 Python,则它不适用于 32 位 crcmod,而是需要安装 32 位 Python 才能使用 crcmod。

在某些情况下,安装程序错误地安装到 <python_dir>\Lib\site-packages\crcmod

手动将 crcmod 目录复制到正确的位置应该可以解决问题。