2008/09/17

Quota・その3・運用

実際にユーザuser01で、制限がどう働くか見てみよう。
まず、quotaの状況を確認する。
[user01@dc1 ~]$ quota
Disk quotas for user user01 (uid 500):
Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
/dev/mapper/VolGroup00-LogVol00
76   46080   51200              10       0       0
[user01@dc1 ~]$
この時点では、どの制限にも達していない。
ファイルサイズ45MBのファイルを作成する。
[user01@dc1 ~]$ head --bytes=`expr 45 \* 1024 \* 1024` /dev/zero > 45M.dat
dm-0: warning, user block quota exceeded.
[user01@dc1 ~]$
ファイルは作成されたが、ソフトリミットに達した旨警告された。状況を確認する。
[user01@dc1 ~]$ quota
Disk quotas for user user01 (uid 500):
Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
/dev/mapper/VolGroup00-LogVol00
46212*  46080   51200   7days      11       0       0
[user01@dc1 ~]$
制限に達したため、使用ブロック容量の後に「*」が表示されている。猶予時間(grace time)は、7日間になっている。
この状態では、ファイルを作成できるが、ハードリミットに達するとそれ以上書込めなくなる。ファイルサイズ1MBのファイルを一つづつ作ってみる。
[user01@dc1 ~]$ for (( i=1; $i <= 6; i=`expr $i + 1` )) do command="head --bytes=`expr 1024 \* 1024` /dev/zero > 1M-$i.dat"; echo $command; eval $command; done
head --bytes=1048576 /dev/zero > 1M-1.dat
head --bytes=1048576 /dev/zero > 1M-2.dat
head --bytes=1048576 /dev/zero > 1M-3.dat
head --bytes=1048576 /dev/zero > 1M-4.dat
head --bytes=1048576 /dev/zero > 1M-5.dat
dm-0: write failed, user block limit reached.
head: write error: Disk quota exceeded
head: write error
head --bytes=1048576 /dev/zero > 1M-6.dat
-bash: 1M-6.dat: Disk quota exceeded
[user01@dc1 ~]$
五番目のファイルでハードリミットに達し、途中で書込めなくなった。六番目のファイルは、作成する前に失敗している。確認してみよう。
[user01@dc1 ~]$ ls -l
total 51124
-rw-r--r-- 1 user01 users  1048576 Sep 17 00:32 1M-1.dat
-rw-r--r-- 1 user01 users  1048576 Sep 17 00:32 1M-2.dat
-rw-r--r-- 1 user01 users  1048576 Sep 17 00:32 1M-3.dat
-rw-r--r-- 1 user01 users  1048576 Sep 17 00:32 1M-4.dat
-rw-r--r-- 1 user01 users   872448 Sep 17 00:32 1M-5.dat
-rw-r--r-- 1 user01 users 47185920 Sep 17 00:32 45M.dat
[user01@dc1 ~]$ quota
Disk quotas for user user01 (uid 500):
Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
/dev/mapper/VolGroup00-LogVol00
51200*  46080   51200              16       0       0
[user01@dc1 ~]$
ハードリミットに達したため、猶予時間が表示されなくなった事に注意。この状態では、空ファイルすら作れない。
[user01@dc1 ~]$ touch a
touch: cannot touch `a': Disk quota exceeded
[user01@dc1 ~]$
ファイルを削除し、ハードリミットを下回れば、再びファイルを作成可能になる。
[user01@dc1 ~]$ rm 1M-5.dat
[user01@dc1 ~]$ touch a
[user01@dc1 ~]$


この状態を、管理者側で確認してみよう。
[root@dc1 ~]# repquota -a
*** Report for user quotas on device /dev/mapper/VolGroup00-LogVol00
Block grace time: 7days; Inode grace time: 7days
Block limits                File limits
User            used    soft    hard  grace    used  soft  hard  grace
----------------------------------------------------------------------
root      -- 1571120       0       0          59255     0     0
daemon    --      20       0       0              3     0     0
lp        --      16       0       0              2     0     0
smmsp     --      16       0       0              2     0     0
avahi     --       8       0       0              1     0     0
apache    --      24       0       0              3     0     0
ntp       --      16       0       0              2     0     0
rpc       --       4       0       0              1     0     0
rpcuser   --       8       0       0              1     0     0
luci      --  263348       0       0          20552     0     0
dovecot   --       8       0       0              1     0     0
webalizer --      32       0       0              4     0     0
piranha   --      16       0       0              3     0     0
rpm       --   24324       0       0             75     0     0
ricci     --      60       0       0              8     0     0
user01    +-   50352   46080   51200  6days      17     0     0
user02    --      76   46080   51200             10     0     0
user03    --      76   46080   51200             10     0     0


[root@dc1 ~]#
ユーザuser01の猶予時間が6日間と表示されている。
管理者は各ユーザの猶予時間を変更することができる。5分(300秒)に変更してみよう。
[root@dc1 ~]# setquota -T user01 300 unset -a
[root@dc1 ~]# repquota -a
*** Report for user quotas on device /dev/mapper/VolGroup00-LogVol00
Block grace time: 7days; Inode grace time: 7days
Block limits                File limits
User            used    soft    hard  grace    used  soft  hard  grace
----------------------------------------------------------------------
root      -- 1571120       0       0          59255     0     0
daemon    --      20       0       0              3     0     0
lp        --      16       0       0              2     0     0
smmsp     --      16       0       0              2     0     0
avahi     --       8       0       0              1     0     0
apache    --      24       0       0              3     0     0
ntp       --      16       0       0              2     0     0
rpc       --       4       0       0              1     0     0
rpcuser   --       8       0       0              1     0     0
luci      --  263348       0       0          20552     0     0
dovecot   --       8       0       0              1     0     0
webalizer --      32       0       0              4     0     0
piranha   --      16       0       0              3     0     0
rpm       --   24324       0       0             75     0     0
ricci     --      60       0       0              8     0     0
user01    +-   50352   46080   51200  00:05      17     0     0
user02    --      76   46080   51200             10     0     0
user03    --      76   46080   51200             10     0     0


[root@dc1 ~]#


ユーザuser01で、動作を確認してみる。設定直後。
[user01@dc1 ~]$ quota
Disk quotas for user user01 (uid 500):
Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
/dev/mapper/VolGroup00-LogVol00
50352*  46080   51200   00:05      17       0       0
[user01@dc1 ~]$
ソフトリミットに達しているが、猶予時間がある。この状態では、まだファイルを作成することができる。
五分後。
[user01@dc1 ~]$ quota
Disk quotas for user user01 (uid 500):
Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
/dev/mapper/VolGroup00-LogVol00
50352*  46080   51200    none      17       0       0
[user01@dc1 ~]$
猶予時間がnoneになっている。この状態では、空ファイルも作成できない。
[user01@dc1 ~]$ touch b
dm-0: write failed, user block quota exceeded too long.
touch: cannot touch `b': Disk quota exceeded
[user01@dc1 ~]$
この制限は、ソフトリミットを下回るまで解除されない。
[user01@dc1 ~]$ rm 1M-*
[user01@dc1 ~]$ quota
Disk quotas for user user01 (uid 500):
Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
/dev/mapper/VolGroup00-LogVol00
46224*  46080   51200    none      13       0       0
[user01@dc1 ~]$ touch b
dm-0: write failed, user block quota exceeded too long.
touch: cannot touch `b': Disk quota exceeded
[user01@dc1 ~]$ rm 45M.dat
[user01@dc1 ~]$ touch b
[user01@dc1 ~]$ quota
Disk quotas for user user01 (uid 500):
Filesystem  blocks   quota   limit   grace   files   quota   limit   grace
/dev/mapper/VolGroup00-LogVol00
92   46080   51200              13       0       0
[user01@dc1 ~]$

その1・ファイルシステム毎の設定』『その2・ユーザ毎の設定』『その3・運用

Quota・その2・ユーザ毎の設定

一般ユーザuser0[123]を作成し、容量制限を設定する。
[root@dc1 ~]# useradd -g users -m user01
[root@dc1 ~]# useradd -g users -m user02
[root@dc1 ~]# useradd -g users -m user03
[root@dc1 ~]#
当然、この時点ではこれらのユーザにも容量制限は働いていない。
[root@dc1 ~]# repquota -a
*** Report for user quotas on device /dev/mapper/VolGroup00-LogVol00
Block grace time: 7days; Inode grace time: 7days
Block limits                File limits
User            used    soft    hard  grace    used  soft  hard  grace
----------------------------------------------------------------------
root      -- 1571120       0       0          59255     0     0
daemon    --      20       0       0              3     0     0
lp        --      16       0       0              2     0     0
smmsp     --      16       0       0              2     0     0
avahi     --       8       0       0              1     0     0
apache    --      24       0       0              3     0     0
ntp       --      16       0       0              2     0     0
rpc       --       4       0       0              1     0     0
rpcuser   --       8       0       0              1     0     0
luci      --  263348       0       0          20552     0     0
dovecot   --       8       0       0              1     0     0
webalizer --      32       0       0              4     0     0
piranha   --      16       0       0              3     0     0
rpm       --   24324       0       0             75     0     0
ricci     --      60       0       0              8     0     0
user01    --      76       0       0             10     0     0
user02    --      76       0       0             10     0     0
user03    --      76       0       0             10     0     0


[root@dc1 ~]#
これらのユーザに対して、前の記事冒頭で述べた容量制限を設定する。まず、user01に対して設定を行う。この作業は、edquotaコマンドでも実行可能だが、非対話的に実行するため、setquotaコマンドを使用する。最初に作成した一般ユーザuser01のUID番号は、500であることに注意。
[root@dc1 ~]# setquota 500 46080 51200 0 0 /
[root@dc1 ~]# repquota -a
*** Report for user quotas on device /dev/mapper/VolGroup00-LogVol00
Block grace time: 7days; Inode grace time: 7days
Block limits                File limits
User            used    soft    hard  grace    used  soft  hard  grace
----------------------------------------------------------------------
root      -- 1571120       0       0          59255     0     0
daemon    --      20       0       0              3     0     0
lp        --      16       0       0              2     0     0
smmsp     --      16       0       0              2     0     0
avahi     --       8       0       0              1     0     0
apache    --      24       0       0              3     0     0
ntp       --      16       0       0              2     0     0
rpc       --       4       0       0              1     0     0
rpcuser   --       8       0       0              1     0     0
luci      --  263348       0       0          20552     0     0
dovecot   --       8       0       0              1     0     0
webalizer --      32       0       0              4     0     0
piranha   --      16       0       0              3     0     0
rpm       --   24324       0       0             75     0     0
ricci     --      60       0       0              8     0     0
user01    --      76   46080   51200             10     0     0
user02    --      76       0       0             10     0     0
user03    --      76       0       0             10     0     0


[root@dc1 ~]#
ユーザuser01の設定を他のユーザuser0[23](UID番号50[12])にコピーする。設定のコピーには、edquotaを使う。非対話的に実行される。
[root@dc1 ~]# for (( uid=501; $uid <= 502; uid=`expr $uid + 1` )) do command="edquota -p 500 $uid"; echo $command; eval $command; done
edquota -p 500 501
edquota -p 500 502
[root@dc1 ~]# repquota -a
*** Report for user quotas on device /dev/mapper/VolGroup00-LogVol00
Block grace time: 7days; Inode grace time: 7days
Block limits                File limits
User            used    soft    hard  grace    used  soft  hard  grace
----------------------------------------------------------------------
root      -- 1571120       0       0          59255     0     0
daemon    --      20       0       0              3     0     0
lp        --      16       0       0              2     0     0
smmsp     --      16       0       0              2     0     0
avahi     --       8       0       0              1     0     0
apache    --      24       0       0              3     0     0
ntp       --      16       0       0              2     0     0
rpc       --       4       0       0              1     0     0
rpcuser   --       8       0       0              1     0     0
luci      --  263348       0       0          20552     0     0
dovecot   --       8       0       0              1     0     0
webalizer --      32       0       0              4     0     0
piranha   --      16       0       0              3     0     0
rpm       --   24324       0       0             75     0     0
ricci     --      60       0       0              8     0     0
user01    --      76   46080   51200             10     0     0
user02    --      76   46080   51200             10     0     0
user03    --      76   46080   51200             10     0     0


[root@dc1 ~]#
なお、setquotaおよびedquotaコマンドで、ユーザを指定するのに名前で指定することもできるが、ここではUID番号で指定した。これには次のような理由がある。名前指定の場合、先にユーザが登録されている必要がある。一方、UID番号指定の場合には、その制約は無い。将来登録されるユーザに対して容量制限を行いたい場合、ユーザ登録に先立って、それらのユーザが登録されるUID番号の範囲に対して、UID番号指定で容量制限を設定することができる。一方、名前指定ではこれは不可能だ。


その1・ファイルシステム毎の設定』『その2・ユーザ毎の設定』『その3・運用

Quota・その1・ファイルシステム毎の設定

今までquota・ディスク容量制限というものをやったことが無かったのだが、必要に迫られ、やってみた。

CentOS機dc1上で、ユーザuser0[123]を作成し、これらにそれぞれ、45MBのソフトリミット、50MBのハードリミットを設定する。RHELでも同様に作業できる。大まかな流れは以下の通り。
  1. ファイルシステム毎の設定
  2. ユーザ毎の設定
  3. 運用

まず、容量制限を設定するファイルシステムに対して、quotaが動くよう設定する。インストール時に特に指定しなければ、LVMを使って以下の様に設定されている。
[root@dc1 ~]# cat /etc/fstab
/dev/VolGroup00/LogVol00 /                       ext3    defaults        1 1
LABEL=/boot             /boot                   ext3    defaults        1 2
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
/dev/VolGroup00/LogVol01 swap                    swap    defaults        0 0
[root@dc1 ~]#
ユーザが自由に書込みできるのは、ユーザのホームディレクトリ/home/user[123]以下で、これはルート(/)に含まれている。
# 検索してみると、ルートにquotaを設定することはできない、と書いてあるページもあるが、これは誤りだ。

ルートのエントリを以下の通り編集する。
[root@dc1 ~]# cp -p /etc/fstab /etc/fstab.orig
[root@dc1 ~]# awk '{if ($2=="/" ) gsub(/defaults/,"defaults,usrquota,grpquota"); print $0 }' < /etc/fstab.orig > /etc/fstab
[root@dc1 ~]# cat /etc/fstab
/dev/VolGroup00/LogVol00 /                       ext3    defaults,usrquota,grpquota        1 1
LABEL=/boot             /boot                   ext3    defaults        1 2
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
/dev/VolGroup00/LogVol01 swap                    swap    defaults        0 0
[root@dc1 ~]#
ユーザ単位の制限のみ必要で、グループ単位の制限が不要の場合は、「,grpquota」は無くてもよい。

編集し終わったら、対象となるファイルシステムを再マウントする(unmount→mount)すればよい。しかし、ルートの場合は再起動するしかない。
[root@dc1 ~]# shutdown -r now


再起動後、シングルユーザモードに移行し、quotacheckコマンドを実行する。
シングルユーザモードで実行するのは、以下の理由による。デフォルトでは、quotacheckは、対象ファイルシステムをread-onlyモードで再マウントしようとするが、ルートの場合はこれが失敗する。オプション「-m」を指定すれば、この動作を行わないが、quotacheckコマンド実行中に対象ファイルシステムで書込みが発生すると、使用量に誤差がでてしまう。シングルユーザモードにすれば、書込みは最低限となる。
シングルユーザモードに移行する。
[root@dc1 ~]# telinit 1
INIT: Switching to runlevel: 1
INIT: Sending processes the TERM signal
Shutting down Cluster Module - cluster monitor: [  OK  ]
Shutting down ricci: [  OK  ]
<<略>>

Telling INIT to go to single user mode.
INIT: Going single user
INIT: Sending processes the TERM signal
INIT: Sending processes the KILL signal
sh-3.2#
この時点では、quotaファイルaquota.{user,group}は存在していない。
sh-3.2# ls -l /
total 146
drwxr-xr-x  2 root root  4096 Aug 20 01:54 bin
drwxr-xr-x  4 root root  1024 Aug 19 19:55 boot
drwxr-xr-x 10 root root  2840 Sep 17 00:28 dev
drwxr-xr-x 86 root root 12288 Sep 17 00:28 etc
drwxr-xr-x  2 root root  4096 Mar 30  2007 home
drwxr-xr-x 14 root root  4096 Aug 20 01:54 lib
drwx------  2 root root 16384 Aug 19 19:49 lost+found
<<略>>
drwxrwxrwt  3 root root  4096 Sep 17 00:27 tmp
drwxr-xr-x 14 root root  4096 Aug 19 19:52 usr
drwxr-xr-x 23 root root  4096 Aug 19 20:01 var
sh-3.2#
コマンドquotacheckを実行する。
sh-3.2# quotacheck -cugfma
グループ単位の制限が不要の場合は、「-g」オプションは不要。実行完了までしばらく時間がかかる。
実行後は、quotaファイルが作成されている。
sh-3.2# ls -l /
total 170
-rw-------  1 root root  7168 Sep 17 00:28 aquota.group
-rw-------  1 root root  6144 Sep 17 00:28 aquota.user
drwxr-xr-x  2 root root  4096 Aug 20 01:54 bin
drwxr-xr-x  4 root root  1024 Aug 19 19:55 boot
drwxr-xr-x 10 root root  2840 Sep 17 00:28 dev
drwxr-xr-x 86 root root 12288 Sep 17 00:28 etc
drwxr-xr-x  2 root root  4096 Mar 30  2007 home
drwxr-xr-x 14 root root  4096 Aug 20 01:54 lib
drwx------  2 root root 16384 Aug 19 19:49 lost+found
<<略>>
drwxrwxrwt  3 root root  4096 Sep 17 00:27 tmp
drwxr-xr-x 14 root root  4096 Aug 19 19:52 usr
drwxr-xr-x 23 root root  4096 Aug 19 20:01 var
sh-3.2#
次に、対象ファイルシステムを再マウントするが、ルートの場合は再起動するしかない。
sh-3.2# shutdown -r now


再起動後、対象ファイルシステムに対してquotaが実行されているかどうかを確認する。
[root@dc1 ~]# mount
/dev/mapper/VolGroup00-LogVol00 on / type ext3 (rw,usrquota,grpquota)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/xvda1 on /boot type ext3 (rw)
tmpfs on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
[root@dc1 ~]# repquota -a
*** Report for user quotas on device /dev/mapper/VolGroup00-LogVol00
Block grace time: 7days; Inode grace time: 7days
Block limits                File limits
User            used    soft    hard  grace    used  soft  hard  grace
----------------------------------------------------------------------
root      -- 1570628       0       0          59255     0     0
daemon    --      20       0       0              3     0     0
lp        --      16       0       0              2     0     0
smmsp     --      16       0       0              2     0     0
avahi     --       8       0       0              1     0     0
apache    --      24       0       0              3     0     0
ntp       --      16       0       0              2     0     0
rpc       --       4       0       0              1     0     0
rpcuser   --       8       0       0              1     0     0
luci      --  263348       0       0          20552     0     0
dovecot   --       8       0       0              1     0     0
webalizer --      32       0       0              4     0     0
piranha   --      16       0       0              3     0     0
rpm       --   24324       0       0             75     0     0
ricci     --      60       0       0              8     0     0


[root@dc1 ~]#
この段階では、どのユーザに対しても制限が設定されていない。


その1・ファイルシステム毎の設定』『その2・ユーザ毎の設定』『その3・運用