Category: Gentoo

ラズパイ5、Gentoo周りのメモ

Gentooで使いたい。GenPi64のプロジェクトだと2024/03だと対応はまだの模様

2023/12 あたりに作成したGenPi64プロジェクトのイメージだとRaspberryPI5では起動しなかった。 この辺の機種ごとの際はラズベリーパイではよくあることではある。

ありがたいことに先人がおり起動したので、私が追加で設定したメモを残す。

手順はext4で起動するようになっている。 私が手順を一通り見て「既存のディスクイメージをベースにカーネルと必要なファイルを更新したら起動するのでは?」と思い試してみた。 が、カーネルが認識するファイルシステムがext4だった(カーネル再構築でbtrfsを認識させればよいような気もする) 私がGenPi64で作成したイメージはルートファイルシステムをbtrfsで構成したため起動しなかった。 素直にext4でルートファイルシステムを構成する。

基本的にこの手順で動作する

How to install Gentoo on Raspberry Pi 5 - Gentoo Wiki

私は作業用ディレクトリとして下記にした

WORK=/mnt/gentoo_work
DISK=/dev/sdc
DEST=/mnt/gentoo
mount ${DISK}3 $DEST && mount ${DISK}1 ${DEST}/boot

Gentooオフィシャルの説明

私が追加、変更して作業したこと

/lib/modules の git clone は時間がかかる

先にgitをインストールして/lib/modules用のレポジトリをダウンロードしておいた方が良い

–depth=1 で履歴を取らないようにしておくと早い

cd ${WORK}
git clone --depth=1 https://github.com/raspberrypi/firmware.git

openrcではなくsystemdを使いたかった

stage3のファイルをopenrcではなくsystgemdを利用した。 ダウンロードは下記のarm64の「systemd」を使った。

Downloads – Gentoo Linux

cd ${WORK}
tar xpf /mnt/gentoo_work/stage3-arm64-systemd-20250824T234925Z.tar.xz  --xattrs-include='*.*' --numeric-owner -C ${DEST}/

portage snapshot は jaistからダウンロードした http://ftp.jaist.ac.jp/pub/Linux/Gentoo/snapshots/ 昔からありがとう… 北陸先端科学技術大学院大学さん

Read more...

Gentooでkubernetesのセットアップ

事前準備

  • 固定 IP 化
  • swap を無効化
  • docker のインストールと自動起動

cgroup で CPU とメモリーが有効になっている必要がある

Gentoo で OpenRC だと /etc/rc.conf で設定する。

Gentoo側は Cgroup v1 と v2 の設定が選べる(hybrit になるようだ)。 Kubernetes での Cgroup v2 サポートは Docker で Docker Engine 20.10 から実装された模様

2021/10/10 時点の 私の Gentoo の Docker のバージョンを確認した所、20.10.7 だった。 kubernetes は 1.22 から Cgroup v2 をサポートした模様 参考 Kubernetes 1.22 における新機能は?

ただ私がKubernetesをインストールする際に使った k3s.io のバージョンを確認した所、2021/10/24時点で v1.21.5+k3s2 だった。 ので v1 をサポートする設定のままにする。

k3s.ioで一発インストール

結局、これが一番はやい。

※ この前に既に Gentoo のパッケージで kubectl をインストールしている場合は削除すること k3s.io はコマンドがインストールしてあると、そちらを使うように kubectl をインストールしない。 k3s.io 由来の kubectl だと設定なしですぐ kuernetes の api につながるようになっている。

Read more...

Gentooでkubernetesのセットアップに失敗した

事前準備

  • 固定 IP 化
  • swap を無効化
  • docker のインストールと自動起動

cgroup で CPU とメモリーが有効になっている必要がある

Gentoo で OpenRC だと /etc/rc.conf で設定する。

Gentoo側は Cgroup v1 と v2 の設定が選べる(hybrit になるようだ)。 Kubernetes での Cgroup v2 サポートは Docker で Docker Engine 20.10 から実装された模様

2021/10/10 時点の 私の Gentoo の Docker のバージョンを確認した所、20.10.7 だった。 kubernetes は 1.22 から Cgroup v2 をサポートした模様 参考 Kubernetes 1.22 における新機能は?

なぜ失敗しているのか?

kubeletやkubeadmのコンパイルは上手くいく。そういう観点でパッケージメンテナの作業は成功している。 kubeletも起動している。kubeadm –dry-runも正常に終了する。が実際にkubeadmで構築する段階で失敗している。 ここまま検証するより、一度、正常に動作しているkubenetesと比較した方が検証が進みやすそうだったので、構築できたk3s.ioを用いて検証を続けている。

