Google

Samba における容量制限(QUOTA使用方法)

日本Sambaユーザ会 / Miracle Linux 小田切 耕司

執筆協力:はせがわ ようすけ

目次


ディレクトリやユーザーに対する容量制限のかけ方

PC 用のファイル・サーバーと言えば、現在はWindows NT/2000 サーバーが非常に多いようですが(残念ながらまだ Samba は Windows より多いとは言えないようです)、 NT 以前は NetWare サーバーが多数を占めていました。 NetWare サーバーを Windows NT3.51/4.0 サーバーに移行する際に問題となる機能の一つは、QUOTA(クォータ)と呼ぶ、ディレクトリやユーザーに対する容量制限機能でしょう(Windows2000 はQUOTA 機能を備えています)。 Samba では QUOTA を利用でき、今回はこの使い方を紹介します(Linux JF なども参考にしてください)。

作業手順は以下の通りです。

  1. Linux のカーネルの確認
  2. Samba のコンパイル・オプションの確認
  3. /etc/fstab ファイルの設定
  4. quotacheck と quotaon の実行
  5. edquota の実行
  6. repquota の実行。
では、順番に解説しましょう。

Linux のカーネルと Samba のコンパイル・オプションの確認

QUOTA 機能を使うには、Linux カーネルが「Quota support = Yes」として構築されている必要があります。 なぜなら、Samba が QUOTA 制御をするのではなく、Samba が動いている OS のQUOTA 機能をそのまま利用するからです。 Red Hat Linux などのディストリビューションでは、通常有効となっているので問題ありません。 自分でカーネルを入れ替えている場合などは確認してください。

同様に Samba についても、コンパイル前の configure(初期設定スクリプト実行)時に「--with-quotas」オプションを付けないと QUOTA 機能が有効になりません。 これもディストリビューションに入っているパッケージや日本 Samba ユーザ会が提供している RPM パッケージなどでは有効になっているので心配ありません。 自分でソース・コードからコンパイルしている場合は注意してください。

/etc/fstab の設定

QUOTA 制限はパーティションごとに設定する必要があります。 /etc/fstab ファイルの4番目のフィールドに、defaults に続けて「usrquota」または「usrgroup」を記述します。 usrquota はユーザーごとに容量を制限するときに指定します。 一方のusrgroupは、グループごとに容量を制限するときに指定します。 写真1は /home ディレクトリにユーザーごととグループごとの容量制限をかけるための設定例です。

写真1 /home ディレクトリに、ユーザー/グループごとの容量制限をかけた
写真1 /home ディレクトリに、ユーザー/グループごとの容量制限をかけた

quotacheck とquotaon

次に、以下のようにコマンドを入力して QUOTA のチェックをし、有効にします(システムによっては下記コマンドは、/usr/sbin にあるかもしれません)。


/sbin/quotacheck -avug

/sbin/quotaon -avug

実行例は以下の通りです。 /sbin/quotacheck -avug /sbin/quotaon -avug

# quotacheck -avug

Scanning /dev/hda6 [/home] done

Checked 20 directories and 165 files

Using quotafile /home/quota.user

Updating in-core user quotas

Using quotafile /home/quota.group

Updating in-core group quotas


# quotaon -avug

/dev/hda6: group quotas turned on

/dev/hda6: user quotas turned on

この2つのコマンドは、/etc/rc.d/rc.sysinit に記述し、システム起動時に実行する必要がありますが、Red Hat Linux などのディストリビューションでは既に記述されています。 システムを再起動し、「Turning on user and group quotas for local filesystems 」というメッセージが出ることを確認してください(写真2)。

もし、システム起動時スクリプトに記述が無い場合は以下のスクリプトを /etc/rc.d/rc.sysinit ファイル内に追加してください。


if [ -x /sbin/quotacheck ]

then

        echo "Checking quotas. This may take some time."

        /sbin/quotacheck -avug

        echo " Done."

fi

if [ -x /sbin/quotaon ]

then

        echo "Turning on quota."

        /sbin/quotaon -avug

fi

このスクリプトは、/etc/fstab 内のファイル・システムがマウントされた後に実行する必要があります。 そうでなければ、QUOTA 機能が有効になりません。 システムの init スクリプトの最後に記述すると良いでしょう。

写真2 Linux 起動時のメッセージ
写真2 Linux 起動時のメッセージ
「Turning on user and group quotas for local filesystems 」というメッセージが出ることを確認する(下から5 行目)

edquota

各ユーザーに対するQUOTA を設定するには、quota.user ファイル内の値を変更します。 ただ、quota.user ファイルにはバイナリ値で格納されていますので、直接編集できません。 そこで、edquota コマンドを使います。 edquota コマンドは quota.user に入っているバイナリ値をテキストに変えてエディタで開きます。 これを編集すれば、edquota は quota.user にバイナリ値で格納します。

例えば、コマンド「edquota sato」を実行すると、vi(もしくは、環境変数 $EDITOR によって示されたエディタ)が起動します。 ここで、QUOTA が有効になっているそれぞれのパーティション上でのユーザー「sato」の使用可能容量を設定します。 以下が edquota コマンドを実行したときにエディタに表示される情報です。 この中の「limits」に続く soft= と hard= の数値を変更します。


Quotas for user sato:

/dev/hda6: blocks in use: 32 、

    limits (soft = 1000 、hard = 1000 )

    inodes in use: 9 、

    limits (soft = 0 、hard = 0 )

