Permalink: 2015-09-08 23:55:00+09:00 by ruy@ainoniwa.net in technical tags: freebsd samba zfs social:

今日のお話

つい最近、ファイルサーバを新しくした のですけど、

ファイルサーバの空き領域をSambaで見たら使用量が分かりにくかったので、何とかしたかった。

図で言うと、左じゃ困るので右にしたい、みたいな。

0908a_freebsd10_zfs_samba_001.png

ではゴー。

状況

例えば、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と言う表示になってしまう。(下図左)

0908a_freebsd10_zfs_samba_002.png

これは正直大して嬉しくない。

他のスライスで使用量が増加していくと、使用率は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

そして、エクスプローラを更新すると、下図右の出力を得ることが出来た。

0908a_freebsd10_zfs_samba_001.png

とりあえず方法論としてはこのような回避方法がある。