RaspberryPi 2 + Raspbianに、Debian wheezy-backports版のsystemdをインストールする

RaspberryPiでサービスを扱いたいと考えて調べたところ、SysVinitを使った記事をよく見かけました。

さらに、RaspberryPiに限らずに調べてみたところ、Upstartを知り、最近の記事ではsystemdが出てきました。

そのため、RaspberryPiでsystemdを試してみようと考え、セットアップしてみました。

 

環境

開発PC

 

RaspberryPi 2
  • Raspberry Pi 2 Model B
  • Raspbian 2015-02-16
  • systemdはbackportのパッケージ
    • systemd 204
    • systemd-sysv 204
  • microSD
    • Transcend TS16GUSDHC10E
      • 相性あるのか、あまり調子よくない...

 

各種アップデート

アップデートしておきます。

pi@raspberrypi ~ $ sudo apt-get update
pi@raspberrypi ~ $ sudo apt-get upgrade
pi@raspberrypi ~ $ sudo rpi-update

 

Raspbian wheezy用パッケージのインストール

まずはRaspbianの状態を調べてみたところ、systemdはインストールされていないようでした。

pi@raspberrypi ~ $ dpkg -l systemd
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name           Version      Architecture Description
+++-==============-============-============-=================================
un  systemd        <none>                    (no description available)

 
そのため、systemdのインストールを行います。

# systemdのインストール
pi@raspberrypi ~ $ sudo apt-get install systemd
...
Setting up libpam-systemd:armhf (44-11+deb7u4) ...

# 念のためRaspberryPiを再起動
pi@raspberrypi ~ $ sudo reboot

# バージョン確認
pi@raspberrypi ~ $ systemctl --version
systemd 44
debian
+PAM +LIBWRAP +AUDIT +SELINUX +SYSVINIT +LIBCRYPTSETUP

 
動作を確認しようと、systemctlだけを叩いてみたところ、以下のエラーで動作しませんでした。

pi@raspberrypi ~ $ systemctl
Failed to get D-Bus connection: No connection to service manager.

 
調べてみると、systemd-sysvパッケージが不足しているため、動作しないようでした。
Debian -- Details of package systemd in wheezy-backports

 
そのため、systemd-sysvをインストールします。

# systemd-sysvのインストール
pi@raspberrypi ~ $ sudo apt-get install systemd-sysv
...
# 入力を求められる
You are about to do something potentially harmful.
To continue type in the phrase 'Yes, do as I say!'
 ?] Yes, do as I say!  # 入力した
Get:1 http://mirrordirector.raspbian.org/raspbian/ wheezy/main systemd-sysv armhf 44-11+deb7u4 [15.1 kB]
...
Setting up systemd-sysv (44-11+deb7u4) ...

# 再起動
pi@raspberrypi ~ $ sudo reboot

# 再起動後、動作確認
pi@raspberrypi ~ $ systemctl
UNIT                      LOAD   ACTIVE SUB       JOB DESCRIPTION
proc-sys...misc.automount loaded active waiting       Arbitrary Executable File
sys-devi...ttyAMA0.device loaded active plugged       /sys/devices/dev:f1/tty/tt
sys-devi...et-eth0.device loaded active plugged       ec00

問題なく動作しているようでした。

ここまででも良いのですが、手元の環境ではsystemdに切り替えた後、起動しないことがよくありました。

使用しているmicroSDとの相性なのかもしれませんが、systemdをバージョンアップすれば変わるかもしれないと考えて、wheezy-backports版のsystemdを入れてみることにしました。  
 
なお、backportsについては

backportsに含まれるものの中には,単に次のリリース(のベータ版)からリビルドしただけの安易なパッケージも少なくなく,導入によってシステムに不具合が発生する可能性もあります。どうしても使いたいパッケージが-backportsに存在する場合を除いては,有効にするべきではありません。

第83回 アップデートの管理:Ubuntu Weekly Recipe|gihyo.jp … 技術評論社

ということですので、ここらへんは自己責任で...。

 

wheezy-backports版のインストール

/etc/apt/sources.list への追記

