letsencrypt-autoがなかなか自動化できない(本当に動くか未検証)

./letsencrypt-auto run -d akimasa.jp -d www.akimasa.jp -d blog.akimasa.jp --renew-by-defaultで自動化できると思いきや、いろいろと足りなかった。まず、crontabで実行するときの環境変数PATHが足りないようで、apacheが検出できない。PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/binを適当なシェルスクリプトの最初に書いておいて、そっから実行するようにした。
ほかに、引数として--no-redirect --non-interactive --apacheが足りていなかったので、ユーザーの操作を求められたり、プラグインの指定が無いと言われたりする。

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
./letsencrypt-auto run -d akimasa.jp -d www.akimasa.jp -d blog.akimasa.jp --renew-by-default --no-redirect --non-interactive --apache
を実行するようにしておいたらなんとかなった。ただ、一定期間に発行できる証明書の数をオーバーしてしまって発行できない状態なので、これが本当に機能するのか謎である。
ちなみに、実際のシェルスクリプトはslackへの通知を行う1> >(in="STDOUT:" postbot) 2> >(in="STDERR:" postbot)とかがついたり、postbotの関数があったりする。process substitutionではfdが返ってくるとよく知らなくて、echo "hogehoge" >(postbot)をやっても、何か変なゴミが出力されているし、postbotで何故か標準入力を受け取れないなあとか思ってしまった。echo "hogehoge" 1> >(postbot)と書くべきだったな

Raspberry Pi 2のmicroSDことmmcblk0への書き込みが多い問題

まずは、blktrace -d /dev/mmcblk0 -o - | blkparse -i - -a writeなりbtrace -a write /dev/mmcblk0なりで書き込みを行っているプロセスを特定…しようと思ったが、kworkerやbtrfs-transactiの書き込みが多いという事しかわからなかった…
179,0 1 45 30.198921748 9215 M WS 3148800 + 64 [kworker/u8:2]
みたいな感じで出力されているのだが、
3148800 + 64の部分がどうもkB単位のオフセットとサイズでは無いかと思い、dd if=/dev/mmcblk0 skip=3148800 count=64 bs=1024 | base64で読み取ってみた。そしたら、軒並みAAAAAAAAAAAAAAAAAAAAAだった。/dev/zeroを読み込んでいるのと同じですな。ゼロクリアされている…。いくつか拾ってみて見ただけなので、もしかしたら何か有効なデータがある場所もあるのかもしれない。
いろいろ調べていたら、fatraceというコマンドで、どのプロセスが書き込みを行っているか調べられるらしい事がわかった。
しかし、apt-getで入れたfatraceは動いてくれなかった。Raspberry Pi 2なのに、Raspbianを使わずcdebootstrapでセットアップしたDebian 8が動いているのが原因かもしれない。実行すると、Cannot initialize fanotify: Invalid argumentと怒られる。仕方が無いので、fatraceのコードを拾ってきて、fatraceのfanotify_initをfanotify_init (0, KERNEL_O_LARGEFILE);からfanotify_init (0, 0);に書き換えたらうまく動いてくれた。
./fatrace  | fgrep Wを動かしつつ、btrace -a write /dev/mmcblk0を眺めていたら原因がわかったっぽい。ログの書き込みが原因だった。ログファイルの書き込みの後に、kworkerやbtrfs-transactiの書き込みが始まっている様だ。btrfsをファイルシステムとして使っているのだが、btrfsはcopy on writeらしい。ログファイルが丸ごとコピーされて、追記されて、元あった空き領域は用済みなのでゼロクリアでもされたんだろうか。それだとしたら、書き込んだところを読み取ってもゼロなのが納得できる。
今のところ、SamsungのmicroSDカードは半年間、問題無く動き続いているが、これだけ書き込んでいればいつ壊れてもおかしくは無さそうな気がする。iostat情報だと、38KB/sで書き込みされているらしいので、半年で315GBWか…。microSDの容量は32GBなので、理想的にウェアレベリングされていても約10回は書き込んだことになる。あれ?思ったよりも少ない…。