パッケージ管理システムのPortageを擬人化して基本機能を図解する

概要

今回はパッケージ管理システムであるPortageの基本的な仕組みや機能(ebuild, emerge, USEフラグ等)を分かりやすくまとめていこうと思います。

説明の流れとしては、図解してイメージを浮かばせた後、実際どのようになっているのか、直接Gentooシステムの中をのぞきにいきます。イメージだけではモヤモヤするからです。

Portageの擬人化

説明に入る前にPortageを擬人化しておきます。

Portageとは?

改めてPortageとは、Gentoo Linuxの標準的なパッケージ管理システムです。

以下のような特徴があります。

  • ebuildというスクリプトを参照してパッケージを管理する。
  • ソフトウェアをソースコードからビルドする。
  • emergeというツールを介してPortageを利用する

この後一つずつ詳しい説明をしていきますが、要するに自分に必要な機能だけを取り込みたいGentooユーザに対して、細かいレベルまでの選択肢を提供してくれるのが強みです。

具体的には、このパッケージにはこの機能のサポートを含めてインストールしたい、あるいはこのパッケージだけにはこの機能のサポートは含めないでインストールしたい、といったことが可能になります。

他のパッケージ管理システムは、既にコンパイルされたパッケージをインストールします。なので自分が使用しない機能のサポートが既に含められていたりして、無駄な部分あります。

それに対してPortageは、ソースコードの状態のパッケージを取得し、必要ならばサポート機能を追加して、自分のPC上でコンパイルします。なのでGentooユーザは自分で取捨選択しながらシステムを構築していけますし、必要最小限のコンパクトなシステムが出来上がります(時間はかかりますが)。

Portageの特徴を大まかに掴めたところで、一つずつ詳しく特徴を説明していきます。

ebuild

ebuildはパッケージに関する様々な情報が書かれたスクリプトファイルで、パッケージごとに用意されています。Portageはこのebuildを参照しながら、パッケージをインストールしたり、検索や削除などを実行します。

ebuildに書かれている具体的な内容はこのようになります。

どこにソフトウェアがあるのか、どのバージョンか、どう構築するのか、何と一緒にインストールするのか、Portageが迷わないように様々な情報が記載されています。

イメージを掴んだところで、実際にebuildの中身をのぞきに行きます。ここではエディタであるVimのebuildを例にして説明します。

ebuildはデフォルトで/var/db/repos/gentooディレクトリ以下にあり、ebuild拡張子になっています。それではVimのebuildの中身をのぞきます。

# less /var/db/repos/gentoo/app-editors/vim/vim-8.2.0814.ebuild
EAPI=7
VIM_VERSION="8.2"
PYTHON_COMPAT=( python3_{6,7,8} )
PYTHON_REQ_USE="threads(+)"
USE_RUBY="ruby24 ruby25 ruby26 ruby27"

inherit vim-doc flag-o-matic bash-completion-r1 python-single-r1 ruby-single desktop xdg-utils

if [[ ${PV} == 9999* ]] ; then
        inherit git-r3
        EGIT_REPO_URI="https://github.com/vim/vim.git"
else
        SRC_URI="https://github.com/vim/vim/archive/v${PV}.tar.gz -> ${P}.tar.gz
                https://dev.gentoo.org/~zlogene/distfiles/app-editors/vim/vim-8.2.0360-gentoo-patches.tar.xz"
        KEYWORDS="~alpha ~amd64 arm arm64 ~hppa ~ia64 ~m68k ~mips ~ppc ~ppc64 ~riscv ~s390 sparc ~x86 ~ppc-aix ~x64-cygwin ~amd64-linux ~x8
6-linux ~ppc-macos ~x64-macos ~x86-macos ~m68k-mint ~sparc-solaris ~sparc64-solaris ~x64-solaris ~x86-solaris"
fi

DESCRIPTION="Vim, an improved vi-style text editor"
HOMEPAGE="https://vim.sourceforge.io/ https://github.com/vim/vim"

--------------------(省略)---------------------

長いので初めの方だけ抜粋しました。ここでは詳しい説明は省略しますが、VimのソースコードのURIやバージョン、ホームページなどの情報が書かれていることがわかると思います。もちろん、省略したところに依存関係の情報や構築手順も書かれているのでぜひ確かめてみてください。

Gentooリポジトリ

Gentooシステム内において、ebuildはebuildリポジトリという保管庫で管理されます。保管庫といっても正体はebuildというファイルの集合体、つまりはディレクトリ構造となっているものです。特に公式リポジトリのことをGentoo ebuild リポジトリ(Gentooリポジトリ)といいます。

