crontab から送信される電子メールの件名を指定したい

crontab で実行されたコマンドの出力はメールで送られますが,このときの件名は「Cron <ユーザ名@ホスト名> 実行コマンド」のようになります.

crontab 例
15 7 * * *  echo "cron subject"
メール例
Subject: Cron <matoken@T430s> echo "cron subject"

cron subject
1つのhostからこんなメール飛んで来るとどれがどれかわかりづらい
Cron <matoken@T430s> nice -n 19 ionice -c 3 rsync -avxze "ssh -i……
Cron <root@T430s> nice -n 19 ionice -c 3 rsync -avxze "ssh -i……
Cron <root@T430s> nice -n 19 ionice -c 3 rsync -avxze "ssh -i……

分かりづらいので自分で件名を付けたいところです.

: を利用する

: は shell の組み込み関数で何もせず正常終了します.
コマンドなので # と違い,; の後にコマンドを書くとその後のコマンドは解釈されます.

$ :           #何もしない
$ : hoge
$ : echo hoge
$ : rm -rf *
$ : $(hostname)  #コマンドも展開せず何もしない
$ : `whoami`
$ : hoge; echo fuga   #;の後は解釈される
fuga
$ # hoge
$ # hoge; echo fuga

これをcrontabの頭に書くとこういう感じになります.

crontab
29 6 * * *  : cron subject; echo "hello"
mail
Subject: Cron <matoken@T430s> : cron subject; echo "hello"

hello

少しわかりやすくなりました.

mailコマンドを利用する

これはちょっと反則な感じがするのですが件名にコマンド実行結果を入れたり,頭の部分も書き換えたい場合はcronだけではできなさそうなのでmailコマンド経由で送信してみます.今回mailutilsのmailコマンドを利用しましたが,bsd-mailxやmutt等々ももちろん使えます.

crontab
45 6 * * *  echo "cron test" | mail -s "$(hostname)@$(whoami) cron Subject : $(date +\%F)" matoken+cron@example.com
mail
Subject: T430s@matoken cron Subject : 2018-09-13
X-Mailer: mail (GNU Mailutils 3.4)

cron test

mail コマンドの -s オプション部分が件名になります.その後ろが宛先のメールアドレス.bodyはcronの出力をパイプから受け取ります.

STDERR が別メールで届く

STDERR の出力があった場合cronでメールが送られてしまいます.mailコマンドと合わせて1度に2通届くことに.
実行コマンドの後ろに 2>&1 を付けて STDERR を STDOUT に渡してmailコマンドだけにします.

crontab
45 6 * * *  echo "cron test" 2>&1 | mail -s "$(hostname)@$(whoami) cron Subject : $(date +\%F)" matoken+cron@example.com

出力がなくてもメールが届く

crontab の場合コマンドの出力がなければメールが送られませんが,このコマンドでは NULL でもメールが送信されます.
未解決.

余録

cronで一切メールを送りたくない

場合crontabで MAILTO=”” を設定する
MAILTO=""

指定したコマンドだけメールを送りたくない

STDOUT と STDERR を /dev/null に捨てる
20 6 * * *  echo "cron subject" > /dev/null 2>&1

メールが届かない

/var/spool/mail/ユーザ名 のローカルにはメールがどとくけど,インターネット上のメールアドレスを指定しても届かない場合メールサーバの設定が出来ていないかもしれません.メールサーバ(sSMTP/msmtp等はデーモンが起動しないのでメールを受け取らず送信するだけならおすすめ)を設定してから再度試してみましょう.

環境1
$ man cron | grep -m1 cron
       cron - daemon to execute scheduled commands (Vixie Cron)
$ dpkg-query -W cron mailutils
cron    3.0pl1-128.1ubuntu1
mailutils       1:3.4-1
$ lsb_release -d
Description:    Ubuntu 18.04.1 LTS
$ uname -m
x86_64
環境2
$ man cron | grep -m1 cron
       cron - 予定されたコマンドを実行するデーモン(Vixie Cron)
$ dpkg-query -W cron mailutils
cron    3.0pl1-130
mailutils       1:3.4-1+b1
$ lsb_release -d
Description:    Debian GNU/Linux unstable (sid)
$ uname -m
x86_64

Debian stretch で php5 / php7.0 を切り替え

update-alternatives で OK かなと思ったのですが,

$ sudo update-alternatives --config php
There are 2 choices for the alternative php (providing /usr/bin/php).

  Selection    Path             Priority   Status

--------------------

* 0            /usr/bin/php7.0   70        auto mode
  1            /usr/bin/php5     50        manual mode
  2            /usr/bin/php7.0   70        manual mode
  Press <enter> to keep the current choice[*], or type selection number: 0
$ php -v
PHP 7.0.30-0+deb9u1 (cli) (built: Jun 14 2018 13:50:25) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies
    with Zend OPcache v7.0.30-0+deb9u1, Copyright (c) 1999-2017, by Zend Technologies

apache では php5 のままです.

$ w3m -dump http://localhost/phpinfo.php|grep -m1 'PHP Version'
PHP Version 5.6.30-0+deb8u1

apache module を切り替えたらokでした.

$ sudo a2dismod php5
$ sudo a2enmod php7.0
$ systemctl restart apache2
環境
$ dpkg-query -W apache2 php5 libapache2-mod-php5 php7.0 libapache2-mod-php7.0
apache2 2.4.25-3+deb9u5
libapache2-mod-php5     5.6.30+dfsg-0+deb8u1
libapache2-mod-php7.0   7.0.30-0+deb9u1
php5    5.6.30+dfsg-0+deb8u1
php7.0  7.0.30-0+deb9u1
$ lsb_release -d
Description:    Debian GNU/Linux 9.5 (stretch)
$ uname -m
x86_64

trash-cli で cli でもゴミ箱利用

