tom__bo’s Blog

MySQL!! MySQL!! @tom__bo

systemdメモ

Ubuntuで、キーボードの数字と記号を入れ替え(シフト無しで記号、シフトありで数字になる)ようにしようとしていた。

.profileで予め用意したキーマップをxmodmapコマンドで上書きしようとしたけど、Unityに上書きされるのか、上手く書き換えられなかったので、Systemdを使ってどうにかしようとした時のメモ。

結局途中でキーマップの変更方法は正しい方法が見つかったので、やっていない。

まずはsystemdの仕組みがわかっていなかったので、調べた内容から。 参考のURLを読めば仕組みは詳しく書いてあるので、まずはそれを読む。

特徴

  • 高速なシステム起動と終了
    • 高い並列度でプロセスを扱う
  • 設定ファイルによるシステム管理の共通化
  • 柔軟なプロセス起動
    • タイマーによる起動
    • socketへの通信検出によるプロセス起動
    • 所定のパスへのファイル作成をトリガーとしたプロセス起動
  • cgroupsによるプロセス管理

UnitとTarget

systemdではUnitという単位で処理を管理する。 Unitには依存関係と起動順序を設定することで、default.targetを頂点として依存関係のツリーを構築して、これを元に並列に起動していく。 またUnitをまとめたtargetを定義でき、関連する処理をまとめて整理することが出来る。 Unitの格納先は

/usr/lib/systemd/system
/etc/systemd/system

の2つで、個別の設定は基本的に/etc/systemd/systemを使っていく。

systemdのUnit例

ユニット名 内容
systemd.service デーモンやプロセスの定義
systemd.socket ローカルIPC(プロセス間通信)、ネットワークソケット、FIFO(名前付きパイプ)の定義
systemd.device /dev/以下のデバイスファイルの定義
systemd.mount マウントポイントの定義
systemd.automount 自動マウントポイントの定義
systemd.swap swapデバイスの定義
systemd.target ユニットを束ねたターゲットの定義
systemd.timer 特定の時間に実行する処理の定義

依存関係と順序

関係 分類 内容
Wants 依存 依存先との同時起動をするが依存先が失敗しても続行する
Requires 依存 依存先と同時起動をして失敗したら中止
Conflict 依存 競合する関係、指定したプロセスとは同時起動しない
After 起動順 自信よりも前に起動するプロセス
Before 起動順 自信よりも後に起動するプロセス

起動プロセス

init/Upstartと同じく、BIOS/UEFIが起動してブートローダを読んで、ブートローダがkernelを起動する。 この後kernelが呼び出すのがinit/Upstartではなく、systemdになる。

Linuxシステム[実践]入門のp180の図 f:id:tom__bo:20160507201213p:plain

上の図を見るとわかりやすい

systemdが起動時に読むらしい以下のconfはデフォルト(Ubuntu 16.04)では全てコメントアウトされていた。

/etc/systemd/system.conf
/etc/systemd/user.conf

unit置き場である/usr/lib/systemd/system, /etc/systemd/systemを見ていく、/usr/lib/systemd/system はなかった ココらへんはOSの設定なのだろうか?

/etc/systemd/systemを見るといろいろある

bluetooth.target.wants
dbus-org.bluez.service
dbus-org.freedesktop.Avahi.service
dbus-org.freedesktop.ModemManager1.service
dbus-org.freedesktop.nm-dispatcher.service
dbus-org.freedesktop.thermald.service
default.target.wants
display-manager.service
display-manager.service.wants
getty.target.wants
graphical.target.wants
hibernate.target.wants
hybrid-sleep.target.wants
multi-user.target.wants
network-online.target.wants
paths.target.wants
printer.target.wants
shutdown.target.wants
sockets.target.wants
suspend.target.wants
sysinit.target.wants
syslog.service
timers.target.wants

~.wantsというディレクトリはunit内の設定でwants=~とかくことと同じで、このディレクトリ内のunitをwantsのunitとして設定できる

まずは起動順にしたがって、unitを見てみる

# systemctl get-default
graphical.target

デフォルトのunitはgraphical.target。 findコマンドで探すとどうやら/lib/systemd/system/にあることがわかった。

# /lib/systemd/system/graphical.target
[Unit]
Description=Graphical Interface
Documentation=man:systemd.special(7)
Requires=multi-user.target
Wants=display-manager.service
Conflicts=rescue.service rescue.target
After=multi-user.target rescue.service rescue.target display-manager.s\
ervice
AllowIsolate=yes

Requiresに指定されているmulti-user.target、Wantsのdisplay-manager.serviceとgraphical.target.wants/にあるsystemd-update-utmp-runlevel.serviceが起動されていることになる。

multi-user.targetは

[Unit]
Description=Multi-User System
Documentation=man:systemd.special(7)
Requires=basic.target
Conflicts=rescue.service rescue.target
After=basic.target rescue.service rescue.target
AllowIsolate=yes
# ls multi-user.target.wants
console-setup.service       systemd-ask-password-wall.path
dbus.service                systemd-logind.service
getty.target                    systemd-update-utmp-runlevel.service
plymouth-quit.service                   systemd-user-sessions.service
plymouth-quit-wait.service

となっていて、この調子で見ていくと起動時に起こすserviceがどんどん出てくる。

なんとなく追ってみたものの特に書くほどの事が見つけられなかったので、Timer unitを使って起動後一定時間後にxmodmapコマンドを実行する独自unitを作ろうと思っていたけど、defaultのキーマップを変更する方法がようやく見つかったので、終了。。。

大まかなsystemdの仕組みが分かったしよいか。。。

https://help.ubuntu.com/community/Custom%20keyboard%20layout%20definitions?action=show&redirect=Howto%3A+Custom+keyboard+layout+definitions

参考