如何从源代码构建我安装的所有软件包?

我了解到像Gentoo这样的基于源代码的Linux发行版与像Ubuntu这样的预构建发行版相比,可以在性能上有显著提升,因为它们通过针对特定系统进行优化来从源代码安装。那么,是否有可能从源代码构建Ubuntu以获得同样的好处呢?

3安装Gentoo吧,不要用Ubuntu。说真的,为什么要使用一个在源码依赖管理方面完全失败的发行版,而不是一个在这方面非常出色的发行版呢? - mathepic
7我很好奇看到源代码和二进制代码之间的基准测试,确切地使用相同的堆栈版本和配置。比较通常是一个Ubuntu发行版(带有其默认设置)与最新的可能Gentoo发行版的对比,后者采用特殊的文件系统和奇特的应用程序默认设置。Ubuntu的默认设置大多非常合理,这也是它性能优越的原因,这也是为什么大部分直接的比较将Ubuntu置于Gentoo之前。 - Oli
1一个很好的坏比较的例子是《Linux Magazine》上的这篇文章(阅读需要免费注册),他们使用了不同的内核、不同的Nvidia驱动程序、不同的X版本和不同的桌面环境。你也可以把两个不同版本的Ubuntu进行比较,它们会展示类似的差异程度。 - Oli
1@Oli 我怀疑Ubuntu能否在性能上超过Gentoo,即使没有统计数据,仅凭源代码发行版的优化特性。话虽如此,两者之间的差异本身是不可预测的。 - mathepic
4性能提升是针对什么的?网络吞吐量、磁盘速度、进程切换、纯数学计算、三维图形、启动时间? - user unknown
1我只会建议编译那些需要大规模CPU性能的软件(比如视频编码),并且被用户广泛使用,并从CPU优化中受益,例如FMA3或AVX2。 - keiki
3个回答

从源代码构建Ubuntu以获得相同的好处是否可能?

如果您拥有相当新的硬件组件,我不确定其好处,但对于问题中的“从源代码构建Ubuntu”部分,答案是肯定的,您不仅可以从源代码构建喜爱的应用程序,还可以构建整个操作系统。

以下是方法:

您需要安装apt-build。它是一个类似于apt-get的命令行工具,但是apt-build不仅下载和安装二进制软件包,而且还会下载软件包的源代码,编译并将其安装到您的系统中。

在安装后,使用

sudo apt-get install apt-build

你将被要求选择一个优化级别(中等水平即可),是否要为APT创建一个apt-build仓库(是),以及有关处理器架构的问题(我的英特尔i7被认为是core2)。当然,所有选项都可以通过这种方式重新配置:
dpkg-reconfigure apt-build

以上命令为gcc编译器和make构建工具提供了两个额外的选项。其描述可以在系统手册中找到:man gcc 和 man make。

要查看手册和可用命令选项,请访问

man apt-build

但最有用的是:

  • apt-build update - 更新存储库列表(类似于apt-get update)
  • apt-build upgrade - 更新操作系统(类似于apt-get upgrade)
  • apt-build install program - 安装应用程序(类似于apt-get install)
  • apt-build world - 针对高级用户,重新编译整个系统!

例如:

假设您想要编译/安装Gedit。而不是使用apt-get install,您只需执行

sudo apt-build install gedit

Apt-build利用包含在/etc/apt/sources.list文件中的deb-src条目,因此编译和安装过程是完全自动化的(类似于Gentoo中的emerge)。 Apt-build下载主应用程序及其依赖项的源代码,将它们编译,创建一个deb包,并最终安装该包。
apt-build世界的一些注意事项。
在我看来,除非你有24个或更多小时可用,否则不要尝试!
如果您有这样的时间,请先删除/禁用/卸载任何第三方应用程序(最好在Ubuntu的新安装中执行),然后执行以下操作:
sudo su
dpkg --get-selections | awk '{if ($2 == "install") print $1}'> /etc/apt/apt-build.list
exit

以上命令将把您的系统软件包完整列表复制到apt-build.list文件中,以便可以从源代码进行编译。 打开该文件。
sudo gedit /etc/apt/apt-build.list

删除任何GCC/G++条目
然后你可以执行:
sudo apt-build world

我建议添加两个选项——--yes和--force-yes——以使重建过程完全自动化。

13相比于“为什么要构建?”的回答,我更喜欢直接明确的回答。我希望能够阅读到更详细的意见(即使是主观的),关于使用apt-build可能(或可能不)带来的好处。 - enzotib
1目前对于这个答案来说已经有+17了。但是有人成功做到过吗? - keiki
1@otakun85 我在Ubuntu上成功地使用apt-build编译了一些软件包(记不清是哪个版本,可能是12.04、12.10或者13.04之一),我尝试过apt-build world,但结果一团糟。apt-build的man页面最后写着“BUGS Many.”,所以要有心理准备会遇到麻烦。 - Phizes
我发现与其使用 apt-build world,最好是下载一本《Linux from Scratch》的书籍,并对其中列出的每个软件包进行 apt-build。这样可以指定正确的顺序等。例如,我不确定 apt-build world 是否知道它应首先重新编译 binutils,然后是 gcc,再次是 binutils,再次是 gcc,然后是编程语言,gzip 等。看起来它只是按字母顺序编译所有内容。 - Serhyi Vynohradov
1@SerhyiVynohradov: 这没关系。LFS这样做是为了避免在主机系统中留下任何对库的依赖,但在这里,它只是用编译版本替换一切;它们仍然会在相同的位置,并且具有相同的ABI等。 - Nick Matteo

你可以在这种话题上引发一场激烈的争论,但让我们看看现实生活。
你的操作系统的速度很大程度上取决于你运行它的硬件,这是主要因素。
我经常更换发行版,但大部分时间都使用Arch,但是Arch比Ubuntu快吗?不是的。
在Ubuntu 10.10上使用compiz的Gnome占用约300MB内存,在Arch上只占用200MB内存,我有4GB内存,我感觉不到差别,但如果你将带有gnome的Ubuntu与带有awesome的Arch进行比较,响应速度和资源使用情况会有显著提升(300MB对比50MB),但这只在你选择一个适合上网本的发行版时才重要。
所以,如果你有一台快速的台式机,并且不想花时间调整系统,就使用Ubuntu吧,但如果你有一台上网本,考虑在Arch上使用轻量级窗口管理器 :)

嗯,在某个时候,你可能会遇到这样的情况:你拥有最新的硬件,但仍然需要执行长时间的操作。而且,与其设置一堆服务器来分配负载,你不介意花点时间去调整,以获得额外的20%提升。我从未使用过Arch,但我尝试过Gentoo。我发现很多时候并不存在所谓的“更快的发行版”。相反,有的只是“软件更少的发行版”。你可能拥有一个基本系统,运行速度很快,但不安全。当你安装其他软件包时,它的速度就变得和Ubuntu + apt-build一样了。 - Serhyi Vynohradov

Apt-build 不仅对性能有用,您还可以构建专门针对特定硬件的定制分发镜像和存储库,以便为您的企业进行大规模安装。这意味着优化的二进制分发,如果您知道所有硬件都是相同的。这样,只有一台计算机会做所有编译工作,其余的则使用重新制作的 ISO 进行升级。它不完全是为轻量级或编码而设计的。自定义安装程序 ISO 还允许您在灾难发生后无法恢复系统的情况下重新安装而无需重新编译。