HDDに空きがあるのにエラー

 詳しくはここのトラブル関連の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につまづく

 基本的に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

 結果、うまく行ったようで、Windows8.1上でも、
failtank.jpg
 の通りです。


添付ファイル: filefailtank.jpg 378件 [詳細]

トップ   編集 凍結解除 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-09-18 (水) 17:08:24