systemdの各種コマンドメモ

systemd関連のコマンドで面白そうなものを適当に。

systemd-catはコマンドの出力結果をjournalに書き込んでくれる。 例えば↓を実行してからjournalctlでログを見ると、

masami@saga:~$ systemd-cat ls -la /usr/bin/gcc

このように出力される。

Oct 12 14:28:48 saga [882]: -rwxr-xr-x 3 root root 820592 Sep  8 02:55 /usr/bin/gcc

コマンドの出力結果はpipeでsystemd-catに渡してもOK。

起動に掛かった時間の分析等ができる。 このようにカーネル側、ユーザーランド側の時間は別で見れる。

masami@saga:~$ systemd-analyze
Startup finished in 2.167s (kernel) + 5.719s (userspace) = 7.886s

さらにblameオプションを付けることでunitの実行に掛かった時間をsortして出力してくれる。ちなみに、ウチの場合はGUIのloginに使ってるlightdmのlightdmユーザー設定のところが一番時間かかってますね。

masami@saga:~$ systemd-analyze blame
          1.541s user@620.service
          1.007s privoxy.service
           568ms home.mount
           407ms systemd-fsck@dev-disk-by\x2duuid-a72c84bb\x2dc5bc\x2d47e2\x2d8e35\x2dc9430f4f02d5.service
           261ms libvirtd.service
           213ms dhcpcd.service
           171ms kdump.service

これはcgroupの階層を表示するコマンド。オプションを渡さない場合はこんな感じでsystemdに関するものがtree構造で出力される。ここで出力しているのは /sys/fs/cgroup/systemd/{system.slice,user.slice}の内容。

├─1 /sbin/init
├─system.slice
│ ├─dbus.service
│ │ └─387 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation
│ ├─privoxy.service
│ │ └─437 /usr/bin/privoxy --pidfile /run/privoxy.pid --user privoxy.privoxy /etc/privoxy/config
│ ├─dhcpcd.service
│ │ └─430 /usr/bin/dhcpcd -q -b
│ ├─redis.service
│ │ └─433 /usr/bin/redis-server 127.0.0.1:6379
│ ├─lightdm.service
│ │ ├─416 /usr/bin/lightdm
│ │ └─422 /usr/bin/Xorg.bin :0 -seat seat0 -auth /run/lightdm/root/:0 -nolisten tcp vt1 -novtswitch
│ ├─systemd-journald.service
│ │ └─185 /usr/lib/systemd/systemd-journald
│ ├─upower.service
│ │ └─669 /usr/lib/upower/upowerd
│ ├─systemd-timesyncd.service
│ │ └─378 /usr/lib/systemd/systemd-timesyncd
│ ├─systemd-logind.service
│ │ └─386 /usr/lib/systemd/systemd-logind
│ ├─libvirtd.service
│ │ ├─435 /usr/bin/libvirtd
│ │ ├─542 /sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --dhcp-script=/usr/lib/libvirt/libvirt_leaseshelper
│ │ └─543 /sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --dhcp-script=/usr/lib/libvirt/libvirt_leaseshelper
│ ├─systemd-networkd.service
│ │ └─405 /usr/lib/systemd/systemd-networkd
│ ├─sshd.service
│ │ └─434 /usr/bin/sshd -D
│ ├─systemd-udevd.service
│ │ └─199 /usr/lib/systemd/systemd-udevd
│ ├─rpcbind.service
│ │ └─418 /usr/bin/rpcbind -w
│ └─polkit.service
│   └─583 /usr/lib/polkit-1/polkitd --no-debug
└─user.slice
  ├─user-1000.slice
  │ ├─user@1000.service
  │ │ ├─562 /usr/lib/systemd/systemd --user
  │ │ └─563 (sd-pam)
  │ └─session-c2.scope
  │   ├─  548 lightdm --session-child 13 20
  │   ├─  565 /bin/sh /etc/xdg/xfce4/xinitrc -- /etc/X11/xinit/xserverrc

これはcpu、memoryなどのリソースの利用率が高いものをcgroup単位で表示してくれる。

f:id:masami256:20141012145746p:plain

libのパスとか各種パスを教えてくれる。system wideなディレクトリだけでなくてuser固有のもの(HOME、デスクトップ、ドキュメントとか)も表示される。

masami@saga:~$ systemd-path
temporary: /tmp
temporary-large: /var/tmp
system-binaries: /usr/bin
system-include: /usr/include
system-library-private: /usr/lib
system-library-arch: /usr/lib
system-shared: /usr/share
system-configuration-factory: /usr/share/factory/etc
system-state-factory: /usr/share/factory/var
system-configuration: /etc
system-runtime: /run
system-runtime-logs: /run/log
system-state-private: /var/lib
system-state-logs: /var/log
system-state-cache: /var/cache
system-state-spool: /var/spool
~ 略 ~

試していないんだけど、manを軽く見た感じだと新しいNamespaceを作り、引数で渡されたディレクトリにchrootしてコマンドを実行するらしい。 chroot先は普通にローカルファイルシステムでも良いし、ディスクイメージでも良いみたい。 Spawn a namespace container for debugging, testing and buildingと言っているのでちゃんとしたコンテナ環境が欲しいh場合はlxcなりdockerなり使えというところでしょうね。