ブログ

Armadillo-X1, Armadillo-IoT G3/G3L,Armadillo-640: 自作Debianパッケージをsystemdで自動起動する方法

at_syunya.ohshio
2018年9月11日 13時05分

Armadillo-X1,Armadillo-IoT G3/G3L,Armadillo-640(以下Armadillo)で、自作Debianパッケージをsystemdで自動起動する方法をご紹介します。

概要

以前掲載した「自作Debianパッケージのaptリポジトリ作成方法」にて、自作Debianパッケージを別PCからインストールして使用する方法をご紹介しました。 今回は応用として「自作Debianパッケージを別PCからインストールし、システム起動時に自動起動したい」場合を想定し、[systemd]を用いた自作Debianパッケージの自動起動方法をご紹介します。

本ブログは応用編のため、以下の別ブログの内容が実施済みであることを前提として記載します。 systemd,Debianパッケージ,aptリポジトリについてはそれぞれ以下を参照してください。

また今回ご紹介する例は、以下の条件で実施するものとします。

  • ArmadilloとATDEは有線接続済み
  • パッケージ公開をATDE、インストールをArmadilloで行う
  • 公開サーバは標準でATDEにインストールされている[Apache2]を使用
  • Armadilloのユーザランドは[Debian GNU/Linux 9(stretch)]を使用

前準備:必要パッケージの確認

今回、Debianパッケージをsystemdに対応させるツールとして[dh-systemd]を使用します。 この[dh-systemd]は、「9.20160709以降のdebhelper」に含まれているため、[debhelper]のバージョンを確認します。

[atde]$ dpkg -l | grep -i debhelper
ii  debhelper                            9.20150101+deb8u2                    all          helper programs for debian/rules

今回の例では、「9.20160709以降のdebhelper」ではなかったため[apt-get]コマンドで[dh-systemd]をインストールします。

[atde]$ sudo apt-get install dh-systemd

Debianパッケージ作成

まずDebianパッケージを作成します。 Debianパッケージ作成のために必要なディレクトリとファイルを作成します。

[atde]$ mkdir -p pkg-systemd/system-init-test/debian
[atde]$ cd pkg-systemd/system-init-test
[atde]:~/pkg-systemd/system-init-test$ ls
debian
Debian設定ファイル群

Debianパッケージ設定ファイル群を作成します。

changelogファイル

[changelog]ファイルを作成します。

[atde]:~/pkg-systemd/system-init-test$ EDITOR=vi dch --create

内容は以下のようにします。

system-init-test (0.0.1) stable; urgency=medium

  * Initial release.

 -- Atmark-techno <test@test.com>  Fri, 24 Aug 2018 10:06:15 +0900
controlファイル

[control]ファイルを作成します。

[atde]:~/pkg-systemd/system-init-test$ vi debian/control

内容は以下のようにします。

Source: system-init-test
Section: utils
Priority: extra
Maintainer: Atmark-techno <test@test.com>
Build-Depends: debhelper (>= 9), dh-systemd
Standards-Version:3.9.6

Package: system-init-test
Architecture: all
Depends: ${shlibs:Depends},${misc:Depends}
Description: Make package systemd test.
 package.make.systemd.test
rulesファイル

[rules]ファイルを作成します。

[atde]:~/pkg-systemd/system-init-test$ vi debian/rules

内容は以下のようにします。

#!/usr/bin/make -f

%:
    dh $@ --with=systemd

※最終行の、行先頭の空白は「Tab」でなければなりません。スペースキーによる空白ではないためご注意ください。

copyrightファイル

[copyright]ファイルを作成します。

[atde]:~/pkg-systemd/system-init-test$ vi debian/copyright

内容は以下のようにします。

Copyright (c) 2018 Atmark Techno, Inc.
compatファイル

[compat]ファイルを作成します。

[atde]:~/pkg-systemd/system-init-test$ vi debian/compat

内容は以下のようにします。

9
install拡張子ファイル

今回の例では、上記で生成したファイル群に加えて[install]拡張子のファイルを作成します。 このファイルはDebianパッケージ作成の際、インストールされるべきファイルの設置場所を記載します。

[atde]:~/pkg-systemd/system-init-test$ vi debian/system-init-test.install

内容は以下のようにします。

usr/bin/system-init-test
lib/systemd/system/system-init-test.service

このファイルに記載した内容に合わせ、アプリケーションファイル[system-init-test]とUnitファイル[system-init-test.service]を作成,設置します。

アプリケーション,Unitファイルの作成

次に、実行される「アプリケーションファイル」とsystemdの定義ファイルである「Unitファイル」を作成します。 「Debian設定ファイル群」の「install拡張子ファイル」にて記載したように、[system-init-test.install]ファイルの内容に合わせてディレクトリ,ファイルを作成します。

アプリケーションファイル

アプリケーションファイル[system-init-test]を作成します。

[atde]:~/pkg-systemd/system-init-test$ mkdir -p usr/bin
[atde]:~/pkg-systemd/system-init-test$ vi usr/bin/system-init-test

