LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 4361|回复: 19

翻译:处理被屏蔽(masked)的包

[复制链接]
发表于 2007-7-13 03:56:47 | 显示全部楼层 |阅读模式
原文是英文wiki里Dealing with masked packages那篇
http://gentoo-wiki.com/TIP_Dealing_with_masked_packages
感觉这篇很重要,在wiki里做为TIP类,自然表示可以带来很多方便,特别是后面那几个脚本
早就想翻译这篇了, 一直没动手,眼看下周就要开学了,要忙开学的事情。
所以今天赶紧把它译了出来 里面有一些专有词汇 如有问题请大家指正

-----------------------------------------------------------------------------------------------------------------
相关连的那篇也翻译了: Package.keywords的小技巧
原文 http://gentoo-wiki.com/TIP_package.keywords

同步的中文wiki http://zh.gentoo-wiki.com/Packag ... F%E6%8A%80%E5%B7%A7

wiki里这两篇文章的相关联系已经更新
------------------------------------------------------------------------------------------------------------------------
其他更新
HOWTO 用Cedega运行极品飞车9 http://zh.gentoo-wiki.com/HOWTO_ ... %E9%A3%9E%E8%BD%A69
原文: http://gentoo-wiki.com/HOWTO_RUN ... _Wanted_with_Cedega

------------------------------------------------------------------------------------------------------------------------------


[size=+1]处理被屏蔽(masked)的包

本文内容:
介绍
被关键字(keyword)屏蔽(masked)的包
被不明的关键字屏蔽
被严格屏蔽(Hard masked)的包
手动进行严格屏蔽
编辑/etc/portage/package.keywords文件的简便方法
开放一大群有联系的包

[size=+1]介绍
首先,被关键字(keyword)屏蔽(masked)的包都是测试中的或者不稳定的包:
注意: "(masked by: ~keyword)"
Masked By ~keyword Package Example
  1. # emerge gnome-extra/gdesklets-core
  2.   '''Calculating dependencies'''   
  3.   !!! all ebuilds that could satisfy "gnome-extra/gdesklets-core" have been masked.
  4.   !!! possible candidates are:
  5.   - gnome-extra/gdesklets-core-0.26 (masked by: ~keyword)
  6.   - gnome-extra/gdesklets-core-0.26.1 (masked by: ~keyword)
  7.   !!! Error calculating dependencies. Please correct.
复制代码

其次,被严格屏蔽(Hard masked)的包:
注意: "(masked by: package.mask)"
Hard Masked Package Example
  1. # emerge -pv filewatcher
  2. These are the packages that I would merge, in order:
  3. Calculating dependencies   
  4. !!! All ebuilds that could satisfy "filewatcher" have been masked.
  5. !!! One of the following masked packages is required to complete your request:
  6. - app-admin/filewatcher-2.4.0 (masked by: package.mask)
  7. # Elfyn McBratney <beu@gentoo.org> (28 Apr 2005)
  8. # Masked for testing.
复制代码

[size=+1]如果你仍然想安装这些包,那该怎么办呢......

[size=+1]被关键字(keyword)屏蔽(masked)的包

现在的新方法是:

echo "gnome-extra/gdesklets-core" >> /etc/portage/package.keywords
或者

echo "=gnome-extra/gdesklets-core-2.10.9" >> /etc/portage/package.keywords

如果你想开放一个特定的版本。

注意:你不需要在package.keywords里面指明电脑架构,除非你想使用其他架构中的软件,当然这是不推荐的。

如果emerge指示某个软件包被 "~* keyword"屏蔽, 你需要逐字的把他写下来,例如:

echo "~gnome-extra/gdesklets-core-2.10.9 ~*" >> /etc/portage/package.keywords

如果你在用crossdev为多种架构建立软件包,例如:

echo "~gnome-extra/gdesklets-core-2.10.9 ~*" >> /etc/portage/package.keywords/cross-i686-pc-linux-gnu

OSB: 在cross-i686-pc-linux-gnu中i686-pc-linux-gnu的名字要根据各架构做相应改变。

到此,在做了以上任一步骤后,需使用一下命令编译这个包:

emerge =gnome-extra/gdesklets-core-2.10.9

关于package.keywords这个文件的更多信息请点击这里http://zh.gentoo-wiki.com/Packag ... F%E6%8A%80%E5%B7%A7.

如果你在命令行模式下,app-portage/flagedit是自动向packages.keywords里面添加项目的工具。

