A-A+

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

2009年06月09日 编程开发 暂无评论 阅读 1 次

-->来自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)

标签:

给我留言

Copyright © 浩然东方 保留所有权利.   Theme  Ality 07032740

用户登录