sambaのフリーエリア(dfree)の問題。

 家のファイルサーバ(タンク)は、マウントポイントを2階層にしてあります。(どれがどのハードウェアかわかるように)でもそれでは、Sambaで指定しているディレクトリは、ルートのハードディスクということになって、フリーエリアが数十GBしかないということになってしまいます。(XPのころは、まだ書き込んでみてから、決めていたので、大丈夫だったんです。)
 模式すると
SAMBAのルート(=/filetank)
|
+WD10EADS-1
+WD20EADS-1
以下すべてWDのグリーンHDD

なので、当然ルートの空き容量と、コピー容量を比べてしまいます。
 Samba サーバは共有ディスクの空き容量を計算するために dfree という内部ルーチンを持っていて、Samba クライアントからの空き容量の問い合わせに対してはこのルーチンを使って返答しています。
 dfree ルーチンに問題がある場合に別の外部スクリプトを指定することができ、smb.conf の dfree command というパラメータで指定すします。dfree ルーチンに変わって /etc/samba/dfree.sh というシェルスクリプトを使いたい場合には、smb.conf の [global] セクションに次のように記述します。
[global]
dfree command = /etc/samba/dfree.sh
ここで指定する外部スクリプトは、標準出力として2つの整数をスペース区切りで返す必要があり、Samba クライアントからのディスク容量の問い合わせに対して、1つめの整数を共有ディスクの総容量、2つめの整数を空きディスク容量として返答します。(1024バイト単位)
具体的には以下のように記述する。
#!/bin/bash
df |grep /filetank |awk '{total = total + $2}{available = available + $4}END{print total" “available}’
ということを見つけました。
が、ここからが問題^^;
awkは内部的に数値型は倍精度浮動小数点だとおもったら、Ubuntu付属のawkは単精度だったのです;;なので、13TBとか、整数ででないんです。
そこで、いろいろ試してみましたところ、gawkなら動くということです。
PPAはこちらです。
 問題なくいけました。
root@hogehoge:/etc/samba# cat dfree.sh
#!/bin/bash
df |grep /filetank |gawk '{i= i+ $2}{j = j + $4}END{printf “%d %d \n",i,j}’
実行例:
root@hogehoge:/etc/samba# ./dfree.sh
13218489616 4531631072
failtank.jpg
きちんと表示されました。

PC

Posted by masterkudo