MuninでSMART情報を /dev/disk/by-id で表示する


MuninにはSMART情報を表示するプラグインがあらかじめインストールされていますが、普通に設定してもデバイスが ``/dev/sdX`` の形式で指定されます。
これだとディスクを抜き差ししたりしてデバイス名が変わったらちょっと面倒です。
``/dev/disk/by-id`` 以下であればシンボリックリンクを指定することになります。そのためデバイス名が変わってもシンボリックリンクの向く先が変わり、ディスク構成が変わっても今までのログが変わらないようになります。

``munin-node-configure --shell`` などを使うと、smart_sdaといった風にシンボリックリンクが貼られてしまいます。

```shell-session
% munin-node-configure --shell
ln -s '/usr/share/munin/plugins/smart_' '/etc/munin/plugins/smart_sda'
ln -s '/usr/share/munin/plugins/smart_' '/etc/munin/plugins/smart_sdb'
ln -s '/usr/share/munin/plugins/smart_' '/etc/munin/plugins/smart_sdc'
ln -s '/usr/share/munin/plugins/smart_' '/etc/munin/plugins/smart_sdd'
ln -s '/usr/share/munin/plugins/smart_' '/etc/munin/plugins/smart_sde'
ln -s '/usr/share/munin/plugins/smart_' '/etc/munin/plugins/smart_sdf'
ln -s '/usr/share/munin/plugins/smart_' '/etc/munin/plugins/smart_sdg'
```

munin-node-configure コマンドについてはこちら
[munin-node-configureコマンドを覚えた - ヌキのやる気のないエンジニアブログ](http://d.hatena.ne.jp/editnuki/20110726/1311649985)

なぜこうなってしまうのでしょうか。
MuninのSMART情報を表示するプラグインは、プラグインの実体（この場合だと ``/usr/share/munin/plugins/smart_``）を見るとわかるのですが、アンダースコア以降の文字を見て判断しています。
Pythonで書かれたコードの一部からそれを読み解くことができます。

> ```python:smart_
> # (省略)
> 
> def read_values(hard_drive):
>     global smart_values, emptyoutput
>     try :
>         verboselog('Reading S.M.A.R.T values')
>         os.putenv('LC_ALL','C')
>         device='/dev/'+hard_drive
>         if not os.path.exists(device):
>             device='/dev/disk/by-id/'+hard_drive
> 
> # (省略)
> ```
> https://github.com/munin-monitoring/munin/blob/100128eb1ae067c426466d43f3269a52b651b706/plugins/node.d/smart_.in#L112-L119 より引用
> 
> Author:
> (C) 2004-2009 Nicolas Stransky <Nico@stransky.cx>
> (C) 2008 Gabriele Pohl <contact@dipohl.de>
> 
> License: GPLv2

smart_sda という名前でシンボリックリンクを張ると、``/dev/sda`` のSMART情報を表示しますが、``smart_ata-ST2000DM001-1CH164_Z1E4PKGL`` のようにシンボリックリンクを張ると ``/dev/disk/by-id`` 以下を見るというコードになっていますね。

下記のコマンドを打つと、勝手に ``/dev/disk/by-id`` 以下のHDDの型番とシリアルからMuninプラグインのシンボリックリンクを張ってくれます（Ubuntu Server 14.04上でbashとzshで動作を確認しています）。

```shell-session
sudo /bin/ls -b -1 /dev/disk/by-id/ata-*[^-part]? | xargs -n 1 basename | sudo xargs -I % -t -n 1 ln -s /usr/share/munin/plugins/smart_ /etc/munin/plugins/smart_%
```

環境によってプラグインのある場所が異なることもあるので、適宜変更してください（全然ディレクトリ構成が違う環境がある場合コメントを頂けると幸いです）。

これで、HDDの型番とシリアルでSMARTのグラフを確認できます。

```shell-session
itochan@kurokami:/etc/munin/plugins% ll smart_*
lrwxrwxrwx 1 root root 31 Aug 23 22:43 smart_ata-KINGSTON_SV100S264G_64GB60075751 -> /usr/share/munin/plugins/smart_*
lrwxrwxrwx 1 root root 31 Aug 23 22:43 smart_ata-ST2000DM001-1CH164_Z1E4PKGL -> /usr/share/munin/plugins/smart_*
lrwxrwxrwx 1 root root 31 Aug 23 22:43 smart_ata-WDC_WD20EARS-00MVWB0_WD-WCAZ20023827 -> /usr/share/munin/plugins/smart*
lrwxrwxrwx 1 root root 31 Aug 23 22:43 smart_ata-WDC_WD20EFRX-68AX9N0_WD-WCC300347783 -> /usr/share/munin/plugins/smart*
lrwxrwxrwx 1 root root 31 Aug 23 22:43 smart_ata-WDC_WD20EFRX-68AX9N0_WD-WCC300366117 -> /usr/share/munin/plugins/smart*
lrwxrwxrwx 1 root root 31 Aug 23 22:43 smart_ata-WDC_WD20EFRX-68AX9N0_WD-WMC300043508 -> /usr/share/munin/plugins/smart*
lrwxrwxrwx 1 root root 31 Aug 23 22:43 smart_ata-WDC_WD20EFRX-68AX9N0_WD-WMC300228224 -> /usr/share/munin/plugins/smart*
```

![smart_ata_ST2000DM001_1CH164_Z1E4PKGL-day.png](https://qiita-image-store.s3.amazonaws.com/0/15182/a399529b-8a61-5bdc-5a33-a2d2d298f2d4.png "smart_ata_ST2000DM001_1CH164_Z1E4PKGL-day.png")