みつきんのメモ

組み込みエンジニアです。Interface誌で「Yocto Projectではじめる 組み込みLinux開発入門」連載中

raspberrypi2 yoctoでsystemd

RPi2でpulseaudioを導入しようとしたところ、pulseaudioをサービスとして使用するには、systemdを利用するほうが従来のsysvinitよりも簡単に行えそうだということがわかった。 ただ単に、初期化スクリプトがsystemd用のもののみ用意されていたというだけの事なのだが。

勉強も兼ねてyoctoでsystemdを導入する。

SysVinitとsystemd

Linuxにおいてユーザーランドのシステム初期化は昔からSysVinitが利用されてきた。 しかし比較的新し目のシステムではsystemdが導入され、大きな流れで見るとsystemdに移行しつつあるようにも思える。

SysVinitとsystemdについてはここが解りやすいと思う。

ざっくり言うと以下のような点でsystemdに利点がある。

  • 各サービスについて、より細かい制御ができる
  • システム起動時の処理を並列化しやすいため、起動時間を短縮できる
  • サービスをオンデマンド化できる

systemdを実際に使用してみるにはここがわかりやすい。

systemdの有効化

yoctoのdev-manualによると、local.confに下記を追加すると、systemdが有効になるらしい。

DISTRO_FEATURES_append = " systemd"
VIRTUAL-RUNTIME_init_manager = "systemd"
DISTRO_FEATURES_BACKFILL_CONSIDERED = "sysvinit"
VIRTUAL-RUNTIME_initscripts = ""

dhcpについて

IPアドレスを自動取得する場合、busyboxのudhcpcかdhclientを使用することになるが、 pokyの起動シーケンスではnetwork managerによってどちらかのdhcp-clientが自動的に起動されるため udhcpc、dhclientともに自動的に起動しないようになっている。 具体的には、sysvinitの場合は起動スクリプトが/etc/init.dに置かれないようになっているし、systemdの場合はunitがmaskされている。

systemdに切り替えるとsysvinitでは自動的に起動していたeth0が起動しなくなるので、 それを回避するためには、別途ネットワークの設定を行う必要がある。

※connmanの記事は移動しました