如何识别和替换损坏的文件在一个损坏的Ubuntu ISO中?

所以,这不是关于运行Ubuntu的问题,而是关于安装它的问题。
每次我尝试从任何来源下载Ubuntu ISO文件时,似乎都会出现损坏的情况。也就是说,MD5校验和从来都不正确。
Ubuntu ISO文件附带了一个列出ISO中所有文件及其相应MD5校验和的文件。
我想要做的是循环遍历这个文件,并将其与ISO中的文件进行比较,找出哪些文件是损坏的,希望能够从其他ISO文件中提取损坏的文件,以创建一个可用的安装程序。
但是,我不知道如何做到这一点,而且更糟糕的是,我必须在Windows 7上完成这个任务。
有人知道如何解决这个问题吗?

难道Jigdo(Debian首选方式)不应该能够做到这一点吗?它现在的主要目的是通过更新ISO中的软件包来进行ISO的增量更新。关于Debian ISO和Jigdo - gertvdijk
@gertvdijk 不适用于Ubuntu的桌面ISO文件,因为它们通常只包含一个文件(请参阅我的回答)。这就是为什么下载服务器上的桌面ISO文件没有关联的.jigdo文件的原因。备选CD和服务器CD ISO文件则有.jigdo文件。桌面ISO文件具有Ubiquity安装程序,该程序通过将Live CD系统写入磁盘然后对其进行更改以准备正常(已安装)使用。 - Eliah Kagan
@EliahKagan这很有道理。那么,在这种情况下,难道不应该有PAR奇偶校验块文件来修复完整的ISO吗? 这更有效,更容易,更普遍。 "Parchive最初是为解决在Usenet上可靠传输文件的问题而编写的,但现在通常用于保护任何类型的数据免受数据损坏、位腐败和意外或恶意损坏的影响。" - gertvdijk
1为什么PAR比zsync更好呢?即使PAR得到Ubuntu项目的官方支持(就像zsync一样),是否有明显的优势呢?关于jigdo:它适用于备选和服务器CD。它们使用debian-installer创建一个基本系统,进入chroot并安装软件包。因此,它们拥有所有位于软件包池中的.deb文件(桌面CD上只有很少的几个文件)。可以使用.jigdo(或其他方法)轻松组装它们。您可能希望针对服务器/备选发布一个基于jigdo的答案,说明如何仅下载损坏的文件。 - Eliah Kagan
1@EliahKagan 应该提到一下 - PAR 可以在离线状态下完成一些操作,例如 "你需要 3 个校验块来修复",输入它们,"好的,正在修复... 完成!"。Zsync 实际上需要一个完整的好副本(在这种情况下是远程的)。但是,原理是相同的。顺便说一句,我看到 Zsync 可以很好地处理 gzip 压缩的存档,但是对于 SquashFS 来说,这种智能是无用的,我猜测?不管怎样,对于 Ubuntu ISOs 来说,确实应该使用 zsync。 - gertvdijk
2个回答

其实,我知道哪个文件损坏了

试图将多个损坏的ISO镜像文件合并成一个完好的ISO镜像文件,并不是解决这个问题的好方法。原因如下。

几乎所有的数据都属于同一个文件,即casper/filesystem.squashfs

在Ubuntu桌面CD或DVD ISO镜像中是这样的。而在服务器CD镜像或备选CD镜像中,则是另外一回事。

Nautilus properties for filesystem.squashfs on an Ubuntu 12.10 i386 desktop CD