使用实例:
  1. flagedit gnome-extra/gdesklets-core -- +~x86
复制代码

Kuroo是一个有用的KDE程序,可以让你浏览portage树并且对任何包进行指定安装。

它使你能安装具有任何依赖性的包,但是,这个程序目前由于不稳定而被屏蔽,比如 ~x86, 所以你不能安逸的在实际安装中使用它(即使它只是portage的前端)。

即使你不想把kuroo用于实际安装,但在开放依赖包时你还是需要它。
  1. emerge -pv kuroo
复制代码

它编辑标准的portage文件。

[size=+1]旧方法 (不提倡)

ACCEPT_KEYWORDS="~x86" emerge gnome-extra/gdesklets-core

这种方法已经不被提倡了,它出现在这里仅仅是因为历史原因,不要用这个方法。
请阅读http://forums.gentoo.org/viewtopic.php?p=1060314#1060314 这是关于为什么ACCEPT_KEYWORDS不好的帖子。

简而言之,是因为emerge -u world会对用ACCEPT_KEYWORDS安装的包降级,这会造成潜在的致命改变并且使你的系统陷入瘫痪。
-U(功能:仅仅升级)这个参数也不被提倡了,这有一个充分的原因:如果包坏了,portage应该使它降级,-U确会对此操作造成阻碍。

[size=+1]被不明的关键字屏蔽

在你试图安装一个没有在你的架构上测试过的软件时,这个问题很常见。
向package.keywords文件中,在你要安装的那个包后面加"~*"以开放这个包。 例如:

echo "net-ftp/vsftpd -* ~*" >> /etc/portage/package.keywords

如果你有被9999屏蔽的CVS包,你可以做如下操作:

echo "media-gfx/retina **" >> /etc/portage/package.keywords

牢记,如果你在一个没有测试个架构里安装软件,这个软件也许没法运行。

[size=+1]被严格屏蔽(Hard masked)的包

开放被严格屏蔽(Hard masked)的包,需要把它们加到/etc/portage/package.unmask文件中。
所用命令和package.keywords稍有不同:

echo "=app-admin/filewatcher-2.4.0" >> /etc/portage/package.unmask

这将开放2.4.0版的app-admin/filewatcher。 如果你想开放这个包的所有版本,仅仅写它的名字就行了:

echo "app-admin/filewatcher" >> /etc/portage/package.unmask

当然也可以像 http://gentoo-wiki.com/TIP_package.keywords 里面那么操作。

注意:由于这些包的不稳定性,被严格屏蔽的包一般也被同样关键字被屏蔽。 你多半须要向package.unmask和package.keywords中都加人这个包。

[size=+1]手动进行严格屏蔽

很少的情况下,你需要避免这些包的安装。
这也许是个例子,如,某软件ebuild脚本里的一个bug造成那个包在你的系统上编译失败,这会使得像emerge --update --deep world这类命令无法顺利执行。

你可以跳过那个包的ebuild,这是通过把它的名字加到/etc/portage/package.mask来实现的:

echo "=sys-apps/file-4.17-r1" >> /etc/portage/package.mask

所用命令和上述package.unmask的一样。

[size=+1]编辑/etc/portage/package.keywords文件的简便方法
[size=+1]flagedit
# 安装: emerge flagedit
# 使用: flagedit <atom> -- +<keyword>,例如 flagedit dev-util/libconf -- +~x86
[size=+1]gimme
这个脚本使编译那些被关键字~arch屏蔽的包变得简单

/usr/bin/gimme
  1. #!/bin/bash
  2. ############### gimme version 0.5.4 ################
  3. # Script to add package names to package.keywords. #
  4. # Originally by Tekmanx, re-written by Hackeron    #
  5. # re-re-written by Gherald and edited by D. Watzke #
  6. ####################################################
  7. source /sbin/functions.sh
  8. [[$EUID != 0]]  && {
  9.         eerror "You are not root!"
  10.         exit 1
  11. }
  12. [[-z "$1"]]  && {
  13.         eerror "Please specify a package name (eg. gimme <package-name>)"
  14.         exit 1
  15. }
  16. [[-d /etc/portage]]  || mkdir -p /etc/portage
  17. # Get fully-qualified ebuild name
  18. FQN=$(ACCEPT_KEYWORDS="~x86" emerge -p $1 | grep "$1" | grep 'ebuild ' | tail -n2 | \
  19. head -n1 | sed -e 's/\[ebuild.......\]\ //' -e 's/\[[[:digit:]].*\]//' -e 's/-[[:digit:]].*$//')
  20. # We think there is either none or more than one package matching $1
  21. # so we let the user deal with it
  22. [[-z "$FQN"]]  && emerge $@ -a; exit
  23. if grep -q "^ *[\>\<=]*$FQN *" /etc/portage/package.keywords; then
  24.         ewarn "/etc/portage/package.keywords already contains "$EXISTING""
  25.         emerge $@ -a; exit
  26. else
  27.         einfo "Adding $FQN to package.keywords and emerging in 5 seconds."; sleep 5
  28.         echo $FQN >> /etc/portage/package.keywords
  29.         emerge $@ -a
  30. fi
