跳过导航链接 | |
退出打印视图 | |
Oracle Solaris ZFS 管理指南 Oracle Solaris 10 8/11 Information Library (简体中文) |
1. Oracle Solaris ZFS 文件系统(介绍)
3. Oracle Solaris ZFS 与传统文件系统之间的差别
5. 安装和引导 Oracle Solaris ZFS 根文件系统
7. 使用 Oracle Solaris ZFS 快照和克隆
8. 使用 ACL 和属性保护 Oracle Solaris ZFS 文件
可以使用 quota 属性对文件系统可以使用的磁盘空间量设置限制。此外,还可以使用 reservation 属性来保证一定的磁盘空间量供文件系统使用。这两个属性将应用于设置了它们的数据集以及该数据集的所有后代。
也就是说,如果对 tank/home 数据集设置了配额,则 tank/home 及其所有后代使用的总磁盘空间量不能超过该配额。同样,如果为 tank/home 指定了预留空间,则 tank/home 及其所有后代都会使用该预留空间。数据集及其所有后代使用的磁盘空间量由 used 属性报告。
refquota 和 refreservation 属性用于管理文件系统空间,但不会将后代(如快照和克隆)占用的磁盘空间计算在内。
在此 Solaris 发行版中,您可以根据属于特定用户或组的文件所占用的磁盘空间量来设置 user 或 group 配额。不能基于卷、早于文件系统版本 4 的文件系统或早于池版本 15 的池设置用户和组配额属性。
确定哪个配额和预留空间功能更有利于管理您的文件系统时,请考虑以下几点:
管理数据集及其后代使用的磁盘空间时,使用 quota 和 reservation 属性会很方便。
refquota 和 refreservation 属性适合于管理数据集占用的磁盘空间。
将 refquota 或 refreservation 属性设置为高于 quota 或 reservation 属性时无效。如果设置了 quota 或 refquota 属性,则尝试超出任一值的操作都将失败。可能会超出大于 refquota 的 quota。例如,如果有些快照块被修改,则可能在超出 refquota 之前实际已超出 quota。
用户和组配额提供了一种方法,可以在具有很多用户帐户的情况下更轻松地管理磁盘空间,例如在大学环境里。
有关设置配额和预留空间的更多信息,请参见设置 ZFS 文件系统的配额和设置 ZFS 文件系统的预留空间。
使用 zfs set 和 zfs get 命令可以设置和显示 ZFS 文件系统的配额。在以下示例中,在 tank/home/jeff 上设置了 10 GB 的配额:
# zfs set quota=10G tank/home/jeff # zfs get quota tank/home/jeff NAME PROPERTY VALUE SOURCE tank/home/jeff quota 10G local
配额还会影响 zfs list 和 df 命令的输出。例如:
# zfs list -r tank/home NAME USED AVAIL REFER MOUNTPOINT tank/home 1.45M 66.9G 36K /tank/home tank/home/eric 547K 66.9G 547K /tank/home/eric tank/home/jeff 322K 10.0G 291K /tank/home/jeff tank/home/jeff/ws 31K 10.0G 31K /tank/home/jeff/ws tank/home/lori 547K 66.9G 547K /tank/home/lori tank/home/mark 31K 66.9G 31K /tank/home/mark # df -h /tank/home/jeff Filesystem Size Used Avail Use% Mounted on tank/home/jeff 10G 306K 10G 1% /tank/home/jeff
请注意,虽然 tank/home 具有 66.9 GB 的可用磁盘空间,但由于 tank/home/jeff 存在配额,tank/home/jeff 和 tank/home/jeff/ws 各自仅有 10 GB 的可用磁盘空间。
不能将配额设置为比数据集当前使用的空间小的数量。例如:
# zfs set quota=10K tank/home/jeff cannot set property for 'tank/home/jeff': size is less than current used or reserved space
可对数据集设置 refquota,以限制该数据集可以使用的磁盘空间量。硬限制不包括后代所占用的磁盘空间。例如,快照占用的空间不会影响 studentA 的 10 GB 配额。
# zfs set refquota=10g students/studentA # zfs list -t all -r students NAME USED AVAIL REFER MOUNTPOINT students 150M 66.8G 32K /students students/studentA 150M 9.85G 150M /students/studentA students/studentA@yesterday 0 - 150M - # zfs snapshot students/studentA@today # zfs list -t all -r students students 150M 66.8G 32K /students students/studentA 150M 9.90G 100M /students/studentA students/studentA@yesterday 50.0M - 150M - students/studentA@today 0 - 100M -
为了更加方便,可对数据集设置其他配额,以帮助管理快照使用的磁盘空间。例如:
# zfs set quota=20g students/studentA # zfs list -t all -r students NAME USED AVAIL REFER MOUNTPOINT students 150M 66.8G 32K /students students/studentA 150M 9.90G 100M /students/studentA students/studentA@yesterday 50.0M - 150M - students/studentA@today 0 - 100M -
在此情况下,studentA 可能会达到 refquota (10 GB) 硬限制,但studentA可以删除文件进行恢复,即使存在快照也是如此。
在上例中,zfs list 输出显示两个配额中的较小者(10 GB 与 20 GB 相比较小)。要查看两个配额的值,请使用 zfs get 命令。例如:
# zfs get refquota,quota students/studentA NAME PROPERTY VALUE SOURCE students/studentA refquota 10G local students/studentA quota 20G local
可以使用 zfs userquota 或 zfs groupquota 命令分别设置用户配额或组配额:例如:
# zfs create students/compsci # zfs set userquota@student1=10G students/compsci # zfs create students/labstaff # zfs set groupquota@labstaff=20GB students/labstaff
按以下方式显示当前用户配额或组配额:
# zfs get userquota@student1 students/compsci NAME PROPERTY VALUE SOURCE students/compsci userquota@student1 10G local # zfs get groupquota@labstaff students/labstaff NAME PROPERTY VALUE SOURCE students/labstaff groupquota@labstaff 20G local
可以通过查询以下属性来显示一般用户或组的磁盘空间使用情况:
# zfs userspace students/compsci TYPE NAME USED QUOTA POSIX User root 350M none POSIX User student1 426M 10G # zfs groupspace students/labstaff TYPE NAME USED QUOTA POSIX Group labstaff 250M 20G POSIX Group root 350M none
要确定个别用户或组的磁盘空间使用情况,可以查询以下属性:
# zfs get userused@student1 students/compsci NAME PROPERTY VALUE SOURCE students/compsci userused@student1 550M local # zfs get groupused@labstaff students/labstaff NAME PROPERTY VALUE SOURCE students/labstaff groupused@labstaff 250 local
使用 zfs get all dataset 命令不会显示用户和组配额属性,它会显示所有其他文件系统属性的列表。
可以按以下方式删除用户配额或组配额:
# zfs set userquota@student1=none students/compsci # zfs set groupquota@labstaff=none students/labstaff
ZFS 文件系统的用户和组配额提供以下功能:
在父文件系统上设置的用户配额或组配额不会被后代文件系统自动继承。
但是,基于具有用户或组配额的文件系统创建克隆或快照时,将应用用户或组配额。同样,使用 zfs send 命令(即使不带 -R 选项)创建流时,文件系统将具有用户或组配额。
非特权用户只能访问自己的磁盘空间使用情况。root 用户或被授予 userused 或 groupused 特权的用户可以访问所有人的用户或组磁盘空间记帐信息。
不能基于 ZFS 卷、早于文件系统版本 4 的文件系统或早于池版本 15 的池设置 userquota 和 groupquota 属性。
用户和组配额的实施可能会延迟几秒钟。这种延迟意味着,在系统发现已超出配额并拒绝其他写入操作(同时显示 EDQUOT 错误消息)之前,用户可能已超出其配额。
您可以使用传统 quota 命令查看 NFS 环境(例如,挂载了 ZFS 文件系统)中的用户配额。不带任何选项的 quota 命令仅显示是否超出用户配额的输出信息。例如:
# zfs set userquota@student1=10m students/compsci # zfs userspace students/compsci TYPE NAME USED QUOTA POSIX User root 350M none POSIX User student1 550M 10M # quota student1 Block limit reached on /students/compsci
如果重置用户配额,而且不再超出配额限制,则可以使用 quota -v 命令查看用户的配额。例如:
# zfs set userquota@student1=10GB students/compsci # zfs userspace students/compsci TYPE NAME USED QUOTA POSIX User root 350M none POSIX User student1 550M 10G # quota student1 # quota -v student1 Disk quotas for student1 (uid 102): Filesystem usage quota limit timeleft files quota limit timeleft /students/compsci 563287 10485760 10485760 - - - - -
ZFS 预留空间是从池中分配的保证可供数据集使用的磁盘空间。因此,如果磁盘空间当前在池中不可用,则不能为数据集预留该空间。所有未占用的预留空间的总量不能超出池中未使用的磁盘空间量。通过使用 zfs set 和 zfs get 命令可以设置和显示 ZFS 预留空间。例如:
# zfs set reservation=5G tank/home/bill # zfs get reservation tank/home/bill NAME PROPERTY VALUE SOURCE tank/home/bill reservation 5G local
预留空间可能会影响 zfs list 命令的输出。例如:
# zfs list -r tank/home NAME USED AVAIL REFER MOUNTPOINT tank/home 5.00G 61.9G 37K /tank/home tank/home/bill 31K 66.9G 31K /tank/home/bill tank/home/jeff 337K 10.0G 306K /tank/home/jeff tank/home/lori 547K 61.9G 547K /tank/home/lori tank/home/mark 31K 61.9G 31K /tank/home/mark
请注意,tank/home 使用的磁盘空间为 5 GB,但 tank/home 及其后代引脚的总空间量远远小于 5 GB。已用空间反映了为 tank/home/bill 预留的空间。在父数据集的已用磁盘空间计算中会考虑预留空间,并会针对其配额、预留空间或同时针对两者进行计数。
# zfs set quota=5G pool/filesystem # zfs set reservation=10G pool/filesystem/user1 cannot set reservation for 'pool/filesystem/user1': size is greater than available space
只要池中有未预留的空间可用,并且数据集的当前使用率低于其配额,数据集便能使用比其预留空间更多的磁盘空间。数据集不能占用为其他数据集预留的磁盘空间。
预留空间无法累积。也就是说,第二次调用 zfs set 来设置预留空间时,不会将该数据集的预留空间添加到现有预留空间中,而是使用第二个预留空间替换第一个预留空间。例如:
# zfs set reservation=10G tank/home/bill # zfs set reservation=5G tank/home/bill # zfs get reservation tank/home/bill NAME PROPERTY VALUE SOURCE tank/home/bill reservation 5G local
可通过设置 refreservation 预留空间来保证用于数据集的磁盘空间,该空间不包括快照和克隆使用的磁盘空间。此预留空间计算在父数据集的使用空间内,并会针对父数据集的配额和预留空间进行计数。例如:
# zfs set refreservation=10g profs/prof1 # zfs list NAME USED AVAIL REFER MOUNTPOINT profs 10.0G 23.2G 19K /profs profs/prof1 10G 33.2G 18K /profs/prof1
还可以对同一数据集设置预留空间,以保证数据集空间和快照空间。例如:
# zfs set reservation=20g profs/prof1 # zfs list NAME USED AVAIL REFER MOUNTPOINT profs 20.0G 13.2G 19K /profs profs/prof1 10G 33.2G 18K /profs/prof1
常规的预留空间计算在父级的使用空间内。
在上例中,zfs list 输出显示两个配额中的较小者(10 GB 与 20 GB 相比较小)。要查看两个配额的值,请使用 zfs get 命令。例如:
# zfs get reservation,refreserv profs/prof1 NAME PROPERTY VALUE SOURCE profs/prof1 reservation 20G local profs/prof1 refreservation 10G local
如果设置了 refreservation,则仅当在此预留空间之外有足够的未预留池空间来容纳数据集中的当前引用字节数时,才允许使用快照。