kubernetes をインストールする

gentoo は標準でパッケージが用意されていたので、それでどこまで行けるか確認してみる。

パッケージインストール

app-admin/helm がマスクされていたのでマスクを外す。

cat << EOF | sudo tee -a /etc/portage/package.accept_keywords
app-admin/helm **
EOF
cat /etc/portage/package.accept_keywords
sudo emerge --ask  --quiet --verbose --verbose-conflicts  app-admin/helm sys-cluster/kubeadm sys-cluster/kubectl sys-cluster/kubelet \
  app-emulation/flannel net-firewall/conntrack-tools sys-apps/ethtool net-firewall/ebtables net-misc/socat

kubeadm init を –dry-run で実行、エラーが起きない事を確認する

sudo kubeadm init --dry-run --pod-network-cidr=10.244.0.0/16
cgroup でエラーが起きた
CGROUPS_MEMORY: missing

memory と /proc/cgroup を確認すると memory の enabled を見ると 0 、off になっているようだ。 memory を有効にすることを考える。

Read more...

Gentooでkubernetesのトラブルシューティング

トラブルシューティングのログ

machine-idがないエラーが出る

$ sudo journalctl -r --since today | less
 8月 02 00:48:56 k3s-prd-agent-g k3s[364]: W0802 00:48:56.104196     364 info.go:53] Couldn't collect info from any of the files in "/etc/machine-id,/var/lib/dbus/machine-id"
 8月 02 00:48:56 k3s-prd-agent-g k3s[364]: E0802 00:48:56.103437     364 info.go:119] Failed to get system UUID: open /etc/machine-id: no such file or directory

machine-idのファイルが存在するか確認する。

sudo ls -l /etc/machine-id /var/lib/dbus/machine-id
ls: '/etc/machine-id' にアクセスできません: そのようなファイルやディレクトリはありません
lrwxrwxrwx 1 root root 15  3月 18 21:43 /var/lib/dbus/machine-id -> /etc/machine-id

ファイルが無かったので作成する。

Read more...

GenPi64でrootパーティションの拡張

partedを起動

GenPi64 /home/demouser $ sudo parted
GNU Parted 3.6
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.

セクタ単位に表示を切り替え

(parted) unit s

空きスペース確認

(parted) print free
Model: SATA SSD  (scsi)
Disk /dev/sda: 468862128s
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number  Start     End         Size        Type     File system  Flags
        63s       2047s       1985s                Free Space
         1      2048s     524287s     522240s     primary  fat16        boot, lba
         2      524288s   9682946s    9158659s    primary  btrfs
         9682947s  468862127s  459179181s           Free Space

resizeは使えない

Read more...

Gentoo distccd Docker

背景

Gentoo の Docker イメージが作りたい。が、

  1. オフィシャルの gentoo/stage3-amd64 の更新頻度が低い( 2021/08/08 時点で以前のアップデートが 1 年前だった )
  2. portage 用のイメージ gentoo/portageがあり、こちらは毎日更新されている。
  3. コマンドや glibc などが置かれているビルド済みの領域は gentoo/stage3-amd64 に置かれているため、実際に使うときには emerge –update –deep –newuse @world とリビルドが必要
  4. リビルドするとイメージのサイズがかなり増える

が、できればコンパクトなイメージにしたい。

結論(2021/08/17 時点)

docker-slimを使ってイメージをコンパクトにする方法が一番コンパクトになった。

手法サイズ備考
ダウンサイジング前3.04GB
不要なディレクトリの削除1.8GBemerge が一時的に使うファイル郡
(上記ディレクトリ削除に加えて)不要なパッケージの削除983MBパッケージ一覧を見ながら不要そうなパッケージを削除
docker-slim39MB

Dockerfile サンプル

ここに公開した

手法の比較

不要なディレクトリ削除は emerge が一時的に使うファイル郡を削除するだけなので安全に使える。

不要なパッケージの削除だが、これはパッケージ名の変更やパッケージ同士の依存関係の変更があると 必須ではないが、都度 Dockerfile の修正が必要になり長期間の運用を考えると、運用コストが上がる。

docker-slim を使った方法が一番コンパクトになった。ただ docker-slim は必要なファイルを動的に解析して必要なファイルのみを残すので、解析できるように準備する必要がある。