/etc/apt/sources.listを開きます。

pi@raspberrypi ~ $ sudo nano /etc/apt/sources.list

 
ドキュメントを参考にして、最後の行に以下の内容を追加します。なお、サイトのURLは一番近そうなミラーサイトを指定しました。

deb http://ftp.jp.debian.org/debian/ wheezy-backports main

 

apt-get update

以下の警告が出ました。

pi@raspberrypi ~ $ sudo apt-get update

Reading package lists... Done
W: GPG error: http://ftp.jp.debian.org wheezy-backports Release: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 8B48AD6246925553 NO_PUBKEY 7638D0442B90D010

 
キーが無さそうなエラーでしたので、以下を参考にapt-getのキーを調べてみました。
Linux: apt-get 時の GPG error (NO_PUBKEY) の解決例

たしかにキーが無いようです。

pi@raspberrypi ~ $ sudo apt-key list
/etc/apt/trusted.gpg
--------------------
pub   2048R/90FDDD2E 2012-04-01
uid                  Mike Thompson (Raspberry Pi Debian armhf ARMv6+VFP) <mpthompson@gmail.com>
sub   2048R/5373DC6C 2012-04-01

pub   2048R/7FA3303E 2012-06-17
uid                  Raspberry Pi Archive Signing Key
sub   2048R/EDD83D6C 2012-06-17

pub   4096R/0C50B1C5 2013-05-11
uid                  Collabora Raspbian Archive Signing Key <daniels@collabora.com>
sub   4096R/D107BAE1 2013-05-11

 

キーサーバーより、GPGキーを入手

エラーが出ている2つのキーを、キーサーバーより入手します。

なお、キーサーバーにsubkeys.pgp.netを指定したところ、