rm コマンドはとても強力です.バックアップもなく誤って削除したファイルは復旧できない可能性が高いです.
そこで rm の alias に rm -i を指定して確認メッセージを出すなどしている環境もありますが,いつも使っていると手癖で即削除してしまったりして確実ではありません.GUI環境のファイラーなどではゴミ箱機能が使えて削除してもゴミ箱を空にするまで復元が可能です.
これをcuiでも利用できる trash-cli というツールがあります.デスクトップと共通(freedesktop.org trashcanと共通)のゴミ箱が使えて便利です.

削除してしまったファイルを復元したい場合なるべく早く削除したファイルシステムを umount or mount -o ro してファイル復元ツールを試してみるともしかしたら復元できるかもしれません.Debian の場合 forensics-all/forensics-extra pkg 等を覗いてみると様々なツールが見つかると思います.(例えばext3/ext4ファイルシステムでの復元ツールのextundeleteや汎用のscalpel等)

導入
$ sudo apt install trash-cli
$ dpkg -L trash-cli|grep bin/
/usr/bin/restore-trash
/usr/bin/trash
/usr/bin/trash-empty
/usr/bin/trash-list
/usr/bin/trash-put
/usr/bin/trash-rm
trash ゴミ箱に捨てる
$ touch hoge  #ファイル作成
$ trash hoge  #ファイルを捨てる
$ mkdir -p hoge/fuga/piyo #ディレクトリ作成
$ trash hoge  #ディレクトリを捨てる
trash-list ゴミ箱の中を見る(同じ場所同じ名前のファイルもそれぞれ管理される)
$ trash-list | grep hoge
2018-09-11 05:36:19 /home/matoken/tmp/hoge
2018-09-12 08:57:31 /home/matoken/tmp/hoge
2018-09-12 08:37:09 /home/matoken/tmp/hoge
2018-09-12 08:57:35 /home/matoken/tmp/hoge
2018-09-12 08:36:56 /home/matoken/tmp/hoge
2018-09-11 05:36:34 /home/matoken/tmp/hoge
trash-empty ゴミ箱を空にする
$ trash-empty
$ trash-list
restore-trash 対話的にファイルを復元する
$ restore-trash
   0 2018-09-14 05:15:11 /home/matoken/tmp/piyo
   1 2018-09-14 05:13:22 /home/matoken/tmp/hoge
   2 2018-09-14 05:15:11 /home/matoken/tmp/fuga
What file to restore [0..2]: 0  #復元したいファイルの番号を指定
trash を rm の alias にする(alias にてオプションを付与してオプションは無視するようになっている)
$ alias rm='trash'
$ rm hoge
$ rm -rf dir

という感じで簡単に使えます.sudo を使うことも可能です.ゴミ箱の実体は環境によりますが,手元の環境では ~/.local/share/Trash/ 以下でした.このあたりは以下のページが参考になると思います.

ゴミ箱を空にしないとどんどんファイルは溜まっていきます.autotrash を使って掃除するのがおすすめです.

<追記>

Google+のコメントでmasakaさんに教えてもらったのですが,trash-empty 日付 と日付を指定することで日付以上の日数が経過したファイルが削除できるようです.日付指定だけならautotrash を導入しなくてもいいですね.

Masakazu Takahashi

ちなみにtrash-cliでも`trash-empty 30`とか実行すると、削除して30日超のファイルをゴミ箱から消してくれます。

man trash-emptyより
ARGUMENTS
       To remove all trashed files, use 'emtpy-trash'.

       To remove files that have been in the trash more than a given number of
              days, use 'trash-empty x', 'x' representing the number of days.

</追記>

環境
$ dpkg-query -W trash-cli
trash-cli       0.12.9.14-2.1
$ lsb_release -d
Description:    Debian GNU/Linux unstable (sid)
$ uname -m
x86_64

#trash-cli は現在 0.17.1.14 で 0.12.9.14 のリリース日は 15 Sep 2012 となっている.

autotrash でゴミ箱を自動清掃

ゴミ箱は便利ですがどんどん溜まっていくので定期的に捨てないといけません.気が向いたときにゴミ箱を空にするのでもいいのですがそれだと1月前にゴミ箱に入れて確実にゴミであろうファイルもさっきゴミ箱に入れたもしかしたら誤って削除したファイルも一緒に消すことになってしまい心配です.
autotrashを使うとゴミ箱に入れた日数やファイル名,空き容量が何GBより少なくなったなどの様々な条件によりゴミ箱内のファイルを削除することができます.crontabに登録しておくと自動化もできてお薦めです.

※以下はmanのexampleで日本語部分は間違っているかもしれません –dry-run と –verbose オプションを付けて動作確認をした上で使うようにしてください.

30日以上経過したファイルを削除
autotrash -d 30
          Purge any file that has been in the trash for more then 30 days.
ゴミ箱のファイルシステムの空き容量が1024MB(1GB)以下になるようファイルを削除.削除する場合30日以上経過したファイルが対象?
autotrash --max-free 1024 -d 30
          Only purge files from the trash if there is less than 1GB of space left on the trash filesystem. If so, only trash files that are older than 30 days.
ゴミ箱のファイルシステムの空き容量が2048MB(2GB)以下になるまで古いファイルから削除する?
autotrash --min-free 2048
          Purge files from trash, oldest first, till there is at least 2GB of space on the trash filesystem. There is no restriction on how old trashed files are.
ゴミ箱のファイルシステムの空き容量が2048MB(2GB)以下になるまでファイルを削除する.削除する場合はまず”*.bak”を削除して次に”\*.avi”その後は古いファイルから削除する?
autotrash --min-free 2048 -D '.*\.bak' -D '.*\.avi'
          Purge files from trash till there is at least 2GB of space on the trash filesystem. If we need to remove files, make sure we remove *.bak files first, then
          all *.avi files and after that the oldest to the newest. There is no restriction on how old trashed files can get. Please note that '.*\.bak' and '.*\.avi'
          are regular expressions and not glob patterns. Given that they are regular expressions, using -D '.*\.(png|gif|jpg|jpeg)' will match images with any of the
          given extensions.
