为什么Ubuntu的源代码与原始代码不同?

当我做:
wget ftp://ftp.openbsd.com/pub/OpenBSD/OpenSSH/portable/openssh-5.8p1.tar.gz
wget ftp://ftp.openbsd.com/pub/OpenBSD/OpenSSH/portable/openssh-5.8p1.tar.gz.asc
gpg openssh-5.8p1.tar.gz.asc 
tar -zxvf openssh-5.8p1.tar.gz
mv openssh-5.8p1 openssh-5.8p1_downloaded
apt-get source openssh-server
diff -r openssh-5.8p1 openssh-5.8p1_downloaded/ | wc -l

我得到了很多不同之处(wc -l 返回3000行)。为什么会这样呢?

你能贴出diff命令的大约20行输出吗?也许问题很明显。 - Axel
你是在问关于OpenSSH的问题,还是只是一个普通的问题?我的意思是,问题应该是“为什么Ubuntu修补OpenSSH?”还是只是“为什么Ubuntu修补东西?”而OpenSSH只是其中一个例子(众多例子之一)。 - Javier Rivera
1个回答

Ubuntu开发人员负责管理软件包并将应用程序导入Ubuntu仓库,他们有权修改这些应用程序。由于几乎所有软件都是自由许可的,他们被允许这样做。他们并不试图掩盖这一点,这些更改对任何人都是可见的。事实上,他们甚至会更改软件包的版本以表明它与原始发布不同。你执行的apt-get source命令下载了openssh-server的版本为5.8p1-7ubuntu1。请注意后缀。(你可以使用任何软件包管理器来检查版本)。方案orig_version-XubuntuY在所有软件包中非常常见。X数字表示Debian中的修订号,而Y表示Ubuntu中的修订号。
也许你已经知道这一点,但作为给可能阅读这个答案的每个人的附注:大多数Ubuntu软件包都是从Debian仓库复制过来的 - 所以如果Debian开发人员发布了5.8p1版本七次,并在每次发布时包含了他们的更改,而这是Ubuntu开发人员第一次发布带有他们更改的版本,那么最终的版本号将是5.8p1-7ubuntu1。
为什么他们要想要或需要包含自己的更改,如果上游版本已经足够好了?
上游软件包是为广大用户提供的。然而,Ubuntu和其他发行版一样,有许多特定的更改,例如稍微不同的组织文件系统。在这种情况下,任何使用这些在Ubuntu中独有改变的系统架构部分的应用程序都需要适应Ubuntu。
一个很好的例子是大多数应用程序都准备好可以与Apport一起工作 - 这是一款仅在Ubuntu中使用的崩溃检测和错误报告工具。
在许多情况下(尽管不适用于openssh-server),这些更改是为了确保正确的桌面集成。并不是很多应用程序意识到Unity,因为它在其他发行版中并不常见。这意味着如果应用程序应该与指示器、Dash或其他内容集成,Ubuntu开发人员必须实现此功能,并将带有他们的更改的应用程序发布到存储库中。
所有发布后的错误修复都作为本地(Ubuntu范围内)对源代码的更改发布。应用程序在Ubuntu的单个版本中从不更新到较新的上游版本。这意味着如果你的Oneiric版本是带有openssh-server 5.8p1的,它将不会更新到5.9p1 - 你需要等待Precise版本,或者自己获取。然而,Ubuntu提供修复关键错误和安全问题的更新。这些修复必须应用于适当的Ubuntu系列中的版本 - 在你的情况下是Oneiric,并作为对5.8p1版本所做更改的发布。
有时候应用程序开发者的质量要求低于Ubuntu的要求。不时地,Ubuntu开发人员在将应用程序上传到存储库之前修复了一个错误。
还有一种情况是增加修订号而没有引入任何更改。这种情况发生在应用程序需要重新构建,因为它依赖的库发生了重大变化或有新版本。然后修订号只是增加以提高软件包版本。
您可以在以下两个地方获取有关变更的更多信息: 在那里,你可以找到你感兴趣的软件包,选择你感兴趣的版本,甚至可以下载Debian源代码包来手动阅读所有.patch文件,这些文件是由Ubuntu开发人员提供并应用于构建Ubuntu软件包时的原始源代码。
此外,请注意这些更改总是在软件包的changelog中简要解释(可在这些网站上和使用大多数计算机上的软件包管理器查看 - 但这里有链接到你的openssh-server - 至少阅读一下以了解随着补丁的包含而版本号如何变化)。
希望你能明白!