試験運用中なLinux備忘録・旧記事

はてなダイアリーで公開していた2007年5月-2015年3月の記事を保存しています。

Gentoo Linuxにおけるパッケージ管理について(マスクとその解除)

ここでは、Gentoo Linuxにおけるパッケージのマスクに関してを扱う。
http://webos-goodies.jp/archives/50608693.html
も参考に。

マスクとその種類

安定版(stable)扱いでないパッケージは、「マスク」がされていて、そのままインストールすることはできない。(利用できるはずのパッケージを)「覆い隠す」ようにマークしてインストールできなくしていることからそう呼ばれているものと思われる。覆い隠されているということは、それを取り除くようにインストール可能な状態にする(unmask:マスク解除)ことができるということでもある。
マスクには主に2つの種類があり、どちらかのマスクがされているものをインストールしようとするとエラーが出る(インストールできない)。このとき、どのパッケージがどの種類のマスクによってインストールに失敗したかがメッセージに表示される。

キーワード

各パッケージ/バージョン/リビジョンのebuildにはアーキテクチャごとに安定版扱い(「x86」のようなチルダ無し)か不安定(テスト)版(「~x86」のようなチルダ付き)かが決められていて、キーワードという仕組みによってebuildファイル内の変数KEYWORDS指定されている。
下は、あるebuildに書かれている変数KEYWORDSの例。

KEYWORDS="alpha amd64 arm hppa ia64 m68k ~mips ppc ppc64 s390 sh sparc ~sparc-fbsd x86 ~x86-fbsd"

これは、このパッケージが

であることを示す。ebuild内のの変数KEYWORDSに書かれていないアーキテクチャではインストールはできないが、動作が確認されていないに過ぎず、「動かない」ことを保証するものではない。

KEYWORDS="-* ~amd64 ~x86 ~x86-fbsd"

一方、上のように「-」で始まるキーワードで指定されたアーキテクチャは「動かない」ことが保証されていて、「-*」が書かれている場合、(全てのアーキテクチャを「否定」していることから)その後ろに続けて書かれているアーキテクチャでのみ利用可能であることを示している。

KEYWORDS=""

上のように空の文字列になっている場合、そのままではどのアーキテクチャからも入れられない。開発版パッケージの最新状態を(CVS/Subversion/Gitなどを使用して)取得するものに多い。
(チルダ付きのキーワードが書かれているかKEYWORDSに手元で使用中のアーキテクチャ*1の記述がないことで)チルダ無しのキーワードが含まれていない場合は「キーワードによってマスクがされている」ことになり、このパッケージを入れるためには、キーワードの指定によるマスク解除が必要。

ハードマスク

新しく入ったばかりのパッケージの一部*2や既知の不具合があるパッケージ、(メンテされていないなどにより)Portageツリーから外される予定のパッケージなど、特別に「ハードマスク」として重ねてマスクされるパッケージがある。
ハードマスクされているパッケージの一覧は/usr/portage/profiles/package.maskにその理由とともに書かれている。
これを解除するには設定ファイルに個別の記述が必要(後述)。

壊れたパッケージ(特殊な場合)

ローカルOverlayで自作のebuildを使用したときや既存のebuildを修正したときなどに

 * Digest verification failed:
 * [ebuildファイルの場所]
 * Reason: Filesize does not match recorded size
 * Got: xxx
 * Expected: xxx

!!! All ebuilds that could satisfy "[パッケージatom]" have been masked.
!!! One of the following masked packages is required to complete your request:
- [パッケージatom] (masked by: corruption)

のような形でパッケージがマスク扱いになることがある。上の場合、ebuildファイルが修正された後でダイジェストの取り直しをしていないのが原因*3で、取り直せばこのマスクはなくなってインストールできるようになる。
ダイジェスト計算の作業やOverlayに関しては「Gentoo Linuxにおけるパッケージ管理について(Overlay)」を参照。

マスクの解除

キーワードの指定

キーワードによるマスクを解除するためには、/etc/make.confの変数ACCEPT_KEYWORDSもしくは同名の環境変数により設定することもできるが、特に環境変数により一時的に指定する場合、インストール時に(入れたいパッケージから依存している)全てのパッケージが(安定版でないパッケージの使用を許容する)対象になる上、その後システムのパッケージを最新バージョンに更新しようとしたときにはキーワード指定が無効になってしまう(ダウングレード指定になる)ので、パッケージのインストール後、一般的な指定方法で使用されるファイル/etc/portage/package.keywordsに該当パッケージの記述を追加する必要がある。/etc/make.confに記述するのも、対象の広さからおすすめはできない。
ACCEPT_KEYWORDSの使用は非推奨といってもよい。
関連URL:

/etc/portage/package.keywordsでは、パッケージごとに許可キーワードを指定できる。書式は

[パッケージatom] [キーワード...]

となる。パッケージatomに関しては「Gentoo Linuxにおけるパッケージ管理について(パッケージ、バージョンとその識別子)」を参照。
ebuildで「KEYWORDS=""」となっているものでは、キーワード部分に「**」を記述する。
下は設定例。
ファイル名: /etc/portage/package.keywords

x11-wm/compiz ~amd64 **
>=app-text/cmigemo-1.3 x86

上のapp-text/cmigemoに関する記述は、x86_64上で「使用中のアーキテクチャで動作確認されていないものに対して、動作確認されているアーキテクチャ(x86)のキーワード文字列を記述して試す」例(2008年10月現在、このパッケージには「~amd64」も「amd64」も書かれていない)。この場合は運良く動作している。

ハードマスクの解除

ハードマスクを解除するには/etc/portage/package.unmaskにパッケージatomを記述する。その後ろには何も書く必要はない。
下は設定例。
ファイル名: /etc/portage/package.unmask

app-editors/emacs-cvs
~kde-base/kdelibs-4.1.2
ハードマスクを行う

場合によっては、マスクのされていないパッケージやそのバージョンが問題を起こすことがある。また、パッケージのバージョンが上がるのを保留したいということもある。
そういったときに、/etc/portage/package.maskを使用することで、手動でパッケージをマスクすることができる。
下は指定例。
ファイル名: /etc/portage/package.mask

>=sys-apps/groff-1.19
>media-fonts/ipamonafont-1.0.5

パッケージのバージョンが上がるのを保留し続けたい場合、使用中のバージョンのebuildは(その後の同期でPortageツリーから消えてしまうかもしれないので)ローカルOverlayに保存しておくとよい。

関連記事:

*1:x86_32は「x86」、x86_64は「amd64

*2:例として、APIの変更(ライブラリの使い方が一部変わる)により、APIが変更されたライブラリを利用しているパッケージに影響が出ることがあり、しばらくの期間そのライブラリがマスクされるという場合がある

*3:最後にダイジェストを取った時点でのファイル情報と異なるファイルがあると「壊れた」とみなす仕組みになっている