所以我现在可以告诉你,你下载的每个ISO文件中几乎肯定有一个文件是损坏的:所有这些ISO文件中的那个文件。当Ubuntu ISO文件损坏时,坏字节几乎总是在其中的某个位置。 filesystem.squashfs本身就是一个磁盘映像;它作为启动Live CD系统的一部分被挂载。你可以从ISO文件中提取它,然后提取它的内容,查看哪些文件损坏了,并替换这些损坏的文件。虽然你可以在Windows上挂载或提取squashfs文件系统,但你可能会发现这样做并不容易。而且这个映像是压缩的,所以不能保证包含ISO文件中的轻微损坏不会影响多个文件。
此外,如果你尝试多次下载ISO映像,而且它总是损坏的,那么你可以相当确定它不仅仅是轻微的损坏。如果你尝试用这种方式进行修复,可能需要替换数百甚至数千个文件。 相反,你应该使用更可靠的方法下载ISO映像。 方便的是,其中一个(zsync)与您所考虑的类似,不同之处在于它只会下载ISO文件中必要的部分,而不仅仅是其中包含的必要文件。

确保与正确的MD5哈希值进行比较

当您的MD5校验和错误时,尤其是在您重新下载文件后仍然错误时,首先要做的是确保将其与正确文件的MD5哈希值进行比较。

我猜想的是

  • 你有一个12.04 LTS镜像,但你正在使用12.04.1 LTS镜像的MD5哈希值
    (这是不同的文件),或者
  • 你有一个12.04.1 LTS镜像,但你正在使用12.04 LTS镜像的MD5哈希值,或者
  • 你有一个32位("i386")镜像,但你正在使用64位镜像的MD5哈希值,或者
  • 你有一个64位("amd64")镜像,但你正在使用32位镜像的MD5哈希值。

每个文件的MD5哈希值列表在这里。

一般来说,如果你的MD5哈希值错误,但对于多个下载是相同的,通常情况下

  • 你正在与错误的哈希值进行比较,或者
  • 服务器上的文件已损坏(如果是这种情况,请从其他镜像下载,并且如果愿意,请向ubuntu-website-content报告错误,以便解决问题),或者
  • 你正在使用代理或VPN缓存网络内容,并且它以某种方式缓存了一个损坏的副本(从另一个镜像下载也可以解决这个问题),或者
  • 你正在通过FTP下载,服务器或FTP客户端出现问题导致文件以文本模式而不是二进制模式传输(这会导致文件损坏,并且通常每次都以相同的方式损坏),或者
  • 你的连接被恶意第三方故意拦截和更改,他们有意提供给你错误的文件(尽管这种情况通常很少发生)。

你可以手动选择一个(不同的)下载镜像在本页面底部

如果你的ISO镜像确实损坏了,以下是一些获取良好文件的方法。

zsync

zsync(另请参见此处)是一个实用工具,可以通过仅下载您没有正确版本的部分来将部分正确的文件转换为完全正确的文件。它的主要应用是下载稍微更新的图像,例如从一个每夜构建到另一个。

zsync的工作原理如下:提供文件的人(例如Ubuntu项目)创建一个包含许多校验和的.zsync文件,这些校验和对应于文件的许多小部分,而不仅仅是整个文件的一个校验和。您开始时可能什么都没有,也可能有整个文件。

如果没有任何内容,将下载整个文件。如果只有部分文件(即与同名文件大小不同或具有任意数量的二进制差异的文件),它会确定需要下载哪些部分,并仅下载这些部分。如果已经有整个文件,它将不会下载任何内容。

对于网络连接非常不可靠的情况,zsync并不比使用Web浏览器从头开始下载整个文件更好,除非你愿意运行两次或更多次,这样后续的运行将纠正之前运行中的问题。对于除了最高错误率的互联网连接,对一个文件运行两次或偶尔三次的zsync应该足够。

但是你不必担心运行zsync多次。因为你已经——可以预期地——拥有大部分文件,所以这不应该成为问题。而且一如既往,如果zsync给出的内容损坏,你总是可以再次运行zsync来修复它。

获取Windows上的zsync

zsync传统上在类Unix系统上运行(实际上不包括Windows)。然而,最近已经创建了适用于Windows的原生zsync端口,所以你可能可以使用它。

