🔥

Gentoo 基本操作

2022/08/27に公開約11,000字

ネットで検索しても古い操作と新しい操作が混じっているので
基本的な内容だがここに書く。
だって忘れるたびに探すの面倒臭い

なるべく、デフォルトでインストールされているコマンドを
使って説明していきます。

portage

gentoo最大の売り。
複雑だがかなり強力なpackage管理ツール

N new (not yet installed)
S new SLOT installation (side-by-side versions)
U updating (to another version)
D downgrading (best version seems lower)
r reinstall (forced for some reason, possibly due to slot or sub-slot)
R replacing (remerging same version)
F fetch restricted (must be manually downloaded)
f fetch restricted (already downloaded)
I interactive (requires user input)
B blocked by another package (unresolved conflict)
b blocked by another package (automatically resolved conflict)

emerge

やれることが膨大で、運用者でも
かなりいろんなオプションを使い分けることが要求される。
実際手を動かして覚えよう。

ebuild + mergeツールで
emergeか。


# 毎日一回定時に上がるパッケージリストと同期を取る。
# emerge --syncに比べて、公式のレポジトリの負荷も、こちら側のマシンの負荷も少ないため
# 普段のパッケージリストの同期にはこれを使う。
emerge-webrsync

# 一番最後に更新されたパッケージリストと同期を取る。
# 公式としては負荷軽減のため一日に一回のみが推奨される。
# 使うパターン
# 1. emerge-webrsyncしてもパッケージの依存関係が壊れているいて、最新のパッケージを確認したいというときに使うと良い。
# 2. eselect repositoryで特定のrepositoryを有効、無効に切り替えたときのパッケージの同期。
# よって今は普段は使わない。
emerge --sync

# 特定のレポジトリだけ同期する場合
# 公式以外のレポジトリの同期に使われる。
emerge --sync repository名

# パッケージ検索
emerge -S <pacakge_name>

# パッケージインストール時の依存関係の表示
# gentooは割と依存関係を意識してインストールする必要があるのでよく使う。
emerge -pv <package_name>

# パッケージの依存関係の表示(ツリー)
# 依存関係親子関係で不具合がある場合によく使う。
emerge -pt <package_name>

# パッケージ詳細
emerge --info

# バージョンを指定してパッケージインストール
# ex) emerge "=app-editors/vim-8.2.4586"
emerge "=<package_name>-version"

# 指定のバージョン以上のパッケージをインストール
# ex) emerge ">=app-editors/vim-8.2.4586"
emerge ">=<package_name>-version"

# 指定のバージョン未満のパッケージをインストール
# ex) emerge "<app-editors/vim-8.2.4586"
# 下の~の記法で事足りるので普通は使わない。
emerge "<<package_name>-version"

# 指定のバージョン以下で最大のものをインストール
# ex) emerge "~app-editors/vim-8.2"
# vimの-8.2より下のマイナーバージョンで一番大きいものを取ってくる。
emerge "~<package_name>-version"

# パッケージインストール
emerge <package_name>

# パッケージインストール(インストールするかどうか聞かれる)
emerge -a <package_name>

# パッケージアップデート
emerge -u <package_name>

# すべてのパッケージをアップデートする。
emerge -u @world

# すべてのパッケージを深い依存関係含めてアップデートする
# NはUSEキーワードを追加、変更してないなら不要。
# osのカーネル含めてアップデート
# 久しぶりに更新するときに必要なことが多い。
# 久しぶりにやると依存関係を治すのに苦労するので、一ヶ月に一回はしたほうがいい。
# システムパッケージのみすべてアップデートなら emerge -uDN @systemでよい。
emerge -uDN @world

# build時依存関係含めてアップデートする。
# build時依存とはパッケージのコンパイルのときのみに使うツール。
# たまに更新が求められる。主にpython系のツールで依存関係が壊れているときに使う。
emerge -uDN --with-bdeps=y @world 
# インストール済みのpackage検索
qlist -IRv <pacakge_name>

# パッケージを不要なリスト(depclean時の削除リスト)に入れる。これのみではパッケージは削除されない。
emerge --deselect <package_name>

# 不要なパッケージを削除する。
# かなりパッケージを削除するならemerge -NDu @worldしたあとにやると安全。
emerge --depclean

# パッケージを強制的に削除。依存関係が壊れたときに使う。普段は使わない。
emerge --unmerge <package_name>

# パッケージをインストールするが、@world, @selectedに書き込まないし、@world, @selectedを読んでインストール済みかどうか考えずとりあえずインストールする。次のいずれかの理由で使う。
# 1. 依存関係が壊れているなどの理由でパッケージを再インストールする場合
# 2. 試しに使ってみたいなどお試しですぐアンインストールする場合。(@worldに書き込まれてないパッケージは--depcleanの対象になるため、意識しなくても--depclean時に削除される。)
emerge --oneshot <package_name>