「blocks in use」は、パーティション内でユーザーが消費しているブロック(Kバイト単位)の総数です。 「inodes in use」はパーティション内でユーザーが使用しているファイル/ディレクトリ(inode)の総数です。

ここでは、edquota に加え、習熟しておかなければならない用語が3つあります。 Soft Limit、Hard Limit、Grace Period です。

Soft Limit は、一般には、ユーザーがパーティション内で使用できるディスクの最大量を示しています。 しかし、Grace Period が設定されているときには、この最大量は警戒領域の入り口とみなされます。 すなわち、ディスク使用量がこの容量を越えると、ユーザーは QUOTA 制限を越えている旨の警告を受けることになります。

Hard Limit は Grace Period が設定されているときにのみ、意味があります。 ディスク使用の絶対的な制限を示しており、ユーザーはこの Hard Limit を越えたディスク容量を使用できません。

Grace Period は、コマンド「edquota - t 」を実行した後の、Soft Limit の制限がユーザーに科されるまで時間となります。 時間の単位にはsec(秒)、min(分)、hour(時間)、day(日)、week(週)、month(月)が使用できます。 図1 は、コマンド「edquota - t 」を実行したときの例です。


Time units may be: days 、hours 、minutes 、or seconds

Grace period before enforcing soft limits for users:

/dev/hda6: block grace period: 0 day 、file grace period: 0 day

図1 「edquota -t」コマンドの実例
「0 day」の部分を手頃な長さの時間に変更する。

repquota

repquota は1つのファイル・システムについて、QUOTA 情報を集計するコマンドです。 写真3 は repquota の出力例です。

写真3 repquota の出力例
写真3 repquota の出力例
quota 情報の集計を作成する。

この例では、ユーザー「suzuki」に500Kバイトまで、そしてユーザー「sato」には1000Kバイトまでの制限がかかっています。 この設定で suzuki が Samba の共有フォルダ /home/suzuki と /home/dev1-common に接続すると、写真4 のようになります。 また、sato が Samba の共有フォルダ /home/sato と /home/dev1-common に接続すると、写真5 のようになります。 同じディスクに接続したのですが、ユーザーによってディスク容量がそれぞれの Soft Limit のサイズになっていることが分かるかと思います。

Linux のQUOTA 機能はユーザー単位またはグループ単位で容量制限をかけますが、Samba の共有ディレクトリ全体に対して制限をかけたい場合は、以下の(a)グループに容量制限をかける方法と、(b)専用ユーザーを用意する方法の2通りがあります。

(a)共有ディレクトリに、UNIX/Linux ユーザーのグループ単位で容量制限をかけるには、「edquota - g グループ名」コマンドを使って制限容量を設定します。 そして、フォルダの所有グループを設定した後、必要に応じて smb.conf(Samba の設定ファイル)の force group パラメータにグループを指定します。

(b)共有ディレクトリ・アクセスのための専用 UNIX/Linux ユーザーを作成し、「edquota 専用ユーザー名」コマンドで制限容量を設定します。 そして、フォルダの所有ユーザーを設定した後 smb.conf の force user パラメータにユーザーを指定します(本誌(日経Linux)2000年11月号、「例2:Linux システムにアカウントを持つすべてのユーザーがアクセス(更新・参照)可能な共有」を参照してください)。

写真4 ユーザー suzuki が Samba サーバーに接続したところ
写真4 ユーザー suzuki が Samba サーバーに接続したところ
dev1-common(Eドライブ)と suzuki(Fドライブ) の容量が 500K バイトと表示されている。

写真5 ユーザー sato が Samba サーバーに接続したところ
写真5 ユーザー sato が Samba サーバーに接続したところ

Windows NT/2000 では運用上問題が生じる*注

*注
以下の問題はSamba 2.2.2以降で修正されました。
ただし、Linux カーネルが2.4以降でAlan Cox 2.4.x kernelsが含まれるRed Hat系のみのようです。

実際に Samba の QUOTA を検証すると、Windows98 クライアントでは問題が出ませんでしたが、Windows NT4.0/2000 クライアントでは運用上、以下の問題があることが判明しました。

ファイルを作成(コピーなど)した際、容量制限を越えると壊れたファイルができてしまいます。 利用者が不完全なファイルを自分で削除する必要があります。

例えば、1M バイトに容量を制限されたユーザーが、残り 500K バイトの状態で 2M バイトのファイルをエクスプローラで Samba サーバーへコピーします。 すると、ディスクの空き領域が無いというエラーになりますが(写真6)、500K バイトだけコピーされ、ファイルができてしまいます。 エクスプローラで見たファイル・サイズは 2M バイトになっています。 ユーザーはこの不完全なファイルを自分で削除する必要があります(システム管理者はこの不完全なファイルを検索し、削除することは困難です)。

また、制限いっぱいに使った(空き領域の無い)状態でファイルをコピーすると、エラーになるものの中身の無いファイルができてしまいます。 Linux 上では領域はとっていないのに、エクスプローラでみるとコピー元のファイル・サイズになっています。 Linux 上で cp コマンドで試した場合は、エラーは起きるものの 0 バイトのファイルができてしまいます(この現象は Windows NT4.0/2000 だけで発生し、Windows98 では発生しません)。

写真6 QUOTA により容量制限されたディレクトリに制限容量以上のファイルをコピーしようとした
写真6 QUOTA により容量制限されたディレクトリに制限容量以上のファイルをコピーしようとした
ディスクの空き領域が無いというエラーになる。

~