ゴミ箱の容量が4000MBになるまでは何もしない,それ以上の場合は30日以上経過したファイルを削除し,ゴミ箱の容量が2048MB以下になるまで古いファイルから削除する?
autotrash --max-free 4000 --min-free 2048 -d 30
          Start  reading  the  trash  if there is less than 4000MB of free space, then start keeping an eye on. At that point, remove files older than 30 days and if
          there is less than 2GB of free space after that remove even newer files.

私は単純にゴミ箱に入れて33日経ったファイルを削除するようにしています.
この例では毎日02:08に優先度を下げて実行しています.vixie-cronの場合 @daily でもいいし, @reboot でシステム起動時に処理とかでもいいかもしれません.詳細は man 5 crontab を参照してください.

$ crontab -l|grep autotrash
8 2 * * *       nice -n 19 ionice -c 3 autotrash -d 33

ただ,これはゴミ箱を使っているユーザ毎に設定しないといけないのがちょっと面倒です.一人で使っているシステムならいいのですが,利用者が1000人だと /etc/crontab に1000行書くなどしないといけません.
autotrash 0.2.1 では -t オプションで全ユーザのチェックが出来るようです.(手元の環境では 0.1.5 なので未確認)

You can also make autotrash process all user trash directories (not just in your home directory) by adding this crontab entry:

@daily /usr/bin/autotrash -td 30
環境
$ dpkg-query -W autotrash
autotrash       0.1.5-1.1
$ lsb_release -d
Description:    Debian GNU/Linux unstable (sid)
$ uname -m
x86_64

#sidだけどupstreamに追従してないですね><

KeePassXC の Steam TOTP を試す

Steam ガードというスマートフォンアプリを使ったValve独自TOTPな多要素認証があります.これは通常のTOTP(rfc6238)と違い独自実装で数字だけではなくアルファベットも利用しているのでOATH ToolkitやGoogle Authenticatorでは認証できません.

Steam ガードのTOTPはValve独自ですが一応いくつかの実装はあります.(未検証)

KeepassXC にも TOTP(KeePassXC 2.2.0以降)と Steam ガードの TOTP(KeePassXC 2.3.0以降)がサポートされています.今回これを試してみました.

a generator for time-based one-time passwords (TOTP)
Add support for Steam one-time passwords [#1206]

しかし,これらを試すにはSteam Guard Mobile Authenticatorを設定したスマートフォンの中からTOTPの秘密鍵を入手する必要があります.以前のAndroidではadb backup するだけで鍵の書かれたファイルが入手できていたらしいのですが現在は暗号化されていてこの手順では入手できないようです.
GitHubにAPKにpatchするscriptが公開されていたのでまずはこれを試してみました.

これがうまく行けば以前のようにadb backupが出来るようになるはずです.しかし,バージョンの問題か失敗しました.

別の方法としてAndroidのroot取得済み端末にSteam Guard Mobile Authenticatorを導入してこちらの端末を有効にして秘密鍵を取得しました.

rooted端末から設定ファイルを抜き出してトークン取得
$ adb shell #Android shellを起動してファイル名を確認
1|shell@MK16i:/ $ su
root@MK16i:/ # ls -l /data/data/com.valvesoftware.android.steam.community/files/
-rw-rw---- u0_a59   u0_a59        448 2018-08-31 22:25 Steamguard-76561198085918260
root@MK16i:/ # exit
root@MK16i:/ $ exit #AndroidからexitしてPCに戻る
$ adb root  #rootになる
$ adb pull /data/data/com.valvesoftware.android.steam.community/files/Steamguard-76561198085918260  #ファイル取得
$ adb kill-server  #adb server終了
$ file Steamguard-76561198085918260
Steamguard-76561198085918260: ASCII text, with very long lines, with no line terminators
$ lv Steamguard-76561198085918260
$ jq .uri Steamguard-76561198085918260 | sed -e 's/^.*=\(.*\)&.*$/\1/'  #鍵表示
OXYBZQLEOB7KKFAPERMN8EGNOLJWEDYZ
$ shred -uz Steamguard-76561198085918260  #ファイル消去

取得した鍵をKeePassXCに登録してみます.
Steamの設定上で右クリック,「タイムベースワンタイムパスワード」→「TOTP の設定…」から「キー」に設定します.
登録した後Steamの設定上で右クリック,「タイムベースワンタイムパスワード」→「TOTP を表示」でトークンが表示できます.
29467671377 1a01b3ce35

Androidスマートフォンアプリと見比べてみると同じトークンが表示され,Steamにもloginできます :)

43687930524 4260e0f2a6