# 古いパッケージを残す。
# 戻す可能性がある場合に使う。
# kernelとか。dbとか。openrcからsystemdに移行時にopenrc削除したくないとか。
# 割とシステムに影響でかいやつに使う。
emerge --noreplace <package_name>

set

どのような形でインストールされたか、どのような形でインストールするが記録される場所。

パッケージをまとめたやつ。

複数の場所に属しているときももちろんある。

emergeを行うときにここから選択する。

下記のコマンドでsetを確認できる。

emerge --list-sets
  • @world すべてのebuildパッケージはインストールされるとここに記録される。
  • @system システム関連のパッケージだけここに入る。
  • @selected 自分でemerge パッケージ名などの形で直接選んだものがここに記録される。
  • @profile eselect profile で自分が自分が選択したパッケージが入る。
  • @module-rebuild kernelを再構築したときに再ビルドが必要なパッケージがここに入る。vbovfとか仮想環境周り。
  • @security セキュリティアップデート。脆弱性が見つかったりしたやつの修正がここに入る。

つまり@world = @system + @selectedになる。

masked packageの解除方法

パッケージリストはあってもインストール時にmaskされていると表示される事がある。
これはtest中のパッケージだったり、パッケージ自体に不具合がある、指定のパッケージのときにはマスクされる、ライセンスを受け入れていなかったりなどの理由である。

ライセンス以外の場合

たいていの場合はtest中のパッケージだが使いたい場合だろう。
仮想環境や、開発者ツールは割とtest中のパッケージだったりするので、
クライアントPCとして使うなら割といじることが多いと思います。

これを受け入れるには
/etc/portage/package.accept_keywords/ 配下に設定を書いたファイルを置くとよい。

下に例を記す。

/etc/portage/package.accept_keywords/vscode
# vscode exists testing branch only
# if official merge request and approve this package, remove these row.
app-editors/vscode

ライセンスの場合

gentooは他のLinuxに比べてユーザーが予期しないライセンスを受け入れない用に
するためか、設定ファイルに書いて初めてそのライセンスのパッケージをインストールできるようになる。
vscodeなど開発ツールをインストールするためにmicrosoftのパッケージのライセンスを書くことは多いだろう。

これは/etc/portage/package.licenseに書き込んでいく。

/ ライセンス名という表記で
すべてのパッケージに対してこのライセンスを受け入れるという意味になる。
個別に対応するならパッケージ名
sys-kernel/linux-firmware @BINARY-REDISTRIBUTABLE
の用に個別に書く必要がある。

/etc/portage/package.license
*/* google-chrome
*/* free-noncomm
*/* Microsoft-vscode
*/* microsoft-edge
*/* Vivaldi
*/* Apache-2.0
*/* BSD
*/* BSD-2
*/* MPL-2.0
*/* MIT
*/* ISC
*/* JSON

sys-kernel/linux-firmware @BINARY-REDISTRIBUTABLE

package mask

上までのunmaskとは逆にマスクします。
運用上では勝手にバージョンを挙げられたら困るときなどに使うでしょう。

portage環境変数

/etc/portage/make.confに書いたり
設定をうまくみて、判断する環境変数。

portageで使われている環境変数を

下記のようにportageq を使えば調べられる。

# USE フラグ
portageq envvar USE
# COMMON_FLAGS
portageq envvar COMMON_FLAGS

COMMON_FLAGS

COMMON_FLAGS="-O2 -pipe -march=native"

が一番無難な設定。

下に引数について書いていく。

-O2
zero でない。オーである。
どの程度ビルドを最適化するかというフラグ。
Optimize 2と覚えよう。
ほぼ固定で一般ユーザーはほとんどの場合はこれを使う。

-march

指定しないとx86_64アーチテクトとしてビルドするので、
Gentooの実行時速度という強みの一つがかける。
marchを指定するデメリットとしては
Intel,amd内で世代を変更した場合でも再ビルドする必要が出る事、
cpuがマザーボードと一蓮托生であるノートパソコンなら、
デメリットがあまりないし、nativeとしてこう。

nativeとすると今現在PCに乗っているCPUを見て
適切な値で最適化してくれる。

逆にいろんなCPUを試したい人は-marchを指定しないこと。
amdとIntelどころか、CPUの世代ごとに最適化されているため、
動作しない可能性がある。

C言語をビルドするときのフラグ

Gentoo公式より、gccや、Intelのほうが詳しく乗ってる。参考にして欲しい。
Gentoo GCC説明
gcc march説明