复制代码

把这个文件命名为"gimme"并保存到/usr/bin/然后执行:

        chmod 755 /usr/bin/gimme
       
现在你就可以使用这个脚本了,例如:

        gimme gdesklets-core

[size=+1]/etc/portage/package.unmask的脚本

这个脚本使开放那些被严格屏蔽的包变得简单。
/usr/local/bin/unmask
  1. #!/bin/bash
  2. #
  3. # This script will unmask any package masked by the actual profile.
  4. #
  5. # First we search for what is actually masked
  6. # in /usr/portage/profiles/package.mask then add a corresponding
  7. # line in /etc/portage/package.unmask
  8. #
  9. #
  10. # Original by drax@sweon.net
  11. source /sbin/functions.sh
  12. [ "$UID" -ne "0" ] && eerror "You must be root to run this script." && exit
  13. [ -z "$1" ] && eerror "Please state a package name (eg. unmask kde-base/kode)" && exit
  14. [ ! -d /etc/portage ] && einfo "Creating /etc/portage directory" && mkdir /etc/portage
  15. if [ "$(grep "$1"-[0-9] /etc/portage/package.unmask 2>/dev/null)" ]; then
  16.     ewarn "$1 already exists in package.unmask"
  17. else
  18.     PKG_LINE="$(grep "$1"-[0-9] /usr/portage/profiles/package.mask 2>/dev/null)"
  19.     if [ ! $PKG_LINE ]; then
  20.         PKG_LINE="$(grep "$1" /usr/portage/profiles/package.mask 2>/dev/null)"
  21.     fi
  22.     if [ ! $PKG_LINE ]; then
  23.       ewarn "Could not find $1 in /usr/portage/profiles/package.mask" && exit 1
  24.     else
  25.       ebegin "Adding $1 to package.unmask"
  26.       echo $PKG_LINE >> /etc/portage/package.unmask
  27.       eend $?
  28.     fi
  29. fi
复制代码


同样,把这个文件命名为"unmask"并保存到/usr/local/bin然后执行:

chmod 755 /usr/local/bin/unmask

现在你就可以使用这个脚本了,例如:

unmask kde-base/kode # this version of unmask requires the full package name, including app-category/

也可以配合gimme一起使用,例如:

unmask kde-base/kode && gimme kode

潇洒去吧

[size=+1]开放一大群有联系的包
从Portage 2.1起,很多/etc/portage/package.*的文件能够被目录代替。这些目录里的文件可以自动被Portage连结在一起。

这个对于X模块(xorg)来说特别有用,几乎300个的和这个模块有联系的包都需要被开放。因而,你可以复制 http://www.gentoo.org/proj/en/de ... ular-x-packages.txt
到/etc/portage/package.keywords/xorg (也许同样需要复制到 /etc/portage/package.unmask/xorg)。如果不这样的话/etc/portage/package.keywords里会有一大窜东西,而使得这个文件不好管理。

[size=+1]脚本:开放所有被依赖的包

/bin/gimme-everything
  1. #!/bin/bash
  2. #
  3. # This script will unmask any package masked by specified keyword
  4. #
  5. # It is using flagedit to remove keyword
  6. # Usage:  /bin/gimme-everything "=gnome-2.14.2" "+~amd64"
  7. # Sorry that this is in one command line, but it was composed in one ;)
  8. #
  9. # author: mmazurek[at]wallix.com
  10. while true; do
  11.    if emerge "$1" | grep '!!! All ebuilds'; then
  12.       emerge "$1" | grep '!!! All ebuilds' | while read line; do
  13.          n=$(echo $line | sed -e "s/.*"\(.*\)".*/\\1/");
  14.          flagedit "$n" -- "$2";
  15.       done;
  16.    else
  17.       break;
  18.    fi;
  19. done
