Tag: Distcc

PXE Gentooのdistccdログとsystemd sandboxを切り分ける

PXE Gentooのdistccdログとsystemd sandboxを切り分ける

目的

PXE boot した Gentoo client で distccd を systemd 管理するとき、root filesystem の overlay 状態と systemd sandbox の制限を分けて考える。

/var/log が overlayfs 上で書き込み可能でも、unit に ProtectSystem=strict があると、service process からは明示許可した path にしか書けない。

症状

distccd は起動しているが、journal に次のような log open failure が出る。

distccd: failed to open /var/log/distccd.log: Read-only file system

このとき、host 側で見ると //var/log は overlayfs 上にある。

/        overlayfs
/var/log overlayfs

したがって、すぐに「root overlay が read-only」と判断しない。

原因層

systemd unit が次のような sandbox を持つ場合がある。

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...

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...