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の図
上の図を見るとわかりやすい
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の仕組みが分かったしよいか。。。
参考
- Linuxシステム[実践]入門
- http://qiita.com/a_yasui/items/f2d8b57aa616e523ede4
- http://enakai00.hatenablog.com/entry/20130914/1379146157
- https://freedesktop.org/wiki/Software/systemd/
- http://equj65.net/tech/systemd-boot/
- http://qiita.com/masami256/items/ef0f23125cf8255e4857#2-1
- http://enakai00.hatenablog.com/entry/20130917/1379374797