詳しくはここのトラブル関連のWindows Vista/7 クライアントからの書き込み時に空き容量が無い旨のエラーが出るを見てもらうとわかるのですが、端的に言って、ルート上にディレクトリを作って、さらにその上にマウントポイントがあり、マウントポイントをすべて管理したいので、ルート上のディレクトリをSambaで公開する格好なっています。
例示すると、Sambaの共有設定が
path = /filetank
で
\\samba_server ・・・SambaサーバのIP └filetank | +-wd10eads-1 | +-wd10eads-2 | wdグリーンHDDいっぱい
という状態で、たとえwd10eads-2に十分な空き容量があっても、Sambaは/filetankの空き容量(ルートなので/dev/sda1の)を教えてしまいます。そのため、小さなファイルを入れるには問題なかったんですが、大きく移動しようとすると、(Windows Vistaの頃から)コピー自体を拒否してしまいます。
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は単精度だったのです。単にOFMT(Numeric Output with print)の問題かと思って、
#!/bin/bash df |grep /filetank |awk '{total= total+ $2}{available = available + $4}END{printf "%d %d \n",total,available}'
としましたが、答えはなんと
2147483647 2147483647
がっかりです。(POSIXでは、倍精度ではないのかなぁ?)
仕方がないので、ちゃんとしたawkを探します。
Jeroen Schot氏のGNU Awkがありました。
早速
$ sudo add-apt-repository ppa:schot/gawk $ apt-get update $ apt-get install gawk
その後、/etc/samba/dfree.shを
#!/bin/bash df |grep /filetank |gawk '{total= total+ $2}{available = available + $4}END{printf "%d %d \n",total,available}'
実行結果もきちんと下のように出ました
root@hogehoge:/etc/samba# ./dfree.sh 13218489616 4533954692