ファイルサーバを新しくしました。 ZFSをSambaで公開した時の空き領域調整編
Posted on 2015/09/08(Tue) 23:55 in technical
今日のお話
つい最近、ファイルサーバを新しくした のですけど、
ファイルサーバの空き領域をSambaで見たら使用量が分かりにくかったので、何とかしたかった。
図で言うと、左じゃ困るので右にしたい、みたいな。
ではゴー。
状況
例えば、ZFSで作ったストレージをSambaで公開する場合、ディスク全体ではなく一部のスライスだけを公開したいことはままある。
だけど、知っての通りZFSでは、スライス毎の全体容量は「他のスライスの使用量をプール全体の容量から引いた容量」として表示される。
例えばこうだ。:
$ zpool list | grep zpool02 zpool02 32.5T 15.3T 17.2T - 14% 47% 1.00x ONLINE - $ df -h | grep zpool02 zpool02 11T 208K 11T 0% /zpool02 zpool02/data 16T 5.6T 11T 34% /zpool02/data zpool02/mirror 11T 47G 11T 0% /zpool02/mirror zpool02/private 12T 1.0T 11T 9% /zpool02/private zpool02/public 11T 192K 11T 0% /zpool02/public zpool02/rec 14T 3.6T 11T 25% /zpool02/rec zpool02/servers 11T 430M 11T 0% /zpool02/servers
更に悪いことに、例えばここで zpool02 を公開したとする。
その場合、最大容量 11TB/空き領域 11TBと言う表示になってしまう。(下図左)
これは正直大して嬉しくない。
他のスライスで使用量が増加していくと、使用率は0%なのに最大容量がどんどん小さくなっていくからだ。
sambaの設定
sambaの空き領域計算は、デフォルトでは内部実装が実行するものの、代わりにスクリプトを実行することもできる。
dfree command と言うものがそれにあたり、ここで 全体容量 と 空き容量 を標準出力で返してやるスクリプトを指定すると、そのように画面に見せることが出来る。
そこで、以下のようなスクリプトを書く:
#!/bin/sh CUR_PATH=`df $1 | tail -1 | awk '{print $1}'` USED=$((`zfs get -o value -Hp used $CUR_PATH` / 1024)) > /dev/null AVAIL=$((`zfs get -o value -Hp available $CUR_PATH` / 1024)) > /dev/null TOTAL=$(($USED+$AVAIL)) > /dev/null echo $TOTAL $AVAIL
これを、smb4.confに書く:
[global] dfree command = /usr/local/etc/smb4_dfree.sh dfree cache time 10
通報
dfree command は空き領域計算が必要になるたびに実行されるので、ある程度の時間キャッシュしたい場合は、 dfree cache time を設定する。(デフォルトは0)
そして再起動:
# service samba_server restart
そして、エクスプローラを更新すると、下図右の出力を得ることが出来た。
とりあえず方法論としてはこのような回避方法がある。