rabbit-slide-znz-debian-meeting-202104 2021.4.17.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 3e88fb5a237aea57acf3b77a0ff5b0428abc148c28ee47866587b5e9d5190c67
4
+ data.tar.gz: 6559995b4d94199574095a0682c2efe8fcb24dee0600ce63203fdc5972cafdd7
5
+ SHA512:
6
+ metadata.gz: 15e73baab53f999f61be43e723809a59b7d555accd331d56e736c43f5711b77bdc0bb43419fc53875c461504eaae4c4ce3e520e568f452487982372d45b7097b
7
+ data.tar.gz: 38c208062c119f905ec741d9d94acdd44df5e0a1665c5a522dbdbd1c7d5e40c4c5a35858e1d0567fa9eceb74638cc96b10ad5ae87f0e623d522cf79fc9249ee8
data/.rabbit ADDED
@@ -0,0 +1 @@
1
+ debian-meeting-systemd.md
data/README.md ADDED
@@ -0,0 +1,24 @@
1
+ # systemd 再入門
2
+
3
+ [オンライン開催:東京エリア・関西合同Debian勉強会(2021/04/17(土))](https://debianjp.connpass.com/event/208924/)の発表資料です。
4
+ crontab の代わりに systemd-timer を使う、および user 権限での systemd の話です。
5
+
6
+ ## 作者向け
7
+
8
+ ### 表示
9
+
10
+ rake
11
+
12
+ ### 公開
13
+
14
+ rake publish
15
+
16
+ ## 閲覧者向け
17
+
18
+ ### インストール
19
+
20
+ gem install rabbit-slide-znz-debian-meeting-202104
21
+
22
+ ### 表示
23
+
24
+ rabbit rabbit-slide-znz-debian-meeting-202104.gem
data/Rakefile ADDED
@@ -0,0 +1,17 @@
1
+ require "rabbit/task/slide"
2
+
3
+ # Edit ./config.yaml to customize meta data
4
+
5
+ spec = nil
6
+ Rabbit::Task::Slide.new do |task|
7
+ spec = task.spec
8
+ # spec.files += Dir.glob("doc/**/*.*")
9
+ # spec.files -= Dir.glob("private/**/*.*")
10
+ # spec.add_runtime_dependency("rabbit-theme-YOUR-THEME")
11
+ end
12
+
13
+ desc "Tag #{spec.version}"
14
+ task :tag do
15
+ sh("git", "tag", "-a", spec.version.to_s, "-m", "Publish #{spec.version}")
16
+ sh("git", "push", "--tags")
17
+ end
data/config.yaml ADDED
@@ -0,0 +1,23 @@
1
+ ---
2
+ id: debian-meeting-202104
3
+ base_name: debian-meeting-systemd
4
+ tags:
5
+ - linux
6
+ - systemd
7
+ presentation_date: '2021-04-17'
8
+ presentation_start_time:
9
+ presentation_end_time:
10
+ version: 2021.4.17.0
11
+ licenses: []
12
+ slideshare_id: systemd-246336275
13
+ speaker_deck_id: systemd-zai-ru-men
14
+ ustream_id:
15
+ vimeo_id:
16
+ youtube_id:
17
+ author:
18
+ markup_language: :markdown
19
+ name: Kazuhiro NISHIYAMA
20
+ email: zn@mbf.nifty.com
21
+ rubygems_user: znz
22
+ slideshare_user: znzjp
23
+ speaker_deck_user: znz
@@ -0,0 +1,208 @@
1
+ # systemd 再入門
2
+
3
+ author
4
+ : Kazuhiro NISHIYAMA
5
+
6
+ content-source
7
+ : 東京エリア・関西合同Debian勉強会
8
+
9
+ date
10
+ : 2021-04-17
11
+
12
+ institution
13
+ : 株式会社Ruby開発
14
+
15
+ allotted-time
16
+ : 40m
17
+
18
+ theme
19
+ : lightning-simple
20
+
21
+ # 自己紹介
22
+
23
+ - 西山 和広
24
+ - Ruby のコミッター
25
+ - twitter, github など: @znz
26
+ - 株式会社Ruby開発 www.ruby-dev.jp
27
+
28
+ # systemd のおすすめ資料
29
+
30
+ - systemdエッセンシャル / systemd-intro - Speaker Deck
31
+ <https://speakerdeck.com/moriwaka/systemd-intro>
32
+
33
+ # agenda
34
+
35
+ - crontab の代わりに systemd-timer
36
+ - user 権限での systemd
37
+
38
+ # systemd-timer の利点
39
+
40
+ - `systemctl start` での動作確認と `timer` での実行の環境が同じ
41
+ - `journald` に自動でログが残る
42
+ - 他の `unit` との依存関係が設定できる (DB バックアップなら DB 起動必須など)
43
+ - 時刻指定が `crontab` より柔軟
44
+
45
+ # systemd-timer の欠点
46
+
47
+ - 最低限の利用でも記述量が多い
48
+ - `service` ファイルと `timer` ファイルが必要で 1 行だけでは出来ない
49
+ - 時刻指定が独自
50
+ - kubernetes の cronjob のような新しいものでも crontab 形式の時刻指定が使われていることが多い
51
+
52
+ # シンプルな使い方
53
+
54
+ - `Type=oneshot` の `service` ユニットを作成
55
+ - 同名の `timer` ユニットを作成して `systemctl enable --now foo.timer` のように `enable` と `start` をする
56
+ - 別の名前のユニットを `start` するなら `Unit=` で指定
57
+
58
+ # enable と start
59
+
60
+ - `foo.timer` から起動する `foo.service` は `enable` しない
61
+ - `foo.timer` も `enable` を忘れるとマシンの再起動後に動いていない (service unit と同じ)
62
+ - `systemctl start foo.service` で `timer` を待たずに起動して動作確認可能
63
+
64
+ # 動作確認例
65
+
66
+ - `systemctl list-timers`
67
+ - `systemctl status systemd-tmpfiles-clean.timer`
68
+ - `systemctl status systemd-tmpfiles-clean.service`
69
+
70
+ # ログの例
71
+
72
+ - ログ表示は `systemd-journal` グループに所属するか `sudo` を使う
73
+ - `journalctl -u systemd-tmpfiles-clean.timer`
74
+ - `journalctl -u systemd-tmpfiles-clean.service`
75
+ - `Starting` が実行開始時刻で `Started` が実行終了時刻
76
+
77
+ # service 作成例
78
+
79
+ ```
80
+ # /etc/systemd/system/gitlab-backup.service
81
+ [Unit]
82
+ Description=Backup gitlab
83
+ After=gitlab-runsvdir.service
84
+ Requires=gitlab-runsvdir.service
85
+
86
+ [Service]
87
+ Type=oneshot
88
+ ExecStart=/opt/gitlab/bin/gitlab-rake gitlab:backup:create CRON=1
89
+ ```
90
+
91
+ # service 作成例 (解説)
92
+
93
+ - `ExecStart` が `crontab` での実行内容に相当 (`ARGV0` の部分はフルパス必須)
94
+ - `crontab` 代わりで最低限必要なのは `Type` と `ExecStart`
95
+ - `After` や `Requires` で `gitlab` の service unit が動いているときだけバックアップを実行 (runsvdir 経由なので gitlab 全体が正常に動いているかどうかは未確認)
96
+
97
+ # timer 作成例
98
+
99
+ ```
100
+ # /etc/systemd/system/gitlab-backup.timer
101
+ [Unit]
102
+ Description=Backup gitlab
103
+
104
+ [Timer]
105
+ OnCalendar=*-*-* 2,14:00
106
+ Persistent=true
107
+
108
+ [Install]
109
+ WantedBy=timers.target
110
+ ```
111
+
112
+ # timer 作成例 (解説)
113
+
114
+ - `Persistent=true` は `anacron` 相当
115
+ - `crontab` 代わりで最低限必要なのは `OnCalendar` と `WantedBy`
116
+
117
+ # OnCalendar
118
+
119
+ - `systemd-analyze calendar '*-*-* 2,14:00'` などで `OnCalendar` の指定内容を確認可能
120
+ - 任意の時刻を基準にするには `faketime` コマンドと組み合わせて `faketime '2021-04-17 16:00' systemd-analyze calendar '*-*-* 2,14:00'`
121
+
122
+ # at コマンド代わり
123
+
124
+ - `systemd-run --on-active=30 /bin/touch /tmp/foo` で30秒後
125
+ - `systemd-run --on-active="1h 30m" --unit foo.service` で1時間半後
126
+ - `systemd-run --on-calendar="2021-04-17 16:00" /bin/touch /tmp/foo` のように日時指定も可能
127
+
128
+ # user 権限での systemd
129
+
130
+ - 特に設定していなければ `pam_systemd.so` で `/lib/systemd/systemd --user` が起動して、ログアウト時に終了
131
+ - `systemctl --user` で操作
132
+ - `loginctl enable-linger someuser` で常に起動 (`loginctl disable-linger someuser` で戻す)
133
+
134
+ # 動作確認
135
+
136
+ - 自ユーザーなら `systemctl --user status`
137
+ - 別ユーザーなら `sudo -u someuser XDG_RUNTIME_DIR=/run/user/$(id -u someuser) systemctl --user status`
138
+ - `sudo -u someuser systemctl --user status` だけだと `Failed to connect to bus: No such file or directory`
139
+
140
+ # unit ファイルの場所
141
+
142
+ - 普通は `~/.config/systemd/user/` に置く
143
+ - 全ユーザー共通なら `/etc/systemd/user/` に置くのも可能
144
+ - 全パスは `systemd.unit(5)` 参照
145
+
146
+ # Install の WantedBy
147
+
148
+ - system の unit なら `WantedBy=multi-user.target` を使うことが多い
149
+ - user の unit は `WantedBy=default.target` を代わりに使う
150
+
151
+ # unit ファイル例
152
+
153
+ ```
154
+ # /home/chatuser/.config/systemd/user/weechat.service
155
+ [Unit]
156
+ Description=A WeeChat client and relay service using Tmux
157
+ After=network.target
158
+
159
+ [Service]
160
+ Type=forking
161
+ RemainAfterExit=yes
162
+ ExecStart=/usr/bin/tmux -L weechat new -d -s weechat weechat
163
+ ExecStop=/usr/bin/tmux -L weechat kill-session -t weechat
164
+
165
+ [Install]
166
+ WantedBy=default.target
167
+ ```
168
+
169
+ # unit ファイル例 (解説)
170
+
171
+ - マシン起動時に `weechat` を `tmux` の中で自動起動
172
+ - 手抜きで `tmux` を手動終了したときの処理は省略
173
+ - 終了してしまったときはマシンを再起動している
174
+
175
+ # 動作確認例
176
+
177
+ - `sudo -u chatuser XDG_RUNTIME_DIR=/run/user/$(id -u chatuser) systemctl --user status weechat`
178
+ - `sudo -u chatuser XDG_RUNTIME_DIR=/run/user/$(id -u chatuser) journalctl --user -u weechat`
179
+
180
+ # /etc にあった例
181
+
182
+ ```
183
+ # ls /etc/systemd/user/sockets.target.wants/
184
+ dirmngr.socket gpg-agent-browser.socket gpg-agent-extra.socket
185
+ gpg-agent.socket gpg-agent-ssh.socket
186
+ # readlink /etc/systemd/user/sockets.target.wants/gpg-agent.socket
187
+ /usr/lib/systemd/user/gpg-agent.socket
188
+ # cat /etc/systemd/user/sockets.target.wants/gpg-agent.socket
189
+ [Unit]
190
+ Description=GnuPG cryptographic agent and passphrase cache
191
+ Documentation=man:gpg-agent(1)
192
+
193
+ [Socket]
194
+ ListenStream=%t/gnupg/S.gpg-agent
195
+ FileDescriptorName=std
196
+ SocketMode=0600
197
+ DirectoryMode=0700
198
+
199
+ [Install]
200
+ WantedBy=sockets.target
201
+ ```
202
+
203
+ # まとめ
204
+
205
+ - crontab の代わりに timer unit + service unit
206
+ - systemd-run は at の代わりになる
207
+ - user 権限での systemd は `loginctl enable-linger` で常時起動
208
+ - `~/.config/systemd/user/` に unit ファイル
metadata ADDED
@@ -0,0 +1,65 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rabbit-slide-znz-debian-meeting-202104
3
+ version: !ruby/object:Gem::Version
4
+ version: 2021.4.17.0
5
+ platform: ruby
6
+ authors:
7
+ - Kazuhiro NISHIYAMA
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2021-04-16 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rabbit
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 2.0.2
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 2.0.2
27
+ description: |-
28
+ [オンライン開催:東京エリア・関西合同Debian勉強会(2021/04/17(土))](https://debianjp.connpass.com/event/208924/)の発表資料です。
29
+ crontab の代わりに systemd-timer を使う、および user 権限での systemd の話です。
30
+ email:
31
+ - zn@mbf.nifty.com
32
+ executables: []
33
+ extensions: []
34
+ extra_rdoc_files: []
35
+ files:
36
+ - ".rabbit"
37
+ - README.md
38
+ - Rakefile
39
+ - config.yaml
40
+ - debian-meeting-systemd.md
41
+ - pdf/debian-meeting-202104-debian-meeting-systemd.pdf
42
+ homepage: http://slide.rabbit-shocker.org/authors/znz/debian-meeting-202104/
43
+ licenses: []
44
+ metadata: {}
45
+ post_install_message:
46
+ rdoc_options: []
47
+ require_paths:
48
+ - lib
49
+ required_ruby_version: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ required_rubygems_version: !ruby/object:Gem::Requirement
55
+ requirements:
56
+ - - ">="
57
+ - !ruby/object:Gem::Version
58
+ version: '0'
59
+ requirements: []
60
+ rubyforge_project:
61
+ rubygems_version: 2.7.6
62
+ signing_key:
63
+ specification_version: 4
64
+ summary: systemd 再入門
65
+ test_files: []