Gentooユーザが何かPortageに指示を出すと、このGentooリポジトリの中から目当てのebuildを探し出し、指示された処理を行います。

もし公式リポジトリ内にはないebuildを利用したい場合は、他人が作ったリポジトリを入手したり、あるいは自分でリポジトリを作ってそこにebuildを作成したりすることもできます。

リポジトリには定義ファイルというものがあり、リポジトリをシステム内のどこに配置するのか、どのURLから取得や更新を行うのか等を定義します。このファイルは/etc/portage/repos.confディレクトリ以下にあります。

ではさっそくリポジトリの定義ファイルを見てみます。

# less /etc/portage/repos.conf/gentoo.conf 
[DEFAULT]
main-repo = gentoo

[gentoo]
location = /var/db/repos/gentoo    #注目
sync-type = rsync
sync-uri = rsync://rsync.gentoo.org/gentoo-portage
auto-sync = yes
sync-rsync-verify-jobs = 1
sync-rsync-verify-metamanifest = yes
sync-rsync-verify-max-age = 24
sync-openpgp-key-path = /usr/share/openpgp-keys/gentoo-release.asc
sync-openpgp-keyserver = hkps://keys.gentoo.org
sync-openpgp-key-refresh-retry-count = 40
sync-openpgp-key-refresh-retry-overall-timeout = 1200
sync-openpgp-key-refresh-retry-delay-exp-base = 2
sync-openpgp-key-refresh-retry-delay-max = 60
sync-openpgp-key-refresh-retry-delay-mult = 4
sync-webrsync-verify-signature = yes

自分の場合はこのようなデフォルトの設定になっています。公式ハンドブックの手順通りにインストールしていれば全く同じになっているのではないかと思います。

特に注目したいのはlocationの値です。/var/db/repos/gentooとなっていて、ここがこの公式リポジトリを配置した場所です。

先ほどVimのebuildを探しに行った時も、このディレクトリ以下から探しました。つまりこのディレクトリ構造がGentooリポジトリの正体です。

ls -l /var/db/repos/gentoo
total 1108
drwxr-xr-x  270 root root 12288 Dec 22 16:22 acct-group
drwxr-xr-x  248 root root 12288 Dec 22 16:22 acct-user
drwxr-xr-x   28 root root  4096 Dec 22 16:22 app-accessibility
drwxr-xr-x  193 root root  4096 Dec 22 16:22 app-admin
drwxr-xr-x    5 root root  4096 Dec 22 16:22 app-antivirus
------------(省略)-------------

emerge

Portageに何か指示をする時は、emergeというツールを使います。emergeコマンドには様々なオプションがあって、インストールや削除、更新等が行えます。

例としてパッケージのインストールまでの流れを図解してみます。

まずユーザはemergeコマンドをパッケージ名を指定して実行します。特にオプションを指定しなかった場合は、すぐにインストールが行われます。自分は何がインストールされるのか確認してからインストールしたいので、-a(–ask)オプションを指定することが多いです(他には-v,–verboseもつけて詳細情報を得たりします)。

インストールを指示されると、Portageは指定されたパッケージ名に対応するebuildを探して中身を参照します。

その後は、ebuildに書かれていたURLからパッケージを取得し、それをコンパイルしてシステムにインストールします。

ではVimを例にしてパッケージをインストールしてみます。既にインストールされているので再びインストールという形になります。

# emerge -av vim

 * IMPORTANT: 8 news items need reading for repository 'gentoo'.
 * Use eselect news read to view new items.


These are the packages that would be merged, in order:

Calculating dependencies... done!
[ebuild   R    ] app-editors/vim-8.2.0360::gentoo  USE="acl nls -X -cscope -debug -gpm -lua -luajit -minimal -perl -python -racket -ruby (-selinux) -sound -tcl -terminal -vim-pager" PYTHON_SINGLE_TARGET="python3_8 -python3_6 -python3_7" 0 KiB

Total: 1 package (1 reinstall), Size of downloads: 0 KiB

Would you like to merge these packages? [Yes/No] 

引数に指定するパッケージ名はapp-editors/vimとせずに、省略してvimでOKです。-aオプションでインストールするかどうか確認し、-vオプションで詳細な情報を表示させています。最後の質問でyと入力すればインストールが始まります。

他によく使うコマンドは、emerge –syncとemerge -uDN @worldです。

まずemerge –syncはリポジトリを最新の状態に更新します。ただリポジトリを更新しただけで、まだ既にインストールされているソフトウェアは更新されていません。

そこで、emerge -uDN @worldです。「うどんワールド」と呼ばれているもので、このコマンドでシステム全体を更新することができます。個人的には-aオプションを追加して、「あうどんワールド」にしたいです。