[

Steam Guard Mobile Authenticatorは同時に1端末しか登録できず,2台目を設定すると1台目の端末の鍵が無効にされます.なのでKeePassXCを利用する場合はroot端末と併用するか,root端末から消してKeePassXCのみで運用するしかなさそうです.

複数の携帯電話で Steam アカウントを認証できますか?
いいえ、ひとつのアカウントで一度に有効化できる認証機器はひとつだけです。

もう一つ問題が.KeePassXCにはcli版が同梱されているのですが,バージョン2.3.4時点ではTOTPのオプションが見当たりません.GUIのみの利用となりそうです.

$ keepassxc-cli -h
Usage: keepassxc-cli [options] command
KeePassXC command line interface.

Available commands:
add            Add a new entry to a database.
clip           Copy an entry's password to the clipboard.
diceware       Generate a new random diceware passphrase.
edit           Edit an entry.
estimate       Estimate the entropy of a password.
extract        Extract and print the content of a database.
generate       Generate a new random password.
locate         Find entries quickly.
ls             List database entries.
merge          Merge two databases.
rm             Remove an entry from the database.
show           Show an entry's information.


Options:
  -h, --help     Displays this help.
  -v, --version  Displays version information.

Arguments:
  command        Name of the command to execute.
$ keepassxc-cli -v
2.3.4
環境
$ dpkg-query -W keepassxc
keepassxc       2.3.4+dfsg.1-1
$ lsb_release -d
Description:    Debian GNU/Linux unstable (sid)
$ uname -m
x86_64

Google Chrome 69 でURLのサブドメインが表示されなくなったのを表示する

<追記>
69.0.3497.92 で修正された

chrome://flags/#omnibox-ui-hide-steady-state-url-scheme-and-subdomains を「Default」に戻してもサブドメインが省略されないのを確認 :)
</追記>

Google Chrome 69 で アドレスバーの表示が変わりました.例えば www.matoken.org で www が見えなくなり,matoken.org と表示されるようになりました.
更に,www.hoge.www.matoken.org は hoge.matoken.org に見えるというおそらくバグであろう挙動も><

42739367390 9acbb565de

Workaround として,chrome://flags/#omnibox-ui-hide-steady-state-url-scheme-and-subdomains を Disabled にすると以前の挙動になります.

30678044578 41d01a41ff

Chromium 69.0.3497.81-3 は既定値で以前と同じ動作のようです.

環境
$ dpkg-query -W google-chrome-stable chromium
chromium        69.0.3497.81-3
google-chrome-stable    69.0.3497.81-1
$ lsb_release -d
Description:    Debian GNU/Linux unstable (sid)
$ uname -m
x86_64

ヘッデンを探す

先日日が落ちてから自転車のメカトラブルに遭遇しました.前照灯は2つあったのですが,ヘッデンを持っていなかったので手元を照らすのに片手が取られて作業がしにくかったです.やっぱりヘッデン持ち歩きたいなと思いました.
New photo added to gallery
手持ちのヘッデンは PETZL Zipka の初期の頃のモデル.結構満足していたのですが,ボディーが割れていて持ち運ぶのに躊躇します.軽くぶつけたりするとバラけて電池やパーツが散らばってしまいます.10年ほど前に横浜のmyXで買ったものなのでしょうがないというかまだ使えてるのがすごいと考えたほうがいいかな?

IMG_20180903_024654

日本カタログで後継を探すと同じ名前のモデルがありました.

ZIPKA® ジプカ
¥4,200 (税込 ¥4,536)
近距離照射や短時間の活動に適した超コンパクトヘッドランプ
レッド/ブラック
200 lm 60 m 240 h 66 g
単四アルカリx 3
IP X4 防滴型

巻取りリールもそのままでだいたい同じスペックです.赤LEDと防滴機能が増えて点滅機能がなくなっている感じ.点滅機能は点滅感覚が長くて自転車にはあまり使えなかったのでなくなっても大丈夫そう.
オプションでリチャージャブルバッテリーも存在するようです.長時間の活動には便利そうだけど主に非常用なのでいらないかな?

e+LITE というモデルも気になります.

e+LITE® イーライト
¥3,600 (税込 ¥3,888)
超コンパクトエマージェンシーヘッドランプ
ホワイト/ブラック
50 lm 10 m 12 h 26 g
2x lithium CR2032
IP X7 防水型

光量が少ないけれど非常時に手元を照らすだけなら十分そう.軽量で防水や点滅機能があるので自転車のヘルメットにつけっぱなしにするのもいいかもしれません.
ただ,前モデルまでは巻取りコードだったのがこのモデルではヘッドバンドに変わっています.巻取りコード式は頭だけでなく手首やヘルメット,ハンドルバーなどいろいろなところに簡単に取り付け取り外しできるのが気に入っているのでできれば巻取り式が使いたいです.
巻取りコード式の前モデルが売っているところもあるのですが,定価より高くなっているので手を出しづらいです.

他のメーカーも探してみるといいのかもと思いましたが,巻取りリール式は見当たらないです.PETZL が権利を持っているのかもしれないですね.

  • PETZL(ペツル) E93AB ジプカ レッド

  • PETZL(ペツル)ヘッドライト ジプカ E93ABA

  • Petzl ペツル CORE コア ハイブリッドモデル専用バッテリー  新製品 (※充電式バッテリー)

  • PETZL(ペツル) e+LITE イーライト E02 P4

  • PETZL(ペツル) ヘッドライト イーライト E02P3e+ライト (※巻取り式旧製品)

補修するのもありかな?でもBONDICだとお店によっては e+LITE が変える値段…….接着剤でもいいかな?

Google Chrome からエクスポートしたパスワードリストを KeepassXC にインポート

人に説明するのに手元で試したのですがせっかくなのでblogに

Google Chrome のパスワードマネージャは使っているけれど,汎用的なKeepassXC に移行なメモです.

Google Chrome からパスワードのエクスポート

「設定」→「パスワードとフォーム」→「パスワードを管理」
若しくは chrome://settings/passwords にアクセス.

「︙」を押して「パスワードをエクスポート」から「パスワードをエクスポート…」から適当な場所にパスワードを保存します.

42595980870 d5446a65ee

30536920508 8d62cb50bd

KeepassXC へのインポート

KeepassXC を起動して,「CSVからインポート」を選びます.

43503758335 aa7e31c143

列のレイアウトを以下のようにしてインポートします.

  • Title : 列1

  • Username : 列3

  • Password : 列4

  • URL : 列2

44404975011 57f063d488

ウェブブラウザへの拡張機能の導入

利用するウェブブラウザに拡張機能を導入する.

KeepassXC の「ツール」→「設定」の「ブラウザー統合」で利用するウェブブラウザを有効にする.

42603172110 1770a7e23f

後はよしなに.

環境
$ dpkg-query -W keepassxc google-chrome-stable
google-chrome-stable    68.0.3440.106-1
keepassxc       2.3.1+dfsg.1-1
$ lsb_release -d
Description:    Debian GNU/Linux unstable (sid)
$ uname -m
x86_64

DNSキャッシュサーバなアドブロッカーのPi-holeを試す

2018-08-18 の鹿児島Linux勉強会 2018.08 で発表したものに加筆修正したもの.

アドブロッカー?

  • 広告をブロック

  • ブラウザの拡張機能などで実現するのが一般的(重い&ブラウザ毎に設定が必要)

    • uBlock Origin

    • プライベートブラウジングモードでは(基本的に)利用できない

  • スマートフォンは?

    • rootなどが必要(ウェブブラウジングは拡張機能や広告ブロック機能のあるウェブブラウザなどで回避可能)

Pi-hole

29084865297 4f02afec31

  • DNSキャッシュサーバとして動作して広告をDNSベースでブロック

    • PC側では設定不要 or DNS設定のみ

    • 軽い

  • Webベースの管理画面が利用可能

  • DNS以外にDHCPサーバ機能も利用可能

動作要件

名前にPiとついているし事例が多いがRaspberry Pi以外でも動作する

Hardware
Pi-hole is very lightweight as it only handles DNS queries and returns a blank HTML file so it doesn’t need much processing power.

~52MB of free space
512 MB RAM
Software
Pi-hole will run on most Debian-based distro’s and is the preferred platform for it.

We officially support the following:

Raspbian: Jessie/Stretch
Ubuntu: 16.04 / 16.10
Debian: 8 / 9
Fedora 26
CentOS: 7 (not ARM)

導入例

お手軽なインストールscriptが用意されている
公式ページでは,

curl -sSL https://install.pi-hole.net | bash

とはいえ怖いので,こんな感じで入れた

$ wget -O basic-install.sh https://install.pi-hole.net
$ lv basic-install.sh
$ sudo porg -lp pi-hole bash ./basic-install.sh
  • インストーラはTUIでいくつかの選択肢が表示される

  • 設定はこのあたりに/etc/pihole/setupVars.conf

  • アンストーラーもついているが,パッケージ周りとか面倒(導入済みだったかどうか関係なく関連パッケージを1つづつ確認しないといけない)なのでchroot環境などで試したほうが良い

44003211731 7da5e55b53

DNSの選択

  • Public DNS各種もしくはCustomから任意のDNSが指定可能

  • 今回は自分の家のUnboundを指定

  • 必要なパッケージは自動で導入される

43284561304 664a4c6675
44003212211 af3c239901

ad listの選択

43284561514 57f8f88c59

Protocolの選択

44003212531 6105935e3a

Web管理画面有効無効

43284561704 abff464168
44003212851 7e3c626b79

ログ

43284561874 54e4f14dbd

インストール完了

この画面はメモしておきましょう

44003213001 bbcd67ffcd

もしパスワードを忘れたら

$ pihole -a -p
Enter New Password (Blank for no password):
Confirm Password:
  [✓] New password set

端末のDNSをPi-holeに向けて試す(adhoc)

ネットワークのDNSをPi-holeのipにします

nm-applet

42224130270 b14c28b364

/etc/resolv.conf
nameserver 192.168.2.211

ネットワーク全体に反映

  • DHCPサーバからリリースされるDNS情報をPi-holeのものに差し替える

or

  • DHCPサーバをPi-holeに切り替える

    • Pi-holeのDHCPDは管理画面のSettings → DHCPから有効にできる

から有効にできる

VPN の nameserver に指定

自分は外では VPN を使うが,そのときこの nameserver を指定すると携帯回線でもパケットの消費が抑えられる効果もある

DNSが切り替わったか確認

確認例
$ dig example.com|grep -i server
;; SERVER: 192.168.2.211#53(192.168.2.211)

管理画面

ダッシュボード

43115604235 f07c9c9060

log

43973290462 5af9c902d5

システム情報

29084598777 90979e5772

広告ブロックリスト管理

43303343644 0e3b2de779

DNS設定

30153543558 3e368f177f

DHCP設定

30153549218 78f1098ff5

API/Web管理画面設定

42212991130 cc6ea1e357

プライバシー設定

43973382062 ca95d2fd21

テレポーター(設定のインポートエクスポート)

43973387132 fed8d96213

ログからホワイトリストブラックリストに

ログからドメインをホワイトリスト,ブラックリストに移動できる

43301172114 e220a2a2bc
43113907005 3561309f64

WebIFはoption

pihole commandが存在する

help
$ pihole --help
Usage: pihole [options]
Example: 'pihole -w -h'
Add '-h' after specific commands for more information on usage

Whitelist/Blacklist Options:
  -w, whitelist       Whitelist domain(s)
  -b, blacklist       Blacklist domain(s)
  --wild, wildcard     Wildcard blacklist domain(s)
  --regex, regex       Regex blacklist domains(s)
                        Add '-h' for more info on whitelist/blacklist usage

Debugging Options:
  -d, debug           Start a debugging session
                        Add '-a' to enable automated debugging
  -f, flush           Flush the Pi-hole log
  -r, reconfigure     Reconfigure or Repair Pi-hole subsystems
  -t, tail            View the live output of the Pi-hole log

Options:
  -a, admin           Web interface options
                        Add '-h' for more info on Web Interface usage
  -c, chronometer     Calculates stats and displays to an LCD
                        Add '-h' for more info on chronometer usage
  -g, updateGravity   Update the list of ad-serving domains
  -h, --help, help    Show this help dialog
  -l, logging         Specify whether the Pi-hole log should be used
                        Add '-h' for more info on logging usage
  -q, query           Query the adlists for a specified domain
                        Add '-h' for more info on query usage
  -up, updatePihole   Update Pi-hole subsystems
                        Add '--check-only' to exit script before update is performed.
  -v, version         Show installed versions of Pi-hole, Web Interface & FTL
                        Add '-h' for more info on version usage
  uninstall           Uninstall Pi-hole from your system
  status              Display the running status of Pi-hole subsystems
  enable              Enable Pi-hole subsystems
  disable             Disable Pi-hole subsystems
                        Add '-h' for more info on disable usage
  restartdns          Restart Pi-hole subsystems
  checkout            Switch Pi-hole subsystems to a different Github branch
                        Add '-h' for more info on checkout usage

Pi-hole アップデートの確認とアップデート

Pi-holeのアップデート確認
$ pihole -up --check-only
[i] Checking for updates...
[i] Pi-hole Core: up to date
[i] Web Interface: up to date
[i] FTL: up to date
[] Everything is up to date!
Pi-holeのアップデート
$ pihole -up
広告ドメインリストの更新
$ pihole updateGravity
  [i] Neutrino emissions detected...
  [✓] Pulling blocklist source list into range

  [i] Target: raw.githubusercontent.com (hosts)
  [✓] Status: Retrieval successful

  [i] Target: mirror1.malwaredomains.com (justdomains)
  [✓] Status: No changes detected

  [i] Target: sysctl.org (hosts)
  [✓] Status: No changes detected

  [i] Target: zeustracker.abuse.ch (blocklist.php?download=domainblocklist)
  [✓] Status: No changes detected

  [i] Target: s3.amazonaws.com (simple_tracking.txt)
  [✓] Status: No changes detected

  [i] Target: s3.amazonaws.com (simple_ad.txt)
  [✓] Status: No changes detected

  [i] Target: hosts-file.net (ad_servers.txt)
  [✓] Status: No changes detected

  [✓] Consolidating blocklists
  [✓] Extracting domains from blocklists
  [i] Number of domains being pulled in by gravity: 157918
  [✓] Removing duplicate domains
  [i] Number of unique domains trapped in the Event Horizon: 134681
  [i] Number of whitelisted domains: 0
  [i] Number of blacklisted domains: 0
  [i] Number of regex filters: 0
  [✓] Parsing domains into hosts format
  [✓] Cleaning up stray matter

  [✓] Force-reloading DNS service
  [✓] DNS service is running
  [✓] Pi-hole blocking is Enabled
crontabに登録
# Pi-hole広告ドメインリスト更新
7 3 * * * pihole updateGravity | tee >$(telegram-msg-cron)
# Pi-hole アップデートチェック
11 3 * * *      if [ $(pihole -up --check-only|tail -1|grep -c 'Everything is up to date!') ]; then echo ''; else echo "${HOSTNAME} : please Pi-hole update!" | tee >$(telegram-msg-cron) ; fi

日本向け広告リストを追加してみる

$ echo 'https://280blocker.net/files/280blocker_host.txt' | sudo tee -a /etc/pihole/adlists.list
https://280blocker.net/files/280blocker_host.txt
$ pihole -g

検索すると様々なドメインリストが存在する.用途に合わせて登録すると良さそう.

Pi-hole メリット,デメリット

  • メリット

    • 軽量で動作要件も低い

    • DNSベースなのでスマートフォンなどでもOK!(アプリ内の広告ブロックも)

    • ウェブブラウザの場合でも端末やブラウザ毎に個別に設定する必要がない

    • 設定も簡単で動作も管理画面で確認しやすい

    • 転送量も減る

  • デメリット

    • uBlock Originに比べると広告のブロック率が低い?(見ているsiteにも依るかも)

      • 拡張性があるので好みのリストを追加すれば良さそう

    • 今見えている広告をブロックしたいといったときにはブラウザの拡張機能のほうが便利

    • 広告の動きを確認するにはDNSを切り替える必要があり面倒

      • nm-appletだとPi-holeと通常DNSの設定をそれぞれ作っておくとワンタッチで切り替えられて便利
        43127431915 f050327120

        • PC → Pi-hole → Unbound → ISP

        • PC → Unbound → ISP

      • Wi-Fi AP を Pi-hole 利用とそうでないものの2つ用意する

家庭や小規模ネットワーク向け?

別解

Pi-holeのad listをそのままor整形して/etc/hostsに突っ込めばとりあえずblockできる
(UnboundやDnsmasqとかに入れても)

ad list
https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts
https://mirror1.malwaredomains.com/files/justdomains
http://sysctl.org/cameleon/hosts
https://zeustracker.abuse.ch/blocklist.php?download=domainblocklist
https://s3.amazonaws.com/lists.disconnect.me/simple_tracking.txt
https://s3.amazonaws.com/lists.disconnect.me/simple_ad.txt
https://hosts-file.net/ad_servers.txt
listの内容
$ wget -q -O - https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts | lv
  :
0.0.0.0 1493361689.rsc.cdn77.org
0.0.0.0 30-day-change.com
0.0.0.0 2468.go2cloud.org
0.0.0.0 adservice.google.nl
0.0.0.0 adsmws.cloudapp.net
  :
$ wget -q -O - https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts|lv
amazon.co.uk.security-check.ga
autosegurancabrasil.com
dadossolicitado-antendimento.sad879.mobi
hitnrun.com.my
maruthorvattomsrianjaneyatemple.org
  :

別解?

ウェブブラウジング時に広告だけでなくトラッキングなども考慮
このあたりはこまめに設定が必要なので一括管理は難しそう

Pi-hole

  • 導入が簡単

  • リソース少なめ

  • 管理画面がわかりやすい

  • 家庭や小規模ネットワーク向け?

QA

*BSDとかでは動かせない?

パッケージの確認と導入周りとネットワーク設定あたりを合わせればいけるのでは?
でもhostsやUnboundなどで設定したほうがきっと楽

広告がdomainではなくipで配信されるようになったら?

ipアドレスを Pi-hole の Block list に登録してみたら登録できた.しかしブロックはできなかった.iptablesなどでブロックする感じ?

Intel SSD 8MB bug に遭遇して困る

2018-07-21 の 鹿児島Linux勉強会 2018.07 で発表したものに少し加筆修正したものです.

一昨日 Intel SSD 8MBバグに遭遇><

  • 多分cpufreqの設定が甘くて離席時にCPUの熱でpoweroff
  • 起動しなくなった
  • BIOSからはSSD見える
  • 別メディアで起動するとfdisk -l で総容量 8MB

8MB bug

  • 一部のIntel SSDにあるバグ(今回はINTEL SSDSA2CW600G3)
  • 強制電源断時などに発症?
  • 8MBの容量しか見えない&使えない
  • データは救えない
  • secure eraseでとりあえず復活(データは消える)
  • 2011年の話なので最近該当デバイス使っている人は少ないと思う

8MBのdiskとして使ってみる……

普通に8MBのdiskとして利用できる.

$ sudo fdisk /dev/sdc
$ sudo fdisk -l /dev/sdc
ディスク /dev/sdc: 8 MiB, 8388608 バイト, 16384 セクタ
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
ディスクラベルのタイプ: dos
ディスク識別子: 0xa3850bcb
 
デバイス 起動 開始位置 最後から セクタ サイズ Id タイプ
/dev/sdc1 16 16383 16368 8M 83 Linux
$ sudo /sbin/mkfs.ext4 /dev/sdc1
$ sudo cp /boot/config-`uname -r` /media/mk/4a42767f-18bc-4250-9266-e61d41a47260/
$ ls -la /media/mk/4a42767f-18bc-4250-9266-e61d41a47260/
合計 229
drwxr-xr-x 3 root root 1024 8月 23 20:13 .
drwxr-x---+ 3 root root 4096 8月 23 20:11 ..
-rw-r--r-- 1 root root 216860 8月 23 20:13 config-4.15.0-32-generic
drwx------ 2 root root 12288 8月 23 20:11 lost+found
$ df /media/mk/4a42767f-18bc-4250-9266-e61d41a47260/
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sdc1 6899 289 6038 5% /media/mk/4a42767f-18bc-4250-9266-e61d41a47260
$ dd if=/dev/zero bs=4M | pv | sudo dd of=/media/mk/4a42767f-18bc-4250-9266-e61d41a47260/all
dd: '/media/mk/4a42767f-18bc-4250-9266-e61d41a47260/all' に書き込み中です: デバイスに空き領域がありません
12895+0 レコード入力
12894+0 レコード出力
6601728 bytes (6.6 MB, 6.3 MiB) copied, 0.0772058 s, 85.5 MB/s
6.36MiB 0:00:00 [73.4MiB/s] [ <=> ]
$ ls -la /media/mk/4a42767f-18bc-4250-9266-e61d41a47260/
合計 6676
drwxr-xr-x 3 root root 1024 8月 23 20:14 .
drwxr-x---+ 3 root root 4096 8月 23 20:11 ..
-rw-r--r-- 1 root root 6601728 8月 23 20:14 all
-rw-r--r-- 1 root root 216860 8月 23 20:13 config-4.15.0-32-generic
drwx------ 2 root root 12288 8月 23 20:11 lost+found
$ df /media/mk/4a42767f-18bc-4250-9266-e61d41a47260/
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sdc1 6899 6736 0 100% /media/mk/4a42767f-18bc-4250-9266-e61d41a47260

8MB bug 対処

  • secure erase により元の容量に復旧
  • もちろんデータは救えない……

secure erase の用意

$ sudo apt update
$ sudo apt install hdparm

状態確認

$ sudo fdisk -l /dev/sdb
Disk /dev/sdb: 8 MiB, 8388608 bytes, 16384 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

8MB><

$ sudo hdparm -I /dev/sdb
 
/dev/sdb:
 
ATA device, with non-removable media
        Model Number:       INTEL SSDSA2CW600G3
        Serial Number:      BAD_CTX     0000013F
        Firmware Revision:  4PC10362
        Transport:          Serial, ATA8-AST, SATA 1.0a, SATA II Extensions, SATA Rev 2.5, SATA Rev 2.6
Standards:
        Used: unknown (minor revision code 0x0029)
        Supported: 8 7 6 5
        Likely used: 8
Configuration:
        Logical         max     current
        cylinders       16383   256
        heads           16      1
        sectors/track   63      63
        --
        CHS current addressable sectors:       16128
        LBA    user addressable sectors:       16384
        LBA48  user addressable sectors:       16384
        Logical  Sector size:                   512 bytes
        Physical Sector size:                   512 bytes
        device size with M = 1024*1024:           8 MBytes
        device size with M = 1000*1000:           8 MBytes
        cache/buffer size  = unknown
        Nominal Media Rotation Rate: Solid State Device
Capabilities:
        LBA, IORDY(can be disabled)
        Standby timer values: spec'd by Standard, no device specific minimum
        R/W multiple sector transfer: Max = 16  Current = 16
        DMA: mdma0 mdma1 mdma2 udma0 udma1 udma2 udma3 udma4 udma5 *udma6
             Cycle time: min=120ns recommended=120ns
        PIO: pio0 pio1 pio2 pio3 pio4
             Cycle time: no flow control=120ns  IORDY flow control=120ns
Commands/features:
        Enabled Supported:
                Security Mode feature set
           *    Power Management feature set
           *    Write cache
           *    Look-ahead
           *    Host Protected Area feature set
           *    WRITE_BUFFER command
           *    READ_BUFFER command
           *    NOP cmd
           *    DOWNLOAD_MICROCODE
                SET_MAX security extension
           *    48-bit Address feature set
           *    Device Configuration Overlay feature set
           *    Mandatory FLUSH_CACHE
           *    FLUSH_CACHE_EXT
           *    General Purpose Logging feature set
           *    WRITE_{DMA|MULTIPLE}_FUA_EXT
           *    64-bit World wide name
           *    IDLE_IMMEDIATE with UNLOAD
           *    WRITE_UNCORRECTABLE_EXT command
           *    {READ,WRITE}_DMA_EXT_GPL commands
           *    Segmented DOWNLOAD_MICROCODE
           *    Gen1 signaling speed (1.5Gb/s)
           *    Gen2 signaling speed (3.0Gb/s)
           *    Phy event counters
           *    Software settings preservation
           *    SMART Command Transport (SCT) feature set
           *    SCT Write Same (AC2)
           *    SCT Error Recovery Control (AC3)
           *    SCT Features Control (AC4)
           *    SCT Data Tables (AC5)
           *    Data Set Management TRIM supported (limit 8 blocks)
           *    Deterministic read ZEROs after TRIM
Security:
        Master password revision code = 65534
                supported
        not     enabled
        not     locked
                frozen
        not     expired: security count
                supported: enhanced erase
        2min for SECURITY ERASE UNIT. 2min for ENHANCED SECURITY ERASE UNIT.
Logical Unit WWN Device Identifier: 500151795957940c
        NAA             : 5
        IEEE OUI        : 001517
        Unique ID       : 95957940c
Checksum: correct

症状

  • Serial Number: BAT_CTX
    8MBバグ中
        Serial Number:      BAD_CTX     0000013F
  • Security: frozen
    frozen状態ではこれ以上操作できないので解除の必要がある
                frozen

frozen 状態を解除

  • 起動した状態のまま SSD のデータケーブルを物理的に切断,接続
    LENOVO ThinkPad X201i / T430s(NotePC)ではデータケーブルだけの切断は出来ず,電源も同時に切断,接続したがOKだった.

    or

  • サスペンド,レジュームを行う
    LENOVO ThinkPad X201i / T430s(NotePC)で問題なかった.
    $ sudo sh -c "echo mem > /sys/power/state"

  • hdparm コマンドで not frozen になるっているのを確認

$ sudo hdparm -I /dev/sdb
   :
Security:
        Master password revision code = 65534
                supported
        not     enabled
        not     locked
        not     frozen
        not     expired: security count
                supported: enhanced erase
   :

SSDにパスワードを設定

  • 一時的なパスワード(secure eraseで消去される)だが次の手順で必要なのでメモしておく
    ここでは SOMEPASS
$ sudo hdparm --user-master u --security-set-pass SOMEPASS /dev/sdb

パスワードを解除する場合は以下のように一旦アンロックしてから解除する

$ sudo hdparm --user-master u --security-unlock SOMEPASS /dev/sdb
$ sudo hdparm --user-master u --security-disable SOMEPASS /dev/sdb

パスワードがわからなくなった場合メーカ規定値のマスターパスワードで解除できる場合がある.
その場合 --user-master m とマスターパスワードを指定する

再度ドライブの状態を確認

  • Securityセクションが以下のようにnot enabled から enabled になっていること
$ sudo hdparm -I /dev/sdb
   :
Security:
        Master password revision code = 65534
                supported
                enabled
        not     locked
        not     frozen
        not     expired: security count
                supported: enhanced erase
   :

Secure Erase

  • データの消去を行う
$ sudo hdparm -–user-master u –-security-erase-enhanced SOMEPASS /dev/sdb
  • うまく行かない場合( hdparmでsupported: enhanced eraseが無い場合 )以下のコマンドを試す
$ sudo hdparm --user-master u --security-erase SOMEPASS /dev/sdb

※–-security-erase-enhanced は代替処理された不良セクタも消去される.対応している場合こちらを使ったほうが確実にデータ消去が行える.

エラー

USB変換アダプタ経由の場合以下のようなエラーとなった.

$ sudo hdparm --user-master u --security-erase SOMEPASS /dev/sdb
security_password: "SOMEPASS"
 
/dev/sdb:
 Issuing SECURITY_ERASE command, password="SOMEPASS", user=user
The running kernel lacks CONFIG_IDE_TASK_IOCTL support for this device.
SECURITY_ERASE: Invalid argument

恐らくUSB変換部分で全ての機能がサポートされていないせい.
この状態でSATA接続すると起動時にHDD PASSWORDを尋ねられる.しかし,--security-set-passで設定したパスワードでは通らない.一旦USB変換アダプタに戻し,--security-disable でパスワードを消去した後SATA接続で再度やり直したらうまく行った.

hdparmコマンドで確認

  • Serial Number が正しくなっている :)
  • もちろん600GB全領域利用できる
