再びLinuxとquotactl(2)

(コメント: 0)

Linuxとquotactl(2)に正確でなかったところがあったので書き直しです。

UNIX系OSのquotaはディスクの使用量やファイル数(inode数)の制限をファイルシステム単位で行うことができる仕組みで、一般にquotactl(2)というシステムコール1つで様々なことを行います。(NetBSD 6以降のような例外もあります。)

そして、quotaでディスクの使用量は「ブロック」という単位で行うようになっています。

ここで問題となるのは「ブロック」が実際にはどのような大きさなのかということですが、BSD系OSでは512バイトで使用中のブロック数を512倍するとバイト数となります。

さて、CentOS 6辺りのLinux、ext3やext4のファイルシステムでquotaを設定すると、以下のように(quotaの生まれた4.2BSDの)伝統的な「ブロック」に対して、異なる振る舞いをします。

  1. ユーザーやグループに設定する使用制限の大きさは1K = 1024バイトを単位としたブロックで指定します。
  2. ユーザーが使用している量はquotactl(2)の引き数の構造体のメンバーにバイト単位で返ります。

よしよしと、このコードをCentOS 7に持ってくると、とんでもない結果となります。CentOS 7を何も考えずにインストールすると、ファイルシステムの形式はext4ではなくXFSとなりますが、ここで挙動が異なります。XFSではユーザーやグループの他に特定のディレクトリに対して使用制限を設定できる、プロジェクト用のquotaといった機能が追加されています。何らかの拡張が必要となるのわわかりますが、

  • 従来のquotactl(2)にXFSのファイルシステム専用のコマンドを追加する形で行っていて、既存のコマンドと統合する形ではありません。
  • 例えば、ユーザーの使用状況の取得はQ_GETQUOTAで行いますが、XFSのファイルシステム専用にQ_XGETQUOTAといった別のものが用意されています。
  • ところが、Q_XGETQUOTAを使用すると使用量の情報は返ってくるのですが、設定されている制限の情報が返ってきません。(これは単純にバグなのかもしれません。)
  • Q_GETQUOTAが使用できないわけではなく、使用量の情報と設定されている制限の情報をきちんと取得できます。
  • ところが、ext4等のファイルシステムと返ってくる内容の単位が異なります。

何てこと! と思ったりしましたが、よくよく調べるとXFSでのquotaは、伝統的なquotaと同じく512バイトを単位としたブロック数で返ってきていることに気が付きました。まとめると、こういうことになります。

ファイルシステムの種類 ユーザーの使用量の単位 制限の値の単位
ufs ブロック(512バイト) ブロック(512バイト)
ext4 バイト ブロック(1024バイト)
XFS ブロック(512バイト) ブロック(512バイト)

この結論に至る前にCentOS 7のlinuxquota-codeのソースコードを読んで、別の面でのけぞりました。quotactl(2)の異なる単二についてファイルシステム別に換算のようなことをしているコードがあります。さらに、その換算にはバイトオーダーを変換するような関数まで使用しています。

うーん、そういうのはカーネルの中に収めて、quotactl(2)では統一したインターフェイスにするもんだと思うけれど、そうなっていません。quotaで扱うのはファイルシステムであってディスクデバイスではないのに。

以上、流石はLinuxのその2の改訂版でした。

戻る

コメント

コメントを追加

4と5を加算してください。

Copyright © 2011-2024 Takahiro Kambe all rights reserved.