journald-remote

 結局よくわからないままであるが何となく転送されたっぽいのでメモ

 今、rsyslogでsyslogを転送しているのだが、もういい加減にsystemd-journalに移行したい。
 でも転送方法がわからなくて色々やっていた。
 systemd-jounarl-remote.serviceとsystemd-jounal-upload.serviceとか使えばよいのはわかっていたのだが、なんかうまくいってなかった。

 受け取り側のサーバーにDNS名降っておく。syslog.daionet.gr.jpにしておく

 両方のマシンにsystemd-journal-remoteをインストール

sudo apt install systemd-journal-remote

 受け取り側で、
パッケージをローカル用にコピーして編集する。
 systemctl edit systemd-journal-remote.service とかでもできそうな気がしたんだけど、overrideであって書き換えには向かないっぽい。
 同じエントリが2つあると怒られてしまうので全部コピーして一部編集する。
# 直接/lib/systemd/system/を書き換えると、アップデートで全部消えるのでローカル用は/etc/systemdにコピーする仕様らしい

cp /lib/systemd/system/systemd-journal-remote.service /etc/systemd/system/
cp /lib/systemd/system/systemd-journal-remote.socket /etc/systemd/system/

/etc/systemd/system/systemd-journal-remote.service の [Service] 内の
ExecStart=/lib/systemd/systemd-journal-remote –listen-http=-3 –output=/var/log/journal/remote/
# –listen-https=-3 を –listen-http=-3にする
 httpsにしたかったけどローカルだし証明書面倒だしとhttpにしてしまうことにした。

/etc/systemd/system/systemd-journal-remote.socket の [Socket] 内の
ListenStream=[2001:0db8::1]:19532
BindIPv6Only=yes
# ユニークローカルアドレスにするとかFWで守るとかして適当に保護。
# ListenStream=syslog.daionet.gr.jp:19532 とかやったらエラーになった。IPアドレスじゃないとダメっぽい

 systemctl start systemd-journal-remote.socket
・ここは.serviceじゃなくて.socketを起動する。起動時有効にするのも.socket

送信側で、
/etc/systemd/journal-upload.conf

[Upload]
URL=http ://syslog.daionet.gr.jp:19532

systemctl start systemd-journal-upload.service

 これで受信側の/var/log/journal/remote にコピーされた。
 全部のログをコピーしようとして異常に時間がかかったりしたので、あれこれやってなんとか切り抜けた(ぉ

 と。2つのマシンからjournalをコピーできたのはいいのだが。
 見る方法がわからないというオチが(滝汗

 とりあえずjournalctl –merge _HOSTNAME=hoge で見れるっぽいのだが、なんだかなぁ。

 blog書きながら調べてたらどうもjournalはコピーして使うというよりも、systemd-journal-gatewaydを使ってリモートに読む、が正解っぽい。
 でも死んだときに手元にログ欲しかったりしないでもないんだけどなぁ。あとブラウザだとめんどい(ぉ

2017/11/16 追記
 systemctl edit でうまく編集できない件について

 ExecStartとかListenStreamが複数行あるのが問題だったのだが、空行入れると以前のがキャンセルされるらしい。
ので、override.confに

[Socket]
ListenStream=
ListenStream=[2001:0db8::1]:19532
BindIPv6Only=yes

と一旦キャンセルかけてから書けば良いっぽい。

 日本語マニュアル欲しい……

fetchmail on systemd

昔から色々やってうまくできなかったのがやっとできた。

# 難しいわけじゃなくて理解してなかっただけだがw

debian/unstable/busterで、
/etc/systemd/user/fetchmail@.service :

[Unit]
Description=A remote-mail retrieval utility
After=network.target postfix.service

[Service]
Type=forking
ExecStart=/usr/bin/fetchmail -d 2000
ExecStop=/usr/bin/fetchmail --quit
RestartSec=1

[Install]
WantedBy=multi-user.target

 あとは一般ユーザーで
systemctl --enable now fethchmail@user.service
で良いようだ。
 最初、User=%IとかGroup=%Iとか付けてて失敗した。

fetchmail@user.service: Failed to determine supplementary groups: Operation not permitted
fetchmail@user.service: Failed at step GROUP spawning /usr/bin/fetchmail: Operation not permitted

等のエラーが出て、起動しなかった。
userユニットの場合は付けちゃダメっぽい。

aptとw3mとlibgpm

最近aptのbuildに失敗するなぁと思っていたのだが、実はw3mの問題だったというお話。

現在、gpmにはexperimentalが来ていて、1.20.7-1と1.20.4-6.2があるのだが、libgpmに依存しているw3mとかemacsにはバージョン条件が入っていなくて、experimentalだと動かない、という問題がある。

で、aptのbuild-depにはw3mが入っていてw3mが使われているのだが、そこでw3mを起動しようとするとエラーになっていたのだが、見た目エラー内容がわからないために何でエラーになっているのかわからない状態になっていた。

たまたまhtmlで書かれたメールをemacsのwanderlustで見ようとしたら、w3mでフォーマットしようとして失敗する、というのを発見してあれ?と思ったのがきっかけ。

とりあえずlibgpm-devとlibgpm2をunstable 1.20.4-6.2にしてみたらaptのbuildもできたし、htmlメールも(一応)見れるようになった。

void time

最近全く新月の願いやってないなーと思いつつ、Googleカレンダーに新月とvoid timeの登録をやってみた。

まずはStargazerでヴォイドタイム時期表と進行経過時期表で、void timeと、太陽・月のコンジャンクションの時間を出す。

Excelでgoogleのcsvに合うように変形してインポート。
とりあえず、新月は48時間設定してみる。

誰か作ってそうなんだけどなぁ・・・

systemdとGNU screen

なんか設定変えた記憶ないのに動作が変わってしまったGNU screen。

いくつか自前でパッケージ再作成してたりexperimentalからもらってきたりしてるからその関係かもしれないけど。

探しているとまず見つかるのは
/etc/systemd/logind.conf に KillUserProcesses=No を書け。
だった。
書いてみたけど動作が変わらない。
systemctl daemon-reloadもやってみたけど同様。
もしかしたら要再起動だったりするかもしれないけどとりあえず保留。

screenを起動するときに systemd-run –scope -user screen で起動しろ、ってのもあったけど、これもダメ
だった。

別の端末(別窓teraterm)からscreen -R -DD するとちゃんとセッション切り替わるのだが、screenの動いているTeratermを終了させるとそのタイミングでscreen下のプロセス全部killされるっぽい。

今までどうして動いてたんだ、という気もしつつ、よくよく調べてみたら、
loginctl enable-linger user
しろというのがあったのでやってみたら、ビンゴ。

とりあえず一発loginctl enable-linger打っておいて、あとは
systemd-run –scope –user screen -R -DD
を.bashrcでばばそ、で今まで通りになったっぽい。

前はKillUserProcesses=No だけでできてたと思ったんだけどなぁ