$ sudo hdparm -I /dev/sdb
 
/dev/sdb:
 
ATA device, with non-removable media
        Model Number:       INTEL SSDSA2CW600G3
        Serial Number:      CVPR1206005W600FGN
        Firmware Revision:  4PC10362
        Transport:          Serial, ATA8-AST, SATA 1.0a, SATA II Extensions, SATA Rev 2.5, SATA Rev 2.6
    :

これでとりあえず復活

SSD の寿命確認

フラッシュメモリー自体はまだ健康に見える

$ sudo smartctl --all /dev/sda |grep -E '232|233'
232 Available_Reservd_Space 0x0033   100   100   010    Pre-fail  Always       -       0
233 Media_Wearout_Indicator 0x0032   100   100   000    Old_age   Always       -       0
E8 Available Reserved Space Normalized 10 予約領域の残っている数を表す。正規化した (Normalized) 値は、100 パーセントを表す 100 から始 まる。正常の範囲は 10 パーセントまで。
E9 Media Wearout Indicator Normalized 記録メディアであるフラッシュメモリーの使い込んだ程度 を表す。平均消去回数が増えるにつれ、正規化した (Normalized) 値が 100 から 1 へ減少していく。

再発防止(完全ではない)

  • firmwareを最新にする
  • 以下のページから入手する
    FirmwareUpdateTool_v3_0_1.zipissdfut_64_3.0.1.iso が入手可能
    前者の中にはドキュメントと後者のisoファイルが含まれていた

  • mkusb で USB memory に書き込んで起動

  • LENOVO T430s では起動に失敗した
  • LENOVO X201i では正常起動
  • 実際にアップデートできるかはもともと最新だったので未確認

最新のファームウェアバージョンは以下のページで確認できる

なお,最新にしてもこのバグは再発する可能性がある……(実際最新fwで2回このbugが発生した)

これ以上は,

  • バックアップをこまめに取る
  • サスペンドなどを行わない
  • なるべく電源のon/offを行わない
  • 安定した電源を利用する
  • バックアップをこまめに取る
  • バックアップをこまめに取る
  • バックアップをこまめに取る

現在はデイリーバックアップだけでなく /home は Lsyncd + rsync している

根本的な対処

SSDを交換する
TLCだと大分安い

その後

1月ほどで再発したorz
2回目は利用中に急にdiskが見えなくなったX201s/X220/X200で何年も使っていて起こらず,T430sにSSDを差し替えてから立て続けに起こっているのでマシンとの相性もありそう.

参考URL