复制代码

[size=+1]脚本:开放所有被依赖的包 2
这个脚本不需要flagedit.
/sbin/unmask
  1. #!/usr/bin/perl -w
  2. use strict;
  3. sub emerge
  4. {
  5.         my $package = shift;
  6.         $_ = `emerge -pv "${package}" 2>&1`;
  7.         if(m/^- (\S+) \(masked by:.*package.mask/mi) {
  8.                 print "Unmasking ${1} in package.unmask\n";
  9.                 print UNMASK "=${1}\n";
  10.                 return 1;
  11.         }
  12.         if(m/^- (\S+) \(masked by:.*keyword/mi) {
  13.                 print "Unmasking ${1} in package.keywords\n";
  14.                 print KEYWORDS "=${1}\n";
  15.                 return 1;
  16.         }
  17.         if(m/^!!! masked or don't exist:\n(\S+)/mi) {
  18.                 while(emerge($1) != 0){}
  19.                 return 1;
  20.         }
  21.         return 0;
  22. }
  23. open(UNMASK, ">>/etc/portage/package.unmask");
  24. open(KEYWORDS, ">>/etc/portage/package.keywords");
  25. our $package = $ARGV[0];
  26. $package =~ s/"/\"/g;
  27. while(emerge($package) != 0){}
  28. print "Done\n";
  29. close(UNMASK);
  30. close(KEYWORDS);
复制代码

使用:

unmask ">media-video/mplayer-1.0_rc1"
发表于 2007-7-13 05:27:26 | 显示全部楼层
难道沙发了?支持杨珂。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-7-13 10:14:57 | 显示全部楼层
回复 支持 反对

使用道具 举报

发表于 2007-7-13 10:19:51 | 显示全部楼层
很实用的说
回复 支持 反对

使用道具 举报

发表于 2007-7-13 11:42:06 | 显示全部楼层
学习这么紧张还搞了这么大的动作
屏蔽问题是使用gentoo必过的关。
回复 支持 反对

使用道具 举报

发表于 2007-7-13 12:55:14 | 显示全部楼层
见精必顶是个好习惯
回复 支持 反对

使用道具 举报

发表于 2007-7-13 13:03:00 | 显示全部楼层
支持杨兄,收藏先
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-7-13 21:17:59 | 显示全部楼层

[翻译]Package.keywords的小技巧

Package.keywords的小技巧

把相关连的那篇文章也翻译了 如有问题 请大家指正
原文是 http://gentoo-wiki.com/TIP_package.keywords

同步的中文wiki是 http://zh.gentoo-wiki.com/Packag ... F%E6%8A%80%E5%B7%A7

wiki里这两篇文章的相关联系已经建立

来自HerrZattacke的小技巧

后面的小技巧有些陈旧。随着你的系统不断的增长,你可能会把所有被关键字屏蔽的包放在一个文件中,接下来有个新方法

例如: 你想开放foo/foo,但是这个软件的依赖性要求foo/foobar和foo/barbar必须也被开放。
这种情况下你可以按照后面有些陈旧那个方法做,也可以按照这个做。


  1. # mkdir -p /etc/portage/package.keywords                                    # 是的 建立一个目录而不是文件。
  2. # echo "foo/foo" > /etc/portage/package.keywords/foo                        # 文件名可以自由选择。
  3. # echo -e "foo/foobar \nfoo/barbar" >> /etc/portage/package.keywords/foo
复制代码

这个方法也可以用于package.use和package.unmask等等。

随便说一下,除非你想在~amd64架构上安装~x86的软件,那么没必要写~arch(如: ~x86, ~amd64)。

来自solka的小技巧

/etc/portage/package.keywords这个文件的使用非常简单。 只需要建立/etc/portage这个目录(如果它不存在的话),然后touch package.keywords文件。

# mkdir /etc/portage
# cd /etc/portage
# touch package.keywords

接下来,你只需要把包的的名字后面带有~arch标识。 下面是我的文件

File: /etc/portage/package.keywords

  1. ## Beginning amule 2.0.0r2 dependencies
  2. >=sys-libs/zlib-1.2.1 ~x86
  3. >=net-misc/curl-7.11.0 ~x86
  4. >=x11-libs/wxGTK-2.4.2 ~x86
  5. sys-devel/gdb ~x86

  6. ## Miscellaneous
  7. dev-libs/libcoyotl ~x86
  8. dev-libs/libevocosm ~x86
  9. dev-lang/fpc ~x86
  10. net-dialup/gammu ~x86
  11. sys-devel/acovea ~x86
  12. media-fonts/corefonts ~x86
  13. =dev-ruby/rails-1.1* ~x86

  14. ## xorg-x11
  15. x11-base/xorg-x11 ~x86
  16. x11-terms/xterm ~x86
  17. sys-apps/utempter ~x86
  18. media-video/nvidia-kernel ~x86
  19. media-video/nvidia-glx ~x86
  20. media-video/eselect-opengl ~x86
  21. media-viedo/eselect ~x86
  22. x11-wm/fluxbox ~x86
  23. gnome-extra/gdesklets-core ~x86
  24. media-gfx/gimp ~x86
  25. >=x11-base/opengl-update-1.7 ~x86

  26. ## Desklets
  27. x11-plugins/desklet-clock ~x86
  28. x11-plugins/desklet-cornerxmms ~x86
  29. x11-plugins/desklet-cpuinfo ~x86
  30. x11-plugins/desklet-diskinfo ~x86
  31. x11-plugins/desklet-goodweather ~x86
  32. x11-plugins/desklet-ltvariations ~x86
  33. x11-plugins/desklet-meminfo ~x86
  34. x11-plugins/desklet-multitail ~x86
  35. x11-plugins/desklet-networkinfo ~x86
  36. x11-plugins/desklet-psidisplays ~x86
  37. x11-plugins/desklet-psisensors ~x86
  38. x11-plugins/desklet-starterbar ~x86
  39. x11-plugins/desklet-sysinfo ~x86
  40. x11-plugins/desklet-temperature ~x86
  41. x11-plugins/desklet-weather ~x86

  42. ## Others
  43. app-admin/torsmo ~x86
  44. app-editors/vim ~x86
  45. app-editors/vim-core ~x86
  46. mail-client/sylpheed-claws-cvs ~x86
  47. net-www/mozilla-firefox ~x86
  48. sys-apps/athcool ~x86
复制代码


你也可以用=号为你要开放的那个软件指定一个特定的版本 例如

=x11-base/opengl-update-1.7 ~x86

你也可以这样做以扩大开放的范围。

=dev-ruby/rails-1.1* ~x86

这会开放1.1.0, 1.1.1等等

你也可以用大于、小于号来指定一个版本。

>=x11-base/opengl-update-1.7 ~x86

<=x11-base/opengl-update-1.7 ~x86

你可以用~去开放一个特定的版本以及这个版本的后续补丁,例如:这会开放firefox-0.9.1以及后续的-0.9.1-r1, -0.9.1-r2等等,但-0.9.2和其他任何版本将不会被开放

~net-www/mozilla-firefox-0.9.1 ~x86

这个包:sys-kernel/linux-headers被标记为-*而不是~x86

=sys-kernel/linux-headers-2.6.5 -*

还有两个可用的关键字:*表示开放一个软件包只要它在任何一个构架上进入稳定分支, ~*的意义类似不过指不稳定分支。
你在用这个的时候也许会不特定软件的版本,例如在给软件做架构测试时

看这个帖子http://forums.gentoo.org/viewtopic.php?t=171464  以了解更多内容。

很简单不是吗?

如果你感到手动编辑packages.keywords太烦。 你可以用flagedit代替
见:http://www.gentoo-wiki.org/HOWTO_Use_Portage_Correctly#TimeSavers
回复 支持 反对

使用道具 举报

发表于 2007-7-13 21:58:15 | 显示全部楼层
-*这个keyword已经不能单独用了
现在表示-*这个意思应把keyword定义为空
解锁用**
http://www.linuxsir.cn/bbs/showthread.php?t=306882
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-7-13 22:05:04 | 显示全部楼层
Post by zhllg
-*这个keyword已经不能单独用了
现在表示-*这个意思应把keyword定义为空
解锁用**
http://www.linuxsir.cn/bbs/showthread.php?t=306882

原来如此,这里没理解 所以译得有点勉强 wiki上已经改动了

-----------------------------------------------------------------

第一篇文章我开始翻译的时候在想是不是把标题翻译为: 处理被和谐的包

感觉和谐这个词更流行一点
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表