pi@raspberrypi ~ $ sudo gpg --keyserver subkeys.pgp.net --recv-keys 8B48AD6246925553
gpg: directory `/root/.gnupg' created
gpg: new configuration file `/root/.gnupg/gpg.conf' created
gpg: WARNING: options in `/root/.gnupg/gpg.conf' are not yet active during this run
gpg: keyring `/root/.gnupg/secring.gpg' created
gpg: keyring `/root/.gnupg/pubring.gpg' created
gpg: requesting key 46925553 from hkp server subkeys.pgp.net

と表示された後ハングしたような感じになりました。

そのため、NSEG#41 白馬合宿でも使った pgpkeys.mit.edu を指定しました。
Windowsでキーサインパーティに参加した時のまとめ & caffっぽいツールを作ってみた - メモ的な思考的な

 

8B48AD6246925553用
pi@raspberrypi ~ $ sudo gpg --keyserver pgpkeys.mit.edu --recv-keys 8B48AD6246925553
gpg: requesting key 46925553 from hkp server pgpkeys.mit.edu
gpg: /root/.gnupg/trustdb.gpg: trustdb created
gpg: key 46925553: public key "Debian Archive Automatic Signing Key (7.0/wheezy) <ftpmaster@debian.org>" imported
gpg: no ultimately trusted keys found
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)

 

7638D0442B90D010用
pi@raspberrypi ~ $ sudo gpg --keyserver pgpkeys.mit.edu --recv-keys 7638D0442B90D010
gpg: requesting key 2B90D010 from hkp server pgpkeys.mit.edu
gpg: key 2B90D010: public key "Debian Archive Automatic Signing Key (8/jessie) <ftpmaster@debian.org>" imported
gpg: no ultimately trusted keys found
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)

 
入手したキーを確認し、確かに追加されていることが分かりました。

pi@raspberrypi ~ $ sudo gpg --list-keys
/root/.gnupg/pubring.gpg
------------------------
pub   4096R/46925553 2012-04-27 [expires: 2020-04-25]
uid                  Debian Archive Automatic Signing Key (7.0/wheezy) <ftpmaster@debian.org>

pub   4096R/2B90D010 2014-11-21 [expires: 2022-11-19]
uid                  Debian Archive Automatic Signing Key (8/jessie) <ftpmaster@debian.org>

 

apt-keyへ追加

GPGのものをapt-keyへ追加します。

pi@raspberrypi ~ $ sudo gpg -a --export 8B48AD6246925553 | sudo apt-key add -
OK

pi@raspberrypi ~ $ sudo gpg -a --export 7638D0442B90D010 | sudo apt-key add -
OK

 
apt-keyに追加されていることを確認します。

pi@raspberrypi ~ $ sudo apt-key list
/etc/apt/trusted.gpg
--------------------
pub   2048R/90FDDD2E 2012-04-01
uid                  Mike Thompson (Raspberry Pi Debian armhf ARMv6+VFP) <mpthompson@gmail.com>
sub   2048R/5373DC6C 2012-04-01

pub   2048R/7FA3303E 2012-06-17
uid                  Raspberry Pi Archive Signing Key
sub   2048R/EDD83D6C 2012-06-17

pub   4096R/0C50B1C5 2013-05-11
uid                  Collabora Raspbian Archive Signing Key <daniels@collabora.com>
sub   4096R/D107BAE1 2013-05-11

pub   4096R/46925553 2012-04-27 [expires: 2020-04-25]
uid                  Debian Archive Automatic Signing Key (7.0/wheezy) <ftpmaster@debian.org>

pub   4096R/2B90D010 2014-11-21 [expires: 2022-11-19]
uid                  Debian Archive Automatic Signing Key (8/jessie) <ftpmaster@debian.org>

 

再度、apt-get update

今度は正常終了しました。

pi@raspberrypi ~ $ sudo apt-get update
...
Reading package lists... Done

 

systemdをbackportからインストール

-tオプションを付けてbackportの場所からインストールします。

pi@raspberrypi ~ $ sudo apt-get -t wheezy-backports install systemd
...
Setting up systemd-sysv (204-14~bpo70+1) ...
Setting up libpam-systemd:armhf (204-14~bpo70+1) ...
Setting up libpam-cap:armhf (1:2.22-1.2) ...

 
確かにインストールされていました。

pi@raspberrypi ~ $ dpkg -l
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name                       Version            Architecture       Description
+++-==========================-==================-==================-=========================================================
...
ii  systemd                    204-14~bpo70+1     armhf              system and service manager
ii  systemd-sysv               204-14~bpo70+1     armhf              system and service manager - SysV links
...

 

必要に応じて、/usr/lib/tmpfiles.d/systemd.conf ファイルの修正

backportから入れたsystemdのバージョンを確認します。

pi@raspberrypi ~ $ systemctl --version
systemd 204
+PAM +LIBWRAP +AUDIT +SELINUX +IMA +SYSVINIT +LIBCRYPTSETUP +GCRYPT +ACL +XZ

 
ただ、このバージョンだとsystemdまわりにバグがあるようです。

 
そのため、RaspberryPiを再起動してsystemdを有効化した後にSSHで接続しようとしても、System is booting up.というメッセージが表示され、piユーザーでの接続ができなくなりました。

>ssh pi@192.168.0.21
The authenticity of host '192.168.0.21 (192.168.0.21)' can't be established.
pi@192.168.0.21's password:
System is booting up.
Connection closed by 192.168.0.21

 
今回は /usr/lib/tmpfiles.d/systemd.confファイルより、原因となる行を削除する方法を取ります。

ファイルを開きます。

pi@raspberrypi ~ $ sudo nano /usr/lib/tmpfiles.d/systemd.conf

 
以下のようなファイルの中身のため、最終行を削除します。

#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.

# See tmpfiles.d(5) for details
...

# 以下の行を削除
F /run/nologin 0644 - - - "System is booting up."

 
この後再起動して動作を確認します。

# 再起動
pi@raspberrypi ~ $ sudo reboot

# 動作確認
pi@raspberrypi ~ $ systemctl
UNIT                                                     LOAD   ACTIVE SUB       DESCRIPTION
proc-sys-fs-binfmt_misc.automount                        loaded active running   Arbitrary Executable File Formats File System Automount
...
To show all installed unit files use 'systemctl list-unit-files'.

 
SSHで接続できた上、systemdも起動しています。