用apt-build重新编译安装ubuntu上所有软件包!

–>来自Yarrow’s Wastebasket
无论如何,你并不清楚Debian软件包管理系统的工作原理,并惊奇于居然能通过该 系统以完全正确地解决升级、依赖关系的方式来安装程序。安装一个程序的方法有:第一种是下载tarball包,解压缩,运行configure脚本,运行 make install。这对所有linux用户来说都是一件简单的事,但对于Debian包管理系统来说并不适合。第二种方法是使用 stow,用来更好地解决升级问题。但是stow并不能完成依赖管理。最终极的解决方法是使用apt-build来重新编译那些已经编译成deb包的软件。

Try it and you will adopt it
On the first day, it created the repository
要安装apt-build输入

sudo apt-get install apt-build

一旦安装好后,后续的安装脚本会询问你几个问题,build目录,调用gcc时使用的选项,处理器架构等等。这些信息将被写入到/etc/apt/apt-build.conf。如果在回答时出错了,你可以直接修改该文件来更正。这里是一个例子:

[yegle@yegle-laptop]~ $ cat /etc/apt/apt-build.confbuild-dir = /var/cache/apt-build/buildrepository-dir = /var/cache/apt-build/repository

Olevel = -O3

march = -march=pentium2

mcpu = -mcpu=pentium2options =

关于这里的build-dir和repository-dir变 量,请确保输入的目录所在的分区有较大的剩余空间。绝大多数(所有?)的软件包采用的是第二级的优化设置,因此如果你选择了第三级的优化,并且指出了你的 CPU属于哪一类架构,软件运行的效率将会有所提升。现在Gentoo fans会问我了: “flag在哪?” ;非常抱歉,没有。 Gentoo用户提到flag时,指的是与软件相关的库文件。在这里,修改软件包的依赖并不是一个简单用户讨论的问题。并且,如果你这么做了,可能会出现 在原始软件包中没有的错误。当出现这种错误时,不必向开发者汇报bug了,因为你并不是在使用官方的Debian包,而是你自己的。最后,你需要在 /etc/apt/sources.list中添加一行,如果没有的话:
deb-src ftp://debian_mirror/ [stable|testing|unstable] main contrib译者注:Ubuntu用户添加相关的deb-src源即可,如:

deb-src http://ubuntu.csie.ntu.edu.tw/ubuntu/

gutsy main restricted universe multiverse

deb-src http://ubuntu.csie.ntu.edu.tw/ubuntu/ gutsy-updates main restricted universe multiverse

deb-src

http://ubuntu.csie.ntu.edu.tw/ubuntu/ gutsy-backports main restricted universe multiverse

deb-src http://ubuntu.csie.ntu.edu.tw/ubuntu/ gutsy-security main restricted universe multiverse

运行apt-get update 更新本地的软件包索引文件。现在你已经准备好使用apt-build了。

And now, what do we do?
现在我将详细解说apt-build的主要命令。事实上,和apt-get很象,apt-build也有关键词,例如 update, upgrade, install, source, clean-build。

首先,update 命令;它会更新软件包索引文件(位于/var/lib/apt/lists中)。upgrade命令,更新所有软件包。下面用一个例子来解说install:

[yegle@yegle-laptop]~ $ sudo apt-build install memstat
—–> Installing build dependencies (for memstat) < —–Reading Package Lists… DoneBuilding Dependency Tree… Done

0 packages upgraded, 0 newly installed, 0 to remove and 0 not upgraded.—–> Downloading memstat source (memstat) < —–

Reading Package Lists… Done

Building Dependency Tree… Done

Need to get 22.4kB of source archives.

Get:1 ftp://127.0.0.1

1.0.4/main memstat 0.4-1 (dsc) [482B]

Get:2 ftp://127.0.0.1 1.0.4/main memstat 0.4-1 (tar) [21.9kB]

Fetched 22.4kB in 0s (322kB/s)

dpkg-source: extracting memstat in memstat-0.4

—–> Building memstat < —–

dpkg-genchanges: binary-only upload - not including any source code

dpkg-buildpackage: binary only upload (no source included)

—–> Moving packages to repository < —–

—–> Updating repository < —–

Using: -O3 -mcpu=pentium2 -march=pentium2

Reading Package Lists… Done

Building Dependency Tree… Done

Reading Package Lists… Done

Building Dependency Tree… Done

The following NEW packages will be installed:

memstat

我 们可以看到apt-build做了以下的工作:安装编译所需的软件包,下载源代码,然后编译并安装已编译的软件包。当你想自己重新打包时,dpkg- buildpackage并不能像apt-build一样自动安装所需依赖包,并且重新编译可能很难并可能需要一些我们没掌握的技巧。到目前为止,我们看 到了一个为了优化软件而重编译的简单的例子,但是如果我们想修改源代码,修改规则文件或者其他在debian/文件夹下的文件,apt-build将变得 很有用,并且将带你浏览一个软件包的核心。无论如何,我都推荐你看看这个 maintainer guide.

What else?
让我们看看这个命令: source。 它并没有什么神奇的地方,它会下载源代码,以及包含debian/目录(你将从中找到建立软件包所需的文件,rules,control, changelog files等等)的diff文件,将他们放在build文件夹,解压缩并最终用diff文件为它打上补丁。例子:

[yegle@yegle-laptop]~ $ sudo apt-build source ethereal—–> Downloading ethereal source (ethereal) < —–Reading Package Lists… Done

Building Dependency Tree… Done