zsync 是一个命令行程序,所以在Windows中你可以在命令提示符中运行它。(打开命令提示符的一种方法是在开始菜单的文本框中输入cmd.exe并按下Enter键。或者,在Windows XP及更早版本中,开始 > 运行 > cmd.exe。)

另一种方式:获取Cygwin上的zsync

如果你在Windows上使用zsync时遇到任何问题,你可以使用Cygwin版本。Cygwin为Windows提供了一个类Unix环境。它不允许运行编译后的可执行文件(例如,你不能使用来自Ubuntu软件包的zsync),但是使用从源代码编译的特殊版本的程序。在Cygwin中,将一个为类Unix操作系统编写的程序编译成可以在Windows上原生运行的形式要比直接编译要容易得多。

首先,从这里获取Cygwin的安装程序(setup.exe(或使用此直链)。
运行它,在第一个屏幕上点击下一步,然后选择从互联网安装并再次点击下一步
在接下来的两个屏幕上,将Cygwin和本地软件包目录放在任何你喜欢的位置(默认通常很好)。
选择您的互联网连接类型(直接连接通常很好),setup.exe将下载镜像列表。
选择任何一个镜像,它将下载可用软件包的列表。你可能会收到关于这个版本与以前版本不同的警告。这不是问题,除非你曾经在同一台机器上使用过以前的Cygwin版本。
现在你可以选择要安装的软件包。有一个文本框可以通过名称搜索软件包。在那里输入zsync(但是不要按下Enter - 如果这样做,就相当于点击了下一步)。会出现一个Net的条目。通过点击其左侧的+来展开它,你会看到它下面出现了Skip。这意味着如果您不做任何更改,setup.exe不会安装zsync
所以点击一次,那里写着Skip。现在它将为Cygwin安装最新可用的稳定版本zsync
再次点击下一步完成安装。Cygwin环境和zsync将被下载和安装。(如果要求安装作为依赖项所需的软件包,请继续执行)。
安装完成后,打开Cygwin shell。您可以在那里运行zsync

参考资料

请注意,在遇到Cygwin相关问题时,您可以在Cygwin邮件列表上发布问题(在阅读了相应的文档之后),但他们理所当然地不支持非官方的指导。cygwin有非常好的文档,就像其他集中式文档的项目一样(比如OpenBSD),他们期望寻求帮助的人已经阅读了文档,并且对文档非常熟悉,或者至少非常熟悉。

(因此,如果您在按照我的指示操作时遇到困难,最好的询问地点可能就是这里。)

zsync在Ubuntu上的使用

这并不适用于您的特定情况,但对于想在Ubuntu上使用zsync的人来说,只需安装zsync Install zsync即可。可以在软件中心进行安装,或者在终端窗口中运行以下命令(Ctrl+Alt+T):

sudo apt-get update && sudo apt-get install zsync

现在你可以从终端运行它。
相关:如何使用zsync更新ISO镜像? 使用zsync修复损坏的ISO镜像
在命令提示符中,进入包含损坏的ISO文件的目录。(你可以使用cd来改变目录,和Ubuntu一样。使用dir来列出目录的内容。)确保你拥有的文件与你获取时的文件名相同。
现在以以下方式之一运行zsync,具体取决于哪个Ubuntu ISO镜像:
  • 12.10,32位:

    zsync http://releases.ubuntu.com/quantal/ubuntu-12.10-desktop-i386.iso.zsync
    
  • 12.10,64位:

    zsync http://releases.ubuntu.com/quantal/ubuntu-12.10-desktop-amd64.iso.zsync
    
  • 12.04.1 LTS,32位:

    zsync http://releases.ubuntu.com/12.04.1/ubuntu-12.04.1-desktop-i386.iso.zsync
    
  • 12.04.1 LTS,64位:

    zsync http://releases.ubuntu.com/12.04.1/ubuntu-12.04.1-desktop-amd64.iso.zsync
    
  • 12.04 LTS(发布12.04.1更新之前),32位:

    zsync http://old-releases.ubuntu.com/releases/precise/ubuntu-12.04-desktop-i386.iso.zsync
    
  • 12.04 LTS(发布12.04.1更新之前),64位:

    zsync http://old-releases.ubuntu.com/releases/precise/ubuntu-12.04-desktop-amd64.iso.zsync
    
一旦您运行其中一个命令,zsync将自动将ISO文件修补到正确的版本,并且您可以开始使用。
使用zsync处理其他文件的一般语法是,您运行zsync,然后跟随服务器上与您所拥有的文件同名的.zsync文件的完整URL(当然,在末尾加上.zsync)。
如果有人想要为其他Ubuntu版本(或同一版本的其他ISO文件,例如针对Mac启动优化的版本或针对基于ARM的移动设备的版本)执行此操作,这里是.zsync文件的位置规则:

只需点击您的版本链接并向下滚动以查看完整的文件列表(或在页面上搜索.zsync)。然后复制URL并粘贴到zsync命令中。

在“升级”中使用

你还可以使用zsync来将一个ISO文件“升级”到另一个版本。如果你从一个Ubuntu版本升级到另一个版本,它可能需要重新下载大部分文件。但是,如果你只是升级小版本(比如从12.04 LTS升级到12.04.1 LTS),则不需要下载那么多文件。这是一种快速高效地获取新小版本的方法。
只需将旧文件重命名为与新文件相同的名称,然后按照上述步骤运行zsync即可。

BitTorrent

当你的网络连接存在较高错误率时,BitTorrent通常是可靠下载文件的最佳方式之一。文件被分成许多小块,每个小块都会被下载并检查以确定其是否真实有效。(这些小块可以从不同的计算机上下载,这就是BitTorrent避免对中央服务器造成负载压力,并且实现比基于Web的下载更快速度的原因。) Ubuntu 12.10和Ubuntu 12.04.1的种子文件可以在这里获取。 你需要一个BitTorrent“客户端”来下载它。如果你还没有自己喜欢的客户端,我推荐使用BitTornado(适用于Windows)。
下载完成后,我建议你尽量做一些种子,回馈社区(通过BitTorrent从像你这样的人那里获取资源)。不过,你不必立即执行此操作,可以随时返回BitTorrent程序并进行种子操作。甚至在下载未完成时退出程序,稍后再恢复也是可以的。
使用BitTorrent修复你拥有的文件 警告:本小节的研究程度不如其他部分。我最近没有测试过使用BitTorrent修复损坏文件的方法,也没有在Windows上或使用BitTornado进行测试。我认为这对你可能有效,但无法确定。 虽然BitTorrent并不像zsync那样常用于此目的,但BitTorrent协议本身同样具备这个能力。
一些BitTorrent程序可以这样做,而其他一些则会拒绝或者从头开始下载整个文件,除非你所使用的初始文件大小完全相同。(方便的是,一个损坏的下载通常与正确的文件大小相同。)
将旧的ISO镜像放在与.torrent文件相同的文件夹中。确保你的BitTorrent程序在那里下载种子文件。它会检查当前的文件是否完好。当它发现某些部分有问题时,它可以重新下载它们。
对于一些BitTorrent程序,你必须将文件导入为正在进行的种子文件,或者打开它以进行做种,才能实现这一点。

15这是一个相当史诗般的回答。 - Nanne
@Nanne 谢谢!顺便说一下,如果你碰巧对使用BitTorrent修复现有文件的更多细节了解,如果你愿意,请编辑此内容以提供更好的信息。 - Eliah Kagan
哇...这个回答比我预期的要好10倍!谢谢!我会试一试,并且要么接受,要么在问题中更新一些细节! - Hailwood

如果你想向ISO中添加和删除文件,可以使用ISO Master。它适用于Windows和Linux。