SystemDのハッキング
私は10年以上にわたって組み込みLinuxシステムを構築しており、sysVスタイルのinitを広範囲に扱ってきました。それは堅牢で実績がありますが、限界もあります。現在、Upstartやsystemdなど、sysvinitを置き換えることを目的としたプロジェクトがいくつかあります。
私はFedoraを extensively 使って、ディスクレスワークステーション用のnfsrootファイルシステムと、Fedoraリポジトリをベースにした組み込みファームウェアの両方を構築しています。この種の作業にはFedoraは奇妙な選択です。ほとんどの人はDebianやUbuntuを選ぶでしょう。
Fedoraはリリース15でsystemdに移行しました。systemdは新しかったので、私はツールチェーンをFedora 15にアップグレードしないことにしました。今は17になり、systemdは安定しているようです。そこで私はFedora 17を使ってnfsrootシステムを構築しました。結果はLTSP5/Meukowに似ていますが、Fedoraが最近のリリースを出荷しているため、すべてのパッケージがはるかに新しい点が異なります。
systemdに関するドキュメントは乏しく、systemdを削減する方法を理解するのにいくつか苦労しました。sysvinitでは、削減はより簡単です。rc.sysinitをスリムになるまで編集し、chkconfigを使って不要なサービスをオフにし、SELinuxを無効にします。Fedoraチームは、systemdの調整と使用に関するいくつかの有用なドキュメントを公開しています。また、sysVinitからsystemdへのチートシートとデバッグガイドもあります。これらのページは大いに役立ちました。
私のnfsrootファイルシステムは最初の試行で起動に失敗しました。カーネルコマンドラインに
systemd.confirm_spawn=true
を追加することで、systemdが実行した各コマンドを確認し、どれがクラッシュしているかを突き止めることができました。
systemdの便利な機能は、chrootファイルシステムに対して、そこにchrootせずにchkconfigスタイルのコマンドを実行できることです。これはyumの--installrootオプションに似ており、そもそもファイルシステムを構築するために私が使用したものです。たとえば、構築したシステムでcronを無効にするには、次を実行します
systemctl --system --root=$TARGET disable crond.service
ここで$TARGETはchrootへのパスです。
systemdは、上記のコマンドでは無効にできない多数のサービスを起動します。これらのサービス/コマンドへのシンボリックリンクは/etc/systemdにも存在しません。私が見つけた唯一の方法は、/lib/systemd/systemからこれらのコマンドへのシンボリックリンクを削除することでした。組み込み/デスクトップシステムで不要だと私が判断したコマンドには次のものがあります。
/lib/systemd/system/sysinit.target.wants/*binfmt*
/lib/systemd/system/sysinit.target.wants/cryptsetup.target
/lib/systemd/system/sysinit.target.wants/dev-hugepages.target
/lib/systemd/system/basic.target.wants/fedora-configure.service
/lib/systemd/system/local-fs.target.wants/fedora-import-state.service
/lib/systemd/system/local-fs.target.wants/fedora-readonly.service
/lib/systemd/system/local-fs.target.wants/fedora-storage-init*.service