Need to get 6170kB of source archives.Get:1 ftp://127.0.0.1 1.0.4/main ethereal 0.10.4-2.1 (dsc) [821B]

Get:2 ftp://127.0.0.1 1.0.4/main ethereal 0.10.4-2.1 (tar) [6154kB]

Get:3

ftp://127.0.0.1 1.0.4/main ethereal 0.10.4-2.1 (diff) [14.6kB]

Fetched 6170kB in 1s (3533kB/s)

dpkg-source: extracting ethereal in ethereal-0.10.4

我们注意到第三个文件的下载,软件包描述文件。现在你有软件源代码,以及建立软件包所需的文件和debian/文件夹,可以按照你自己的意愿修改来增加或减去选项。当修改完成时,你可以用apt-build install modified_package命令来安装这个软件。但是,在之前已经提到了,你在用你自己的软件包,你的修改可能导致新的错误。如果你不知道你自己在干嘛,修改软件包将是一件很危险的工作。

主要的选项已经提交,但是某些小选项依然能造成很大的不同,像:clean-build, 等价于clean之于apt-get的关系,它将清理build文件夹,而不是repository文件夹。你可以通 过remove来删除一个软件包,或者通过info 来获取软件包的相关信息。

最后,阅读一下apt-build的用户手册,里面包含了一些有趣的选项。但是我把最精彩的部分留在了最后。

With if we can redo the world, with apt-build too!
The devil is among us!
我将提到的最后一个命令是world,这将让很多喜爱我们红色伙伴(BSD的吉祥物,译者注)的人想起一些东西。事实上,在BSD系统上,你可以重新编译所有的ports,只需要切换目录到/usr/ports/并输入make world。这个概念被apt-build的作者采用,当你想重建世界时,这个命令会带给你想要的东西:

[yegle@yegle-laptop]~ $ sudo apt-build world-----> Rebuilding the world ! < -----You should read README.Debian first阅读这个著名的README似乎是强制的,我们从中得知我们需要建立一个软件包列表,其中包含我们想通过源码重建安装的软件包。列表中应该删除一些敏感的软件包如gcc,libc6以及其他关键的软件包。通过以下命令建立这个列表:

(先运行sudo su,译者注)root@yegle-laptop:~ # dpkg --get-selections | awk '{if ($2 == "install") print $1}' > /etc/apt/apt-build.list当列表建立好时,就可以通过apt-build world重编译及优化系统。

And now, this is dramatical !
你用apt-build来建立自己的软件包,但当你通过apt-get dist-upgrade升级后,你DIY的一个漂亮的软件包被一个官方版本给取代了,真可惜!你可以通过apt-build修改你自制软件的阻塞值来避免这种情况。要想通过apt-build来给你的自制软件包一个较高的优先级,你需要修改 /etc/apt/preferences。 例:

Package: * Pin: release o=apt-buildPin-Priority: 990这样,你就不用担心一次dist-upgrade会用官方包替换你自己的包了。运行apt-cache policy来检查软件源的优先级。输出的结果格式如下:

[yegle@yegle-laptop]~ $ apt-cache policyPackage Files:100 /var/lib/dpkg/status

release a=now

500 http://ftp2.de.debian.org sid/non-free Packages

release o=Debian,a=unstable,l=Debian,c=non-free origin ftp2.de.debian.org

500 http://ftp2.de.debian.org sid/contrib Packages

release o=Debian,a=unstable,l=Debian,c=contrib

origin ftp2.de.debian.org

500 http://ftp2.de.debian.org sid/main Packages

release o=Debian,a=unstable,l=Debian,c=main

origin ftp2.de.debian.org

990 file: apt-build/main Packages

release o=apt-build,a=apt-build,l=apt-build,c=main

Pinned Packages:

通过软件包阻塞值来解决这个问题很简洁。但是,谨慎对待后续的更新。事实上,如果你决定重建一个被很多软件依赖的lib,并且你不升级它,它将阻止很多软件的升级。因此,多关注你关心的软件的升级情况。

What time is it? 15 past midnight ?
该 是结束的时候了,我希望我已经给你使用apt-build——一个有用并且有趣的工具——的迫切感。我也想警告你,程序作者很小心地劝你不要重新编译 gcc及其他一些软件包。我和他都不对你的愚蠢负责。所以如果你把你的Debian给”杀死”了,别向我写信(除非你想逗我发笑)。注意apt- build并不会”发明”新的软件包,如果你想安装的软件并没有为Debian打包,apt-build并不能从Debian镜像下载源代码并编译他们 (你需要请求打包并等待这个请求被接受)。


Julien Danjou (english translation)

Ying Yuchen (simplified Chinese translation)



评论权限被关闭.



赞助商

文章索引模板

好友推荐链接

强力推荐链接

分类目录

   

统计信息

Translator

Chinese (Simplified) flagItalian flagKorean flagChinese (Traditional) flagPortuguese flagEnglish flagGerman flagFrench flagSpanish flagJapanese flagArabic flagRussian flagGreek flagDutch flagBulgarian flagCzech flag
Croatian flagDanish flagFinnish flagPolish flagSwedish flagNorwegian flag          

标签

专利战 世界 中国 为什么 介绍 使用 公司 分析 利用 功能 原谅我红尘颠倒 发现 天涯 如何 实现 工具 应该 慕容雪村 技术 插件 搜索引擎 支持 数据库 文件 方式 时间 服务器 用户 简单 管理 系统 网站 美国 谁的心不曾柔软 进行 部分 问题 AJAX Google LAN Linux MySQL PHP plugin WordPress

热门浏览