2012年(6)
分类: LINUX
2012-04-16 08:48:46
Gentoo Linux 的软件安装管理Portage和emerge使用
作者:李群 weibo.com/li9un
初始发布地址: hi.baidu.com/li_qun
最近使用Gentoo Linux,需要安装、设置一些软件,查了些资料,这里记录一下备忘。
Portage树是ebuilds文件的集合,这些文件包含了Portage管理工具维护软件(安装,搜索,查询, ...)时所需要的所有信息,并被默认的放置在/usr/portage目录中。
每当您要求Portage对系统中的软件包执行一些操作的时候,它会以系统中的ebuilds文件作为基础。因此您最好定期更新系统Portage树中的ebuild文件,这样Portage才知道新加入了哪些软件,哪些软件发布了安全更新,等等。
配置信息存放在 /etc/make.globals 中,需需修改时,请编辑/etc/make.conf。
开始选择最近的镜像,在/etc/make.conf中定义SYNC变量和GENTOO_MIRRORS变量,
可以在 发现Gentoo Mirror的列表。
rsync可以设置成mirror对应的
Li_qun~ # emerge mirrorselect
Li_qun ~ # mirrorselect -i -o >> /etc/make.conf
Li_qun ~ # mirrorselect -i -r -o >> /etc/make.conf
(通常,一个较好的值为处理器数加一)
Li_qun ~ # echo 'MAKEOPTS="-j2"' >> /etc/make.conf
查看当前使用的USE标记并启用或禁用一些
Li_qun ~ # emerge -vpe world
(Portage列出软件包和它们的USE标记。作为例子,让我们禁用ipv6和fortran,并启用unicode)
Li_qun ~ # echo 'USE="nptl nptlonly -ipv6 -fortran unicode"' >> /etc/make.conf
新版本的glibc使用/etc/locale.gen来定义语言环境。
Li_qun ~ # cd /etc
Li_qun etc # nano -w locale.gen
Li_qun etc # locale-gen
修改/etc/make.conf中的CFLAGS变量来优化编码,以满足你的特定需要。请注意极少需要一长串的标记列表,那样甚至可能导致系统崩溃。建议通过march选项指定处理器类型并赋上-O2 -pipe。添加FEATURES="ccache"用来缓存编译过程的中间文件,节省下次编译时间。
只重编译那些因你应用了新的USE标记或受此影响而需要升级的软件包,也要花费不少时间。可能还必须卸载会阻止你升级的软件包。在emerge -vpuD --newuse world的输出中寻找“[blocks B ]”,用emerge -C卸载它们。
(安装ccache)
Li_qun etc # emerge ccache
(请注意转到~x86会导致很多软件包要升级)
Li_qun etc # emerge -vpuD --newuse world
(好好看一看软件包列表和它们的USE标记,有阻止的包就先卸载,然后启动漫长的过程)
Li_qun etc # time emerge -vuD --newuse world
((重)编译了79个软件包)
real 180m13.276suser 121m22.905ssys 36m31.472s
(重编译libtool以避免一些潜在的问题)
Li_qun etc # emerge --oneshot libtool
(更新配置文件,确保不要让dispatch-conf更新你配置好的文件)
Li_qun etc # dispatch-conf
(如果升级了perl,应该执行perl-cleaner脚本)
Li_qun etc # time perl-cleaner all
real 1m6.495suser 0m42.699ssys 0m10.641s
(如果升级了python的主要软件包,应该执行python-updater脚本)
Li_qun etc # python-updater
# emerge --sync
如果占空间太大(缺省800M左右),想限制sync回来的portage树,
在/etc/make.conf中指定包含排除软件包条目的文件
PORTAGE_RSYNC_EXTRA_OPTS="--exclude-from=/etc/portage/rsync_excludes"
在/etc/portage/rsync_excludes中设定排除所有游戏
games-*/*
X11*/*
$ emerge --search xxx
通过软件的描述来查找相应的软件
$ emerge --searchdesc pdf
安装软件xxx 文档通常会存放在/usr/share/doc目录下以软件包名命名的子目录中
# emerge xxx
# emerge --pretend xxx
下载xxx的源代码包,源代码包默认保存在/usr/portage/distfiles目录下。
# emerge --fetchonly xxx
通过emerge -vp <软件包名称>命令来检查是否存在doc USE标记。
可以通过equery工具来列出此软件安装后生成的所有文件,这个工具来自于app-portage/gentoolkit包。
(或者使用equery来定位您感兴趣的文件:)
# equery files alsa-lib | less
使用emerge --unmerge命令。命令执行完成后,除了那些在安装软件包后您修改过的配置文件,Portage将会移除此软件包安装到您系统中的所有文件。Portage将不会检查您要删除的包是否仍被其他的包依赖。
之前那些为了满足其依赖关系而自动被一并安装的软件包将会被保留。如果想让Portage找出那些现在可以移除的相关软件包,可以使用emerge的--depclean功能。
当您的Portage树更新后,您可以用emerge --update world命令来更新系统。
# emerge --update --ask world
更新整个系统
# emerge --update --deep world
每当您改变了系统中任何的USE标记后,您可能需要加入--newuse选项。这样Portage将会检查这个USE标记的变动是否导致需要安装新的软件包或者将现有的包重新编译。
# emerge --update --deep --newuse world
由于软件包间的依赖关系是动态的,您首先需要充分地更新您的整个系统,包括更改USE标记设定而导致的变化。在这之后您可以运行emerge --depclean来移除那些完全没有被其他包依赖的软件包(“orphaned dependencies”)。移除之后你需要重新编译那些曾经与刚刚移除的这些包动态连接过的应用程序,因为实际上这些程序不需要那些包。
# emerge --update --deep --newuse world
# emerge --depclean
# revdep-rebuild
当前可用的全局USE标记列表可以在网上或者本机的/usr/portage/profiles/use.desc文件里找到。
当前可用的局部USE标记列表可以在本机的/usr/portage/profiles/use.local.desc 文件里找到。
默认设置在make.defaults文件──你的profile的一部分──里声明。
为单个包声明USE标记
如果你想要为一个(或者几个)程序而不是系统范围内声明一个USE标记,你需要创建/etc/portage目录(如果没有这个目录的话),然后编辑/etc/portage/package.use文件。通常这是一个文件,不过它也可以是一个目录
/etc/portage/package.use示例
dev-db/mysql berkdb
声明临时USE标记
当你重新emerge或者升级这个程序的时候(不管是单独地还是作为系统升级的一部分),你的修改都会丢失!
将USE作为一个环境变量使用
# USE="-java" emerge seamonkey
USE设定的优先级顺序是(由低到高):
make.defaults里面的USE默认设定
用户在/etc/make.conf里面的USE设定
用户在/etc/portage/package.use里面的USE设定
作为环境变量的USE设定
应用新的USE标记
# emerge --update --deep --newuse world #重新构建你的系统
# emerge -p --depclean #删除不需要的包
运行revdep-rebuild来重新构建那些动态链接到由可能已经删除的包提供的公共对象的程序。
# revdep-rebuild
查看使用的USE标记
# emerge --pretend --verbose seamonkey
可以自己建立一个“中心仓库”来存放预编译包。
在/etc/make.conf中设定PORTAGE_BINHOST参数
PORTAGE_BINHOST=""
当您需要安装预编译包的时候,在emerge命令后的--getbinpkg选项旁加入--usepkg选项。前者让emerge命令从预定的服务器上下载预编译包,后者让emerge首先试图安装预编译包,如果预编译包不存在,那么才下载并编译源码。
# emerge --usepkg --getbinpkg xxx