Funtoo cpuと世代まとめ
intelの第2世代に最適化とかそういう感じで最適化する。

-pipe

ビルドのときに途中の処理をいちいちファイルに落とさず、
パイプで処理していく。
メモリ上で処理するため、メモリが潤沢なら、ビルド時間が改善されると思われる。
メモリが潤沢出ない場合は使わないほうが良いかもしれない。
ビルド時の速度が帰って落ちる可能性もある。

この環境変数はおそらく最初触ってからみんな忘れて放置している

GRUB_PLATFORMS

Grubで64bit環境を使っているか、biosかuefiかを決定する環境変数。
ビルドしたlinux kernelのイメージをgrubでインストールするときに
内部で使っているらしい。

この環境変数ももちろん最初触ってからみんな忘れて放置している

USE

これには2つの意味がある。

  1. emergeするときにパッケージにどの機能をインストールするかを決定する(local USEフラグ)
  2. OSシステム全体としてこの機能を使うかどうかを決定する(global USEフラグ)。

1.の使い方について
システム全体に使う気は無いが、特定のパッケーじだけに使う機能がある場合に使う。
例えば、remminaのrdpの機能とgtk3を有効にする必要があるが、他のパッケージで使うつもりが
無いなら、その機能をインストールしないだけで、ビルド時間も短縮されるし、その機能をインストール
したことによって発生しうる脆弱性が起きなくなる。

/etc/portage/package.use/ディレクトリ配下に書くのがルール

1は下記の例を参考にされたい。
ex) firefoxの依存ライブラリでmedia-libs/libpxがあり、
media-libs/libpxの機能(useフラグ) postprocを有効にしたい場合。

/etc/portage/package.use/firefox
media-libs/libvpx postproc

2.の意味については今後どんどんeselectの方に食われていくが、すべては無くならないだろう。
環境変数のUSEに設定する場合は2の意味で使われている。

インストールするパッケージによってはGlobal USEを使う事を強要される事も多い。
(わかりやすい例としてはsystemd USEフラグ。localで使うとか仕様上ありえない。systemd USEフラグについては
後述のeselect profileでsystemd関連のプロファイルを選択すると自動的にセットされる。)

2の例はremminaとsystemdがわかりやすいだろう。

ex) remminaでrdp(windowsのリモートデスクと同じプロトコル)を使いたい。

/etc/portage/make.conf
USE="${USE} gtk3 rdp"

PATHの連結のように
USE="${USE} useフラグ"
という形で追加していく。

Global なUSEフラグは下のコマンドを実行するとリストで表示される。

portageq envvar USE | xargs -n 1
# パッケージリスト中でパッケージで指定のUSEフラグを持つもの(インストールされていないものも含む)。
quse <use_flag>
# 現在のsystemにインストールされているパッケージで指定のUSEフラグを持つもの。
quse -I <use_flag>

PYTHON_TARGETS

gentooは速度改善のためか、システムの至る所でpythonを使っている。
パッケージがpythonのバージョンに依存している事はよくある。

使い方はUSEフラグと全く同じで、
PYTHON_TARGETS

グローバルのPYTHON_TARGETSを変えたら、

emerge -uDN @world

としてシステム全体を更新しよう。

eselect

portageのUSEフラグ管理をすることによりソフトウェアのバージョン管理してくれるやつ。

eselect をセットすることにより適切なUSEフラグが適切にセットされ、eselectをセットすることで
不要になったパッケージは--depcleanの対象に入り、依存関係を壊しうるパッケージはmaskされる。

試しに壊れても良い環境で、下のようにprofileを変更してみよう。

eselect profile set 13

# グローバルの環境変数USEが変更され、
# multilibが入ってくる事がわかる。
portageq envvar USE | xargs -n 1 | grep multilib

emergeの複雑な処理を勝手に判断してやってくれるスグレモノ。
このまま

emerge -uDN @world

としたら、ほしい状態が作れるという事。

pentoo archのblackarch, debianのkaliに相当するoffensive securityツールをまとめたやつ。
英語圏含めて業務で使われているの聞いた事ないので現在では割と趣味の領域。
blackarchの方はkaliよりツールが多いので採用されることはあるらしい。

代表的なeselect

  • eselect profile systemd使うかとか、selinux使うかとかシステム全体に関わるもの。
  • kernel 現在システムで使っているカーネルをソースを管理してくれている。
  • java システムで使われているjavaのバージョン管理

プログラミング系のeselectは複数のバージョンをインストールしたら
勝手にeselectができる。

上を見てたらわかるが、プログラミング言語のenv系のツールはgentooでは今後、
eselect側ですべて管理される方針になるっぽい。それで足りなかった場合に使う感じで。

