Dec
26
[原]管理OpenVZ资源-Disk Quotas篇
通过对OpenVZ上VE进行配置,可以对VPS进行必要的允许和限制功能。在《OpenVZ-Users-Guide》文档中有关于如何管理系统资源的描述。主要分:Disk Quota、CPU、System参数三大部分内容。以下内容参考自该文档,并适当增加一些注解。
一、配置文件
所有的参数均由配置文件决定,可使用命令修改,或用vi直接编辑。
1、全局配置文件
该文件中的内容为VPS的全局配置。
2、单独VE配置文件
vzctl使用--save后,即保存到上述VE配置文件中,也可使用vi直接编译。
样本配置文件可供在创建VE的时候直接使用。
二、管理Disk Quotas(磁盘配额)
磁盘配额可用于控制每个VE对HW的/vz分区(目录)其可以使用的磁盘空间和inodes数量。应该把/vz单独分区,否则,若挂在根分区下,将很难控制。
1、磁盘配额分两个级别
2、配额状态
所有的磁盘配额状态都记录在下面的文件中:
vpsid为VE对应的标识。
该文件会根据实际情况,标识VE中的文件是否为dirty状态。这些状态并不会即时与运行中的VE同步,而只有在停止VE,或者关闭HW时才会发生同步。当同步后,文件的dirty标识就会取消。
也就是讲,万一HW不正常关闭,当重启VE时,需要重新计算quota,这将显著增加VE节点启动的时间。所以,应正常关闭HW,避免不必要的麻烦。
另外,如果你希望在全局文件中禁用所有VE的磁盘配额限制,根据上述原理,你应先关闭所有VE,然后再进行修改。否则,将会严重影响真实quota的统计值,并影响HW的操作。基于同样的理由,在单独修改某VE的磁盘配额设置时,也应先关闭它再进行。请紧记这点!
3、块大小
在OpenVZ中,disk quota的块大小总是1024 bytes,而不一定等于所在HW的/vz分区文件系统块的大小。
三、配置first-level quotas
1、可用参数
※注意,参数在配置文件中为大写,命令中为小写,见后面示例。
2、全局配置
per-VPS在全局配置文件中默认是打开的。
而每个VE的配置文件,可使用相同的参数覆盖全局文件中的定义。
※建议:在全局配置文件中打开磁盘配额支持,而单独禁用不需要使用磁盘配额限制的VE中的设置。
3、禁用VE的磁盘配额
原来的状态为:
修改配置文件,加入:
结果:
禁用磁盘配额后,VE就可使用HW的整个/VE分区的大小了。
4、启用VE的磁盘配额
VE的配置文件内容为:
下面的命令实现相同的设置:
(--save为保存到配置文件,不应实时修改磁盘配额)
结果:
四、配置second-level quotas
默认情况下,second-level quotas是关闭的。而且,若不打开该VE的first-level quotas,将不能使用second-level quotas设置。
1、打开second-level quotas支持
只要为VE的配置文件,设置一个非0的合适值就可以:
或者:
# vi /etc/vz/conf/115.conf
QUOTAUGIDLIMIT="100"
100 - means that 100 users inside VE can be limited by disk quota.
设置后,需要重启VE。
2、参数值的含义
该参数的值有两个含义:
以一个基于Red Hat的VE为例,其/etc/passwd和/etc/group就会包含约80个entries(条目),所以,该值必须大于80,常设置为100。若在VE中需要继续增加用户,同样的,就需要加大该参数的值。也就是说,如果entries数已经达到限制该值的限制,那新增加的用户就不能拥有其文件了。
需要注意的是,该值并不是越大越好的,过大的设置会消耗VPS的内存资源,够用就可以了。
3、设置second-level quotas
实际上,只要激活VE的second-level支持,后面的设置就会交由VE内Linux核心的quota模块和套件处理了。
进入VE中:
查询quota 套件:
磁盘支持:
设置:
(单位是1Kb bytes)
查看:
测试:
结果:
五、从HW检查Quota状态
使用vzquota可检查/var/vzquota/quota.vpsid的信息:
六、已知的Bug
1、设置second-level quotas Bug
当你完全按照上面的步骤设置second-level quotas,但在VE中运行发现问题:
可能你和我一样,刚好碰到一个已知的Bug,在下面有描述:
http://bugzilla.openvz.org/show_bug.cgi?id=632
首先,看看你HW使用的核心版本:
如果刚好和我一样,那恭喜你了!,升级核心吧:
用2.6.9-023stab046.2-smp版本的核心即可避免该问题。
一、配置文件
所有的参数均由配置文件决定,可使用命令修改,或用vi直接编辑。
1、全局配置文件
引用
# ll /etc/sysconfig/vz
lrwxrwxrwx 1 root root 13 Sep 27 15:39 /etc/sysconfig/vz -> ../vz/vz.conf
lrwxrwxrwx 1 root root 13 Sep 27 15:39 /etc/sysconfig/vz -> ../vz/vz.conf
该文件中的内容为VPS的全局配置。
2、单独VE配置文件
引用
# ll /etc/sysconfig/vz-scripts/
total 20
-rw-r--r-- 1 root root 228 Jul 6 15:47 0.conf <-HW节点配置
-rw-r--r-- 1 root root 1717 Oct 11 11:54 112.conf <-VE节点配置
-rw-r--r-- 1 root root 1539 Jul 6 15:47 ve-light.conf-sample <-样版配置
-rw-r--r-- 1 root root 1558 Jul 6 15:47 ve-vps.basic.conf-sample <-样版配置
total 20
-rw-r--r-- 1 root root 228 Jul 6 15:47 0.conf <-HW节点配置
-rw-r--r-- 1 root root 1717 Oct 11 11:54 112.conf <-VE节点配置
-rw-r--r-- 1 root root 1539 Jul 6 15:47 ve-light.conf-sample <-样版配置
-rw-r--r-- 1 root root 1558 Jul 6 15:47 ve-vps.basic.conf-sample <-样版配置
vzctl使用--save后,即保存到上述VE配置文件中,也可使用vi直接编译。
样本配置文件可供在创建VE的时候直接使用。
二、管理Disk Quotas(磁盘配额)
磁盘配额可用于控制每个VE对HW的/vz分区(目录)其可以使用的磁盘空间和inodes数量。应该把/vz单独分区,否则,若挂在根分区下,将很难控制。
1、磁盘配额分两个级别
引用
1)first-level:per-VPS quotas
对每个独立的VE可以使用的磁盘进行控制;
2)second-level:per-user and per-group quotas
使用Linux自带的Quota套件,对VE中的用户、组可用磁盘进行控制。
对每个独立的VE可以使用的磁盘进行控制;
2)second-level:per-user and per-group quotas
使用Linux自带的Quota套件,对VE中的用户、组可用磁盘进行控制。
2、配额状态
所有的磁盘配额状态都记录在下面的文件中:
引用
/var/vzquota/quota.vpsid
vpsid为VE对应的标识。
该文件会根据实际情况,标识VE中的文件是否为dirty状态。这些状态并不会即时与运行中的VE同步,而只有在停止VE,或者关闭HW时才会发生同步。当同步后,文件的dirty标识就会取消。
也就是讲,万一HW不正常关闭,当重启VE时,需要重新计算quota,这将显著增加VE节点启动的时间。所以,应正常关闭HW,避免不必要的麻烦。
另外,如果你希望在全局文件中禁用所有VE的磁盘配额限制,根据上述原理,你应先关闭所有VE,然后再进行修改。否则,将会严重影响真实quota的统计值,并影响HW的操作。基于同样的理由,在单独修改某VE的磁盘配额设置时,也应先关闭它再进行。请紧记这点!
3、块大小
在OpenVZ中,disk quota的块大小总是1024 bytes,而不一定等于所在HW的/vz分区文件系统块的大小。
三、配置first-level quotas
1、可用参数
引用
disk_quota:是否打开first-level quotas
diskspace:VE可用的空间,单位是1Kb blocks
diskinodes:VE可分配的inodes数量(包括文件、目录、软硬链接)
quotatime:当diskspace和diskinodes的软、硬设置不同时,设置允许VE暂时超过软设置的时间,单位是秒;但硬设置是一定不能超出的。
quotaugidlimit:second-level quotas的关键参数,0为关闭,非0的含义见后面介绍。
diskspace:VE可用的空间,单位是1Kb blocks
diskinodes:VE可分配的inodes数量(包括文件、目录、软硬链接)
quotatime:当diskspace和diskinodes的软、硬设置不同时,设置允许VE暂时超过软设置的时间,单位是秒;但硬设置是一定不能超出的。
quotaugidlimit:second-level quotas的关键参数,0为关闭,非0的含义见后面介绍。
※注意,参数在配置文件中为大写,命令中为小写,见后面示例。
2、全局配置
per-VPS在全局配置文件中默认是打开的。
引用
# grep 'DISK_QUOTA' /etc/vz/vz.conf
DISK_QUOTA=yes
DISK_QUOTA=yes
而每个VE的配置文件,可使用相同的参数覆盖全局文件中的定义。
※建议:在全局配置文件中打开磁盘配额支持,而单独禁用不需要使用磁盘配额限制的VE中的设置。
3、禁用VE的磁盘配额
原来的状态为:
引用
# vzctl exec 115 df -h
Filesystem Size Used Avail Use% Mounted on
simfs 1.0G 395M 630M 39% /
Filesystem Size Used Avail Use% Mounted on
simfs 1.0G 395M 630M 39% /
修改配置文件,加入:
引用
# vi /etc/vz/conf/115.conf
# grep 'DISK_QUOTA' /etc/vz/conf/115.conf
DISK_QUOTA=no
# grep 'DISK_QUOTA' /etc/vz/conf/115.conf
DISK_QUOTA=no
结果:
引用
# vzctl stop 115;vzctl start 115
# vzctl exec 115 df -h
Filesystem Size Used Avail Use% Mounted on
simfs 9.9G 8.5G 882M 91% /
# vzctl exec 115 df -h
Filesystem Size Used Avail Use% Mounted on
simfs 9.9G 8.5G 882M 91% /
禁用磁盘配额后,VE就可使用HW的整个/VE分区的大小了。
4、启用VE的磁盘配额
VE的配置文件内容为:
引用
#DISK_QUOTA=no #注释掉后,就使用全局配置,即打开
DISKSPACE="1048576:1153434"
DISKINODES="200000:220000"
QUOTATIME="600" #0表示关闭
DISKSPACE="1048576:1153434"
DISKINODES="200000:220000"
QUOTATIME="600" #0表示关闭
下面的命令实现相同的设置:
# vzctl set 115 --diskspace 1048576:1153434 --save
# vzctl set 115 --diskinodes 200000:220000 --save
# vzctl set 115 --quotatime 600 --save
# vzctl set 115 --diskinodes 200000:220000 --save
# vzctl set 115 --quotatime 600 --save
(--save为保存到配置文件,不应实时修改磁盘配额)
结果:
引用
# vzctl stop 115;vzctl start 115
# vzctl exec 115 df -h
Filesystem Size Used Avail Use% Mounted on
simfs 1.0G 395M 630M 39% /
[root@asptest ~]# vzctl exec 115 stat -f /
File: "/"
ID: 0 Namelen: 255 Type: ext2/ext3
Blocks: Total: 262144 Free: 161250 Available: 161250 Size: 4096
Inodes: Total: 200000 Free: 178286
# vzctl exec 115 df -h
Filesystem Size Used Avail Use% Mounted on
simfs 1.0G 395M 630M 39% /
[root@asptest ~]# vzctl exec 115 stat -f /
File: "/"
ID: 0 Namelen: 255 Type: ext2/ext3
Blocks: Total: 262144 Free: 161250 Available: 161250 Size: 4096
Inodes: Total: 200000 Free: 178286
四、配置second-level quotas
默认情况下,second-level quotas是关闭的。而且,若不打开该VE的first-level quotas,将不能使用second-level quotas设置。
1、打开second-level quotas支持
只要为VE的配置文件,设置一个非0的合适值就可以:
# vzctl set 115 --quotaugidlimit 100 --save
或者:
引用
# vi /etc/vz/conf/115.conf
QUOTAUGIDLIMIT="100"
100 - means that 100 users inside VE can be limited by disk quota.
设置后,需要重启VE。
2、参数值的含义
该参数的值有两个含义:
引用
1)非0,表示打开该设置;
2)该值会限制VE中可用second-level quotas的文件属主和组的数量;
2)该值会限制VE中可用second-level quotas的文件属主和组的数量;
以一个基于Red Hat的VE为例,其/etc/passwd和/etc/group就会包含约80个entries(条目),所以,该值必须大于80,常设置为100。若在VE中需要继续增加用户,同样的,就需要加大该参数的值。也就是说,如果entries数已经达到限制该值的限制,那新增加的用户就不能拥有其文件了。
需要注意的是,该值并不是越大越好的,过大的设置会消耗VPS的内存资源,够用就可以了。
3、设置second-level quotas
实际上,只要激活VE的second-level支持,后面的设置就会交由VE内Linux核心的quota模块和套件处理了。
进入VE中:
引用
# vzctl enter 115
entered into VE 115
entered into VE 115
查询quota 套件:
引用
# rpm -qa|grep quota
quota-3.12-5
quota-3.12-5
磁盘支持:
引用
# cat /etc/mtab
/dev/simfs / reiserfs rw,usrquota,grpquota 0 0
proc /proc proc rw,nodiratime 0 0
devpts /dev/pts devpts rw 0 0
/dev/simfs / reiserfs rw,usrquota,grpquota 0 0
proc /proc proc rw,nodiratime 0 0
devpts /dev/pts devpts rw 0 0
设置:
(单位是1Kb bytes)
引用
# edquota root
Disk quotas for user root (uid 0):
Filesystem blocks soft hard inodes soft hard
/dev/simfs 404036 512000 512000 23213 50000 50000
Disk quotas for user root (uid 0):
Filesystem blocks soft hard inodes soft hard
/dev/simfs 404036 512000 512000 23213 50000 50000
查看:
引用
# repquota -a
*** Report for user quotas on device /dev/simfs
Block grace time: 00:00; Inode grace time: 00:00
Block limits File limits
User used soft hard grace used soft hard grace
----------------------------------------------------------------------
root -- 404036 512000 512000 23212 50000 50000
named -- 44 0 0 11 0 0
rpm -- 9912 0 0 67 0 0
smmsp -- 4 0 0 1 0 0
apache -- 8 0 0 2 0 0
mysql -- 21040 0 0 53 0 0
*** Report for user quotas on device /dev/simfs
Block grace time: 00:00; Inode grace time: 00:00
Block limits File limits
User used soft hard grace used soft hard grace
----------------------------------------------------------------------
root -- 404036 512000 512000 23212 50000 50000
named -- 44 0 0 11 0 0
rpm -- 9912 0 0 67 0 0
smmsp -- 4 0 0 1 0 0
apache -- 8 0 0 2 0 0
mysql -- 21040 0 0 53 0 0
测试:
引用
# dd if=/dev/zero of=test
dd: writing to `test': Disk quota exceeded
1225865+0 records in
1225864+0 records out
dd: writing to `test': Disk quota exceeded
1225865+0 records in
1225864+0 records out
结果:
引用
# repquota -a
*** Report for user quotas on device /dev/simfs
Block grace time: 00:00; Inode grace time: 00:00
Block limits File limits
User used soft hard grace used soft hard grace
----------------------------------------------------------------------
root -- 512000 512000 512000 23213 50000 50000
named -- 44 0 0 11 0 0
rpm -- 9912 0 0 67 0 0
smmsp -- 4 0 0 1 0 0
apache -- 8 0 0 2 0 0
mysql -- 21040 0 0 53 0 0
*** Report for user quotas on device /dev/simfs
Block grace time: 00:00; Inode grace time: 00:00
Block limits File limits
User used soft hard grace used soft hard grace
----------------------------------------------------------------------
root -- 512000 512000 512000 23213 50000 50000
named -- 44 0 0 11 0 0
rpm -- 9912 0 0 67 0 0
smmsp -- 4 0 0 1 0 0
apache -- 8 0 0 2 0 0
mysql -- 21040 0 0 53 0 0
五、从HW检查Quota状态
使用vzquota可检查/var/vzquota/quota.vpsid的信息:
引用
# vzquota stat 115 -t
resource usage softlimit hardlimit grace
1k-blocks 543008 1048576 1153434
inodes 23347 200000 220000
User/group quota: on,active
Ugids: loaded 21, total 21, limit 100
Ugid limit was exceeded: no
User/group grace times and quotafile flags:
type block_exp_time inode_exp_time dqi_flags
user 0h
group 0h
User/group objects:
ID type resource usage softlimit hardlimit grace status
0 user 1k-blocks 512000 512000 512000 loaded
0 user inodes 23213 50000 50000 loaded
0 group 1k-blocks 510640 0 0 loaded
0 group inodes 22644 0 0 loaded
5 group 1k-blocks 20 0 0 loaded
5 group inodes 514 0 0 loaded
6 group 1k-blocks 0 0 0 loaded
6 group inodes 1 0 0 loaded
[the rest of output is skipped]
resource usage softlimit hardlimit grace
1k-blocks 543008 1048576 1153434
inodes 23347 200000 220000
User/group quota: on,active
Ugids: loaded 21, total 21, limit 100
Ugid limit was exceeded: no
User/group grace times and quotafile flags:
type block_exp_time inode_exp_time dqi_flags
user 0h
group 0h
User/group objects:
ID type resource usage softlimit hardlimit grace status
0 user 1k-blocks 512000 512000 512000 loaded
0 user inodes 23213 50000 50000 loaded
0 group 1k-blocks 510640 0 0 loaded
0 group inodes 22644 0 0 loaded
5 group 1k-blocks 20 0 0 loaded
5 group inodes 514 0 0 loaded
6 group 1k-blocks 0 0 0 loaded
6 group inodes 1 0 0 loaded
[the rest of output is skipped]
六、已知的Bug
1、设置second-level quotas Bug
当你完全按照上面的步骤设置second-level quotas,但在VE中运行发现问题:
引用
# edquota root
edquota: Cannot get info for user quota file from kernel on /dev/simfs: No such process
edquota: Can't initialize quota on /dev/simfs: No such process
No filesystems with quota detected.
edquota: Cannot get info for user quota file from kernel on /dev/simfs: No such process
edquota: Can't initialize quota on /dev/simfs: No such process
No filesystems with quota detected.
可能你和我一样,刚好碰到一个已知的Bug,在下面有描述:
http://bugzilla.openvz.org/show_bug.cgi?id=632
首先,看看你HW使用的核心版本:
引用
# rpm -qa|grep ovzkernel
ovzkernel-smp-2.6.9-023stab044.4
ovzkernel-smp-2.6.9-023stab044.4
如果刚好和我一样,那恭喜你了!,升级核心吧:
# yum update ovzkernel-smp
用2.6.9-023stab046.2-smp版本的核心即可避免该问题。