内容は以下のようにします。

#!/bin/bash
while true
do
   echo system-init-test >> /tmp/system-init-test.log
   sleep 1
done
Unitファイル

Unitファイル[system-init-test.service]を作成します。

[atde]:~/pkg-systemd/system-init-test$ mkdir -p lib/systemd/system
[atde]:~/pkg-systemd/system-init-test$ vi lib/systemd/system/system-init-test.service

内容は以下のようにします。

[Unit]
Description = system-init-test daemon
 
[Service]
ExecStart = /usr/bin/system-init-test
Restart = always
Type = simple
 
[Install]
WantedBy = multi-user.target
Debianパッケージ作成

すべてのファイル作成を完了したら、Debianパッケージ作成コマンド[debuild]を実行します。

[atde]:~/pkg-systemd/system-init-test$ debuild -us -uc

コマンドの処理終了後、Debianパッケージが作成されていることを確認します。

[atde]:~/pkg-systemd/system-init-test$ ls ../
system-init-test            system-init-test_0.0.1.tar.gz   system-init-test_0.0.1_i386.build
system-init-test_0.0.1.dsc  system-init-test_0.0.1_all.deb  system-init-test_0.0.1_i386.changes

[atde]:~/pkg-systemd/system-init-test$ cd
[atde]$

aptリポジトリの作成と公開

上記で作成したDebianパッケージのaptリポジトリを作成し、公開します。

GPG鍵の生成

aptリポジトリに必要なGPG鍵は「自作Debianパッケージのaptリポジトリ作成方法」を参照し、作成してください。

[atde]$ gpg --gen-key

[atde]$gpg --export -a XXXXXXXX > debian-pkg.key
reprepro設定ファイルの作成

リポジトリ用ディレクトリを作成し、設定ファイル[distributions]を作成します。 [reprepro]については「自作Debianパッケージのaptリポジトリ作成方法」を参照してください。

[atde]$ mkdir -p systemd-apt/conf
[atde]$ cd systemd-apt
[atde]:~/systemd-apt$ vi conf/distributions

内容は以下のようにします。

Origin: system-init-test
Label: system-init-test
Codename: stretch
Architectures: amd64 armhf
Components: main non-free contrib
Description: Make package systemd test.
SignWith: XXXXXXXX
aptリポジトリの作成

空のリポジトリを作成し、そこへ作成済みのDebianパッケージを追加します。

[atde]:~/systemd-apt$ reprepro export
[atde]:~/systemd-apt$ reprepro checkpool
[atde]:~/systemd-apt$ reprepro includedeb stretch ../pkg-systemd/system-init-test_0.0.1_all.deb
[atde]:~/systemd-apt$ ls
conf  db  dists  pool

作成したファイル群をサーバ上に設置します。

[atde]:~/systemd-apt$ cd
[atde]$ sudo cp -a systemd-apt /var/www/html/
Armadillo側の設定

自作Debianパッケージのaptリポジトリ作成方法」を参考に、「パッケージ公開サーバの追加」「公開鍵の追加」「apt-get update」を行ってください。

パッケージ公開サーバの追加
[Armadillo]$ vi /etc/apt/sources.list

最後尾に以下の文章を追加します。

deb http://(ATDEのIPアドレス)/systemd-apt stretch main non-free contrib
公開鍵の追加
[Armadillo]$ wget http://(ATDEのIPアドレス)/debian-pkg.key
[Armadillo]$ apt-key add debian-pkg.key
OK
apt-get update
[Armadillo]$ apt-get update

自作パッケージのインストールと自動起動の確認

Armadillo上で今回設定した自作パッケージをインストールし、それがsystemdで自動起動するか確認します。

[Armadillo]$ apt-get install system-init-test

インストール完了後、まずアプリケーションが自動実行されていることを確認します。

[Armadillo]$ ls /tmp
system-init-test.log
[Armadillo]$ tailf /tmp/system-init-test.log
system-init-test
system-init-test
system-init-test
system-init-test
system-init-test
system-init-test
system-init-test

次に自動起動するserviceが[enabled]になっていることを確認します、

[Armadillo]$ systemctl list-unit-files | grep system-init-test
system-init-test.service                   enabled

この状態で再起動を行い、アプリケーションが自動起動していれば確認完了です。

[Armadillo]$ reboot
~~~~~~
[Armadillo]$ tailf /tmp/system-init-test.log
system-init-test
system-init-test
system-init-test
system-init-test
system-init-test
system-init-test
system-init-test
system-init-test
system-init-test

注意

今回ご紹介した自動起動の内容は、ユーザランドが[Debian GNU/Linux 9(stretch)]の場合です。 ユーザランドが[Debian GNU/Linux 8(jessie)]の場合、インストール時のservice初期設定が[disabled]になっています。

[Armadillo]$ systemctl list-unit-files | grep system-init-test
system-init-test.service                   disabled

この場合、インストール時に[systemctl]コマンドを用いて手動で[enabled]にする必要があることに注意してください。

[Armadillo]$ systemctl enable system-init-test.service