portage 用のイメージ gentoo/portageを使った方が良いのか?

RUN emerge –sync でも同様な事はできるので… と思ったが、毎回 emerge –sync に時間が取られるのは無駄。 もし「Docker のキャッシュで古い状態でビルドされるのが嫌だ」という場合でも、キャッシュを使わないオプションで docker build すれば最新の状態でビルドできる。

Read more...

make.confのメモ

make.confの FEATURES のメモ

私が良く使う、あるいは検討したもの。man make.confでも確認できる。

distccのサーバ/クライアント設定

distcc サーバーを建てる

概要

ラズパイ Gentoo GenPi64 でのコンパイルに時間がかかるので、 amd64 のマシンの docker 上にクロスコンパイル環境を構築、 distcc デーモンを立てて、ラズパイがクライアント、amd64 が distcc サーバの構成でコンパイルを早くした。

手順

distcc が起動する docker コンテナを作る

distcc への接続確認

telnet コマンドでポート 3632 に接続。 切断は Ctrl + ] を押してから Ctrl + d

$ telnet localhost 3632
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
^]
telnet> Connection closed.

GenPi64 distcc クライアント側の設定

GenPi64 は distcc はインストール済みなので emerge は不要。ただし

  1. gcc のプロファイルを揃える
  2. distcc サーバーの IP アドレスの追加 は必要。

gcc のプロファイルを確認

Read more...

Gentoo Linuxで依存関係のあれこれを残す

依存関係のエラーをまとめる

私の短い経験と調査で得られたものを追加していく…

  1. @world の指定は大きすぎる場合がある。 @system で試すと必要なパッケージのアップデートはできるかもしれない。
  2. 個別のパッケージでアップデートを試みてみる。
  3. @preserved-rebuild と出たら emerge -1 @preserved-rebuild を行う
  4. dispatch-conf を行う
  5. マスクされている場合マスクされたパッケージをインストールする方法
  6. USE フラグの変更が必要

configure で失敗

2021/08/09 perl の gettext が必要との事

checking whether x86_64-pc-linux-gnu-gcc accepts -g... yes
checking for x86_64-pc-linux-gnu-gcc option to accept ISO C89... none needed
checking for library containing dlsym... -ldl
checking for library containing bindtextdomain... none required
configure: error: perl module Locale::gettext required

eix gettext で検索して必要そうなパッケージを追加した

RUN emerge sys-devel/gettext dev-perl/Locale-gettext

2023/06 ToDo

一旦、下記のmaskで自宅のラズパイ全部を最新にする

Read more...

Gentoo周りのメモ

/etc/portage/gnupg が無い、というエラーが出る

gpg: keyblock リソース'/etc/portage/
gnupg/pubring.kbx': そのようなファイルやディレクトリはありません\n
[GNUPG:] ERROR add_keyblock_resource 33587281\n
[GNUPG:] PLAINTEXT 740 \n
[GNUPG:] NEWSIG\ngpg: 2023年09月03日 07時32分03秒 JSTに施された署名\n
gpg:                RSA鍵534E4209AB49EEE1C19D96162C44695DB9F6043Dを使用\n
[GNUPG:] ERROR keydb_search 33554445\n
[GNUPG:] ERROR keydb_search 33554445\n
[GNUPG:] ERRSIG 2C44695DB9F6043D 1 10 01 1693693923 9 534E4209AB49EEE1C19D96162C44695DB9F6043D\n
[GNUPG:] NO_PUBKEY 2C44695DB9F6043D\ngpg: 署名を検査できません: 公開鍵がありません\n

私の場合は /etc/portage/make.conf に –getbinpkg を追加したからだった。

バイナリパッケージの OpenPGP 署名を検証する

Portage は可能であればいつでもバイナリパッケージの署名の検証を試みますが、
そのためにはまず、信頼されたローカル鍵を構成する必要があります。
app-portage/getuto は、ローカルのトラストアンカーをセットアップし、
/etc/portage/gnupg 内の鍵を更新するために使用することができます。
--getbinpkg または --getbinpkgonly を使用すると、Portage は自動的に getuto を呼び出します。

対応方法としては

  • getutoコマンドをインストール
  • getutoを実行
    • 1度実行すると /etc/portage/gnupg ディレクトリが作成され初期化される
    • この初期化が完了すればemergeも正常に進行する

パッケージの USE フラグ

/etc/portage/package.use/ 配下に置くようにした。

Read more...