USEフラグ

USEフラグは、パッケージのインストール時に取り込みたい、あるいは取り込みたくない機能をON/OFFで指定する機能です。

例えば、USEフラグにA、B、C、Dというフラグを設定したとします。

すると、Portageは「A、B、C、Dのフラグがあるということは、A、B、C、D機能のサポートがさらに必要だ」という風に解釈し、目当てのパッケージにそれらを含めてダウンロード&コンパイル&インストールします。

このUSEフラグには、グローバルUSEフラグとローカルUSEフラグという2種類のフラグが存在します。システム全体的に適用させたい場合はグローバルUSEフラグで、あるパッケージのみに適用したい場合はローカルUSEフラグとして使用します。ローカルUSEフラグの方が優先度が高い仕様なので、グローバルUSEフラグの設定が上書きされます。

「インストールするパッケージ全てにこのフラグ使いたいけど、このパッケージだけには使いたくないな」という場合には、ローカルUSEフラグで使いたくないUSEフラグを指定して、そのサポートを含めないようにすることができます。

例えば、以下のようにグローバルUSEフラグにA、B、C、Dのフラグ、ローカルUSEフラグにD(含めたくない)、E(新しく含めたい)のフラグを設定したとします。

すると、まずグローバルUSEフラグのA、B、C、Dが設定され、その後ローカルUSEフラグによって、Dフラグが削除され、新しくEフラグが追加されます。結果、このパッケージにはA、B、C、E機能のサポートを含めてインストールが行われます。

ではVimを例にして、実際にUSEフラグを設定し、パッケージをインストールしてみます。

先ほどVimをダウンロードしようとしたとき、以下のようにUSEフラグも表示されていたと思います。

# emerge -av vim
--------(省略)---------
[ebuild   R    ] app-editors/vim-8.2.0360::gentoo  USE="acl nls -X -cscope -debug -gpm -lua -luajit -minimal -perl -python -racket -ruby (-selinux) -sound -tcl -terminal -vim-pager" PYTHON_SINGLE_TARGET="python3_8 -python3_6 -python3_7" 0 KiB

ここではaclフラグとnlsフラグが適用されており、その他の – は適用されていないことを意味します。

まずはグローバルUSEフラグを設定してみます。設定ファイルは/etc/portage/make.confで、以下のようにUSE変数にフラグを指定します。今回は適当にXフラグとdebugフラグを指定します。

# vi /etc/portage/make.conf
------(省略)---------
USE="X debug"

それからもう一度emerge -av vimを実行してみます。

# emerge -av vim
--------(省略)-------
[ebuild   R    ] app-editors/vim-8.2.0360::gentoo  USE="X* acl debug* nls -cscope -gpm -lua -luajit -minimal -perl -python -racket -ruby (-selinux) -sound -tcl -terminal -vim-pager" PYTHON_SINGLE_TARGET="python3_8 -python3_6 -python3_7" 0 KiB

すると今度はこのようにXフラグとdbugフラグが追加で有効になっています。

では、優先度が高いローカルUSEフラグでXフラグが適用されないように設定します。ローカルUSEフラグは単一のパッケージ用の設定なので、/etc/portage/package.use/パッケージ名といったファイルを作成し、そこで設定していきます。今回はechoコマンドで以下のように作成&編集します。

# echo "app-editors/vim -X" >> /etc/portage/package.use/vim

設定はパッケージ名とフラグを記入するだけで完了します。ここでは-XでXフラグを適用しないように設定しています。

それでは再びemerge -av vimを実行します。

# emerge -av vim
-------(省略)-------
[ebuild   R    ] app-editors/vim-8.2.0360::gentoo  USE="acl debug* nls -X -cscope -gpm -lua -luajit -minimal -perl -python -racket -ruby (-selinux) -sound -tcl -terminal -vim-pager" PYTHON_SINGLE_TARGET="python3_8 -python3_6 -python3_7" 0 KiB

するとこのようにXフラグが外れており、ローカルUSEフラグの方が優先度が高いことが分かります。

他にもUSEフラグの設定をする方法があり、優先度も異なります。詳しくはGentoo Wikiを参照してみてください。

最後に

今回いつもより図解を多めにして、これからGentooを利用したいと考えている方や、Portageの仕組みへの理解に苦しんでいる方に向けて、噛み砕いて説明してみました。

まだ自分はGentoo超初心者ですが、自分で取捨選択してシステムを構築できるGentooにハマったので、もっと極めていきたいなと思います。

Gentoo Wikiって本当に分かりやすくまとまっているなと思います。これからも参考にしていろんな機能を試していきたいです。

Comments

Copied title and URL