[pgsql-jp: 36991] 各ユーザ毎のデータベース容量を、QUOTA制限に含めたい

wata1930 @ mail.goo.ne.jp wata1930 @ mail.goo.ne.jp
2006年 4月 16日 (日) 05:48:59 JST


渡部と申します

FreeBSD 5.4 RELEASE
PostgreSQL 7.4.12

各ユーザ毎に作成したPostgreSQLデータベースの容量を、各ユーザ毎に設定したQUOTAの
制限ブロック数の容量に含まれるような仕組みを考えています。

以下のような手順を試してみました。

・fstabにて、マウントポイント/homeのOptionに、suiddir,userquotaを指定、有効化
・/home/db/pgsql ディレクトリを作成

  drwx------   3 pgsql  pgsql  512 Apr 16 03:26 pgsql

・ユーザhogeにて、データベースhogedbを作成
・作成されたデータベースディレクトリを移動、シンボリックリンクを張る

  # mv /usr/local/pgsql/data/base/17010 /home/db/pgsql/
  # ln -s /home/db/pgsql/17010 /usr/local/pgsql/data/base/17010

  ※ 17010 = hogedb

・移動したデータベースディレクトリを、所有者hoge、グループpgsqlに設定し、
  chmod 4700を実行(pgsqlディレクトリ以下に作成されるファイルは、所有者hogeにな
  るよう設定)

  # cd /home/db/pgsql
  # chown hoge:pgsql 17010
  # chmod 4770 17010

  drwsrwx---  2 hoge   pgsql  2048 Apr 16 03:53 17010

・既に作成されている17010ディレクトリ内のファイルの所有者をhogeに変更、所有者、
  グループ共に読み書きできるよう設定

  # cd 17010/
  # chown hoge:pgsql *
  # chmod 660 *


これで、とりあえず現状のデータベースがユーザhogeのQUOTA制限の対象になり、新たに
このディレクトリ内に作成されるテーブル用のファイルなどは、所有者hogeとなり、ファ
イル作成や、読み書きはグループpgsqlにて操作される事を期待しました
が、テーブルの作成でパーミッションエラーとなりました

  % psql -U hoge -d hogedb
  hogedb=> CREATE TABLE test_tbl(id int);
  ERROR:  could not open relation "test_tbl": Permission denied

試しに、/home/db/pgsql/17010ディレクトリに設定している、setuidビットを外してみた
ところ、正常にテーブルが作成されました。

  # chmod 0770 /home/db/pgsql/17010

  drwxrwx---  2 hoge   pgsql  2048 Apr 16 04:31 18781

  % psql -U hoge -d hogedb
  hogedb=> CREATE TABLE test_tbl(id int);
  CREATE TABLE


どうやら、新たに作成されるテーブル用のファイルの所有者がpgsqlとして作成出来ない
と、パーミッションエラーになるようです。

ちなみに、MySQL 4.1.18にて同じような事をしてみたところ、setuidビットがセットされ
たままの状態でも、正常にテーブルの作成が完了しました。

MySQLの場合、新規作成されるファイルが、所有者、グループ共に読み書き権限が与えられ
ており、PostgreSQLの場合は、所有者のみ読み書き権限が与えられるため、ユーザpgsqlが
ファイルの読み書きが出来ない状態だからでは、と考えています。

[ MySQLの場合 ]
-rw-rw----  1 hoge   mysql     0 Apr 15 23:32 test_tbl.MYD
-rw-rw----  1 hoge   mysql  1024 Apr 15 23:32 test_tbl.MYI
-rw-rw----  1 hoge   mysql  9170 Apr 15 23:32 test_tbl.frm

[ PostgreSQLの場合(setuidビットを外して作成したもの) ]
-rw-------  1 pgsql  pgsql        0 Apr 16 04:46 18798
-rw-------  1 pgsql  pgsql        4 Apr 16 03:24 PG_VERSION
-rw-------  1 pgsql  pgsql    69385 Apr 16 03:24 pg_internal.init


PostgreSQLの設定で、作成するファイルのマスクを設定できるような項目があればうまく
いくのでは、と考えていますが、そのような設定はありますでしょうか?

それ以前に、このような仕組みをもっとスマートにこなす方法等ありますでしょうか。
(8.0以降の、テーブルスペースという機能で出来るのでしょうかね)

長くなりましたが、よろしくお願いします。



pgsql-jp メーリングリストの案内