eselect repository

かつては公式以外のレポジトリやダウンストリームのレポジトリを使うときは
laymanを使っていたが、現在はeselect-repositoryを使うこと。
ただ、laymanで書かれている記事とeselect repositoryの記事と混在しているので注意。

下記のようにしてインストールする。

emerge app-eselect/eselect-repository

レポジトリ一覧

eselect repository list

レポジトリ有効化

eselect repository enable <you want to enable repository>

gentoo公式のレポジトリと混ざると、
問題の発生時の切り分けが面倒なのでできるだけ影響範囲が小さくしておく。

echo '*/*::guru' >> /etc/portage/package.mask/guru

使うレポジトリから個別に有効にしていくと良い。

echo 'app-backup/timeshift::guru' >> /etc/portage/package.unmask

メジャーなレポジトリを並べていく。
archと同様、全体的にダウンストリームはまだ若い。
debianやfedoraの用に強力なダウンストリームが無いのは辛い。

guru

gentooのコミュニティレポジトリ。
当然、gentoo公式より不安定
ここからgentoo公式にレポジトリが移動する事もままある。
archlinuxにおけるAURレポジトリ。
つまり、あまり信用しない事。

使うことになりそうなのはtimeshiftぐらいだろう。

nest

gentooの個人用レポジトリ
guruよりさらに不安定
オレオレレポジトリ。つまり全く信用するな。

pentoo

gentooのoffensive用レポジトリ群。
現在では割と趣味の領域。
セキュリティエンジニアでgentoo使いでもpentoo使うより、
仮想環境でkali動かしている人の方が多い。
Kaliどころか、black archのほうがずっとユーザーは多いだろう。

pentoo公式もまだBetaだと言っている。

githubにある野良レポジトリ

野良とはいえ、gentooのcommiterのものなら信頼できる放置されているのもあるけど

Gentooはgolangと同じくgithubのレポジトリをパッケージレポジトリに使えるという
強力な個性を持っている。
debianやrhelと違ってパッケージファイルを予め作る必要がないのだ。

下のコマンドを実行するだけで、githubのレポジトリを使うことができる。

eselect repository add test git https://github.com/test/test.git

もしあなたが、企業に働いていてGentooでPCを統一する場合は
社員がアクセスできるgithubレポジトリを作るだけで、
社内独自の環境を構築できるということ。

運用について

更新の頻度

クライアントPCとして使うなら、ブラウザが脆弱性抱えるの怖いとか、
サーバーなら一週間に一回ぐらいは同期を取っておいた方がいいだろう。

ソースコード削除

ソースコードをダウンロードしてきてビルドするなで、windowsよりもずっと大きな容量を取る。
普段遣いのPCでも最低1TBはほしい。
また、自分でパッケージを作る事になるともっと多い。

半年ならないうちに自分も500GB以上容量を取っていた。

その場合はソースコードを削除しよう!
ecleanを使えば削除できる。

emerge app-portage/gentoolkit

ecleanについて下記のただし下記がある。

デフォルトでは、現在のリポジトリ内のebuild ファイルに関するあらゆるソースファイルもバイナリパッケージも、削除されることはありません。なぜならば、現在のリポジトリツリーにあるパッケージについては、ダウングレードされたり、以前にアンインストールしたものでも再インストールされたりする可能性があり、役に立つかもしれないからです。

例えば、 foo-1.0 および foo-1.1 というパッケージがリポジトリ内にあるとします。foo-1.0 から foo-1.1 にアップグレードした後に eclean distfiles を実行しても、どちらのソースファイルも削除されません。なぜなら、foo-1.1 に不具合が見つかる可能性もあり、ユーザーが foo-1.0 を再インストールするかもしれないので、その際に再ダウンロードすることを省けるからです。

と書かれているが、普段使いだとこれを使わないと容量を取りすぎて、使い辛いと思われる。

また、ガチガチにサーバーでやる場合以外はそこまで必要ではないし、
現在の物理サーバーなら何十かから何百Tバイトクラスなので、
gentooのソースコードのせいで容量が云々というレベルまで
圧迫されることは無いだろう。
組み込みでやる場合は、知識として要求されるかもしれない。

使い方

ソースコードの削除

# 何を消すかリストで見せる。
eclean-dist -p
# 削除
eclean-dist -d

バイナリの削除

# 何を消すかリストで見せる。
eclean-pkg -p
# 削除
eclean-pkg -d

まとめ

割と覚える事多いですね...
学習コストが高く、公式のwikiが情報散らかってるので、初心者にはかなりキツイOSだと思います。

また面倒臭がりにも向いていません。
面倒臭い人はDebianの方が向いています。

Discussion

ログインするとコメントできます