Ubuntu Weekly Recipe

第358回 Upstart Jobをsystemd Unitに変換する

この記事を読むのに必要な時間:およそ 3.5 分

先日発売されたSoftware Design 2015年2月号の第1特集は「Linux systemd入門」でした。その特集の中の後ろのほうにちょこっとだけ,主に14.04と14.10におけるsystemdの状況と今後の予定について書かせていただいています。そこで今回のRecipeでは,Upstart初心者向けのsystemdとの違いについて紹介します。

もちろんSoftware Design 2015年2月号を読んでいなくてもわかるように書いています。ただ同号にはsystemdそのものの基本も載っていますので,併せて読んでいただけると嬉しいです。

Ubuntuにおけるsystemdの進捗

多くの方がご存知のとおり,Ubuntuで現在採用されているinitデーモンは「Upstart」です。Ubuntu 6.10から採用されたUpstartは,イベントベースの非同期的な起動システムによって,起動時間の大幅な高速化に貢献してくれました。そんなUbuntuのinitデーモンですが,Debianがデフォルトのinitとしてsystemdの採用を決定したことをうけて,Ubuntuでも将来的にsystemdに移行することが議論されています

少なくともUbuntu 14.04 LTSは従来どおりUpstartを利用しています。このため,少なくとも5年間はUpstartのサポートが続きます。これを踏まえてSoftware Design 2015年2月号では14.04以降の流れや,今のUbuntu内部でsystemdがどのように使われているのか注1)⁠今後どういう予定になっているかについて紹介しました。そこで今回のRecipeでは,移行に向けての具体的な作業内容について紹介したいと思います。

注1)
Ubuntuは主にGNOMEサポートのために,Upstartからsystemdの一部のサービスも使用できるようになっています。

2015年4月にリリース予定の15.04では,かなり多くのパッケージがsystemd「も」サポートする予定です。これはJessieのリリースに向けたDebianの成果を取り込んでいることに加えて,先日のSprintではUpstartのみサポートしていた100近くのパッケージにsystemdのUnitも追加しました。現時点で残っているのはUbuntu Touch関連か,UpstartのSession Job注2で利用するものばかりなので,15.04でPID=1をsystemdに移行するための「パッケージ側の準備」はほぼ整ったと言えます。

注2)
デスクトップセッションなど,PID=1ではないUpstartから起動するJobのことを指します。こちらは少なくとも15.04ではUpstartをそのまま使う予定です。

15.04をインストールしたマシンがあるのであれば,以下のように必要なパッケージをインストールして,GRUBからカーネルの起動オプションを設定することで,かんたんにPID=1をsystemdに変更することが可能です。

$ sudo apt-get install systemd libpam-systemd systemd-ui

/etc/default/grubのGRUB_CMDLINE_LINUX_DEFAULTにinitオプションを追加してください。

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash init=/lib/systemd/systemd"

最後にGRUBの内容をアップデートします。

$ sudo update-grub

再起動すればPID=1がsystemdになっているはずです。

今後はアップグレード時の移行シナリオや移行の是非・タイミングを議論することになります注3)⁠また,systemdの多種多様な機能をフルに活用するという状態にはなっていません。hostnamectlやtimedatectlなど,既存の仕組みとかぶっているsystemdの機能はどうするのかということも考えなくてはなりません。その結果についてはいずれアナウンスされる事になりますので,Ubuntu Weekly Topicsやリリースノートにご期待ください。

注3)
「是非」と言っても先日アナウンスされたSnappyがsystemdを前提とした実装になっている以上,移行はほぼ確定事項だと思います。ちなみにSnappyでは,ソースパッケージの設定ファイルからsystemdのUnitを自動生成する仕組みが備わっています。

Upstartとsystemdの比較

公式リポジトリから提供しているパッケージについてはUbuntuコミュニティで修正するとして,各自で作成しているUpstart Jobをどうすれば良いのでしょうか。これについては作成者が各自で手作業で対応していただくほかありません。Upstartとsystemdの設定ファイルの書式や「できること」が大幅に違うため,自動的な変換ツールを提供することは難しいでしょう。その代わり移植の際に蓄積したノウハウが,UbuntuのWikiにまとまっていますのでそちらを参考にするのが良いでしょう。

Upstartとsystemdの用語は必ずしも1:1の対応になっているわけではありませんが,基本的な部分において,似たような意味や役割を持つ用語はいくつか存在します。たとえばUpstartは特定のサービスやタスクを実行する処理単位をJobと呼びます。systemdで対応するのは「Unit」です。

Jobは「/etc/init/」以下に「Job名.conf」という名前で保存されます。システム/パッケージが提供するJobは,⁠/etc/init/Job名.override」というファイルを作ることでその挙動を上書きできます。systemdの場合はシステムが提供するUnitは「/lib/systemd/system/」に配置され,ユーザーがUnitの挙動を変更する場合は/etc/systemd/system/に同名のファイルを置くことになります。

UpstartのJobファイルの中ではstanzaを使って設定を行います。systemdのUnitファイルではdirectiveが近い存在でしょう。Upstartはイベントベースですので,特定のJobが起動する契機となるイベントを「start on」stanzaで指定します。既存のイベントや呼び出される契機については「man upstart-events」に詳細が載っていますし,Jobファイルの中で独自のイベントを生成することも可能です。systemdの場合はUnit同士の「依存関係」「起動順序」「Wants/Requires/After/Before」directiveなどを利用して,より細かく設定できます。

UpstartのJob操作コマンドは「initctl」「start/stop/restart」を利用します。systemdの場合は「systemctl」コマンドが中心となります。詳しいことはWikiの比較表を参照してください。

著者プロフィール

柴田充也(しばたみつや)

Ubuntu Japanese Team Member。数年前にLaunchpad上でStellariumの翻訳をしたことがきっかけで,Ubuntuの翻訳にも関わるようになりました。

コメント

コメントの記入