在安装脚本上设置可执行标志是否会导致 CRC 校验失败?

在安装脚本上设置可执行标志是否会导致 CRC 校验失败?

最近,我在我的 Ubuntu 机器上安装了适用于 Linux 的 VMWare Workstation,在安装过程中我遇到了一个奇怪的问题。安装程序本身是某种与 makefile 捆绑在一起的存档。此 makefile 安装所有需要的组件,并根据日志判断编译一些模块并检查复制文件的 CRC。

该安装程序应按如下方式运行:

sudo sh ./VMware-Workstation-Full-9.0.1-894247.x86_64.bundle

但我第一次是用另一种方法做的:

chmod uga+x VMware-Workstation-Full-9.0.1-894247.x86_64.bundle
sudo ./VMware-Workstation-Full-9.0.1-894247.x86_64.bundle

之后安装失败,并显示以下消息:

[2012-12-06 15:07:18,348] [vmware-tools-windows 9.2.2] Failed to copy file from windows.iso to /usr/lib/vmware/isoimages/windows.iso
Traceback (most recent call last):
  File "/tmp/vmis.KNkJ7S/install/vmware-installer/vmis/core/component.py", line 193, in doit
    data = fileobj.read(10485760) # Read 10 MB at once.  Not too large to fill
  File "/tmp/vmis.KNkJ7S/install/vmware-installer/python/lib/gzip.py", line 227, in read
    self._read(readsize)
  File "/tmp/vmis.KNkJ7S/install/vmware-installer/python/lib/gzip.py", line 292, in _read
    self._read_eof()
  File "/tmp/vmis.KNkJ7S/install/vmware-installer/python/lib/gzip.py", line 311, in _read_eof
    raise IOError, "CRC check failed"
IOError: CRC check failed
[2012-12-06 15:07:18,365] [vmware-tools-windows 9.2.2] Installation failed, rolling back installation.

我以为这可能是因为下载的文件已损坏,因为它使用 MD5 和 SHA1 的校验和与下载站点上提供的不同。删除文件后,重新下载并按应有的方式运行,一切正常。

所以我的问题纯粹是出于好奇。可能是因为在文件上设置了可执行标志导致 CRC 校验失败?

答案1

不,当你设置可执行标志时仅限文件索引节点,也就是存储信息的地方,变化

文件内容保持不变,校验和也保持不变。

你说你的文件的 MD5/SHA1 校验和和网站上的不一样,所以是的,下载的文件已损坏该文件可能仅被部分下载,这可以解释为什么它最初可以工作,但在解压时却崩溃了。

(您可以通过一个简单的实验自己检查一下:

# ls -l /bin/gawk
-rwxr-xr-x 1 root root 267648 Aug 19  2011 /bin/gawk
# sha1sum /bin/gawk
d8fcc0aae41635dedb449523989af47f290fe22a  /bin/gawk

模式为 755,校验和为d8fcc0aae41635dedb449523989af47f290fe22a

# stat /bin/gawk
(...)
Change: 2012-11-07 17:24:49.000000000 +0100

stat显示Change该 inode 最后一次被更改是在一个月前。

现在我改变文件模式:

# date
Thu Dec  6 16:07:48 CET 2012
# chmod 644 /bin/gawk
# sha1sum /bin/gawk
d8fcc0aae41635dedb449523989af47f290fe22a  /bin/gawk
# stat /bin/gawk
(...)
Change: 2012-12-06 16:07:48.000000000 +0100

inode 已改变(与date的输出相比),但校验和没有改变。)

相关内容