示例 shell 脚本

示例 shell 脚本

我有一个 ZFS 文件系统,其中有超过 35TB 的数据,但不知道有多少人添加了数据。在不知道 zfs 文件系统中所有用户的数据的情况下,如何获取每个用户使用情况的报告(如 zfs get userused@{uid} 的输出)?

答案1

您可以使用zfs userspace(和zfs groupspace) 来执行此操作,这将显示在文件系统中拥有文件(意味着他们是文件的当前所有者)或在文件系统中拥有配额(由 设置zfs set userquota)或两者的所有用户。请注意,它不是递归的(类似于zfs list,因此您可能必须为每个子文件系统调用它。

示例 shell 脚本

#!/bin/ksh

# get all children file systems from given file system argument
filesystems=$(zfs list -Hro name "${1}")

# get all space usage line by line in the format
# <usedspace>\t<userquota>\t<username>\t<filesystem>\n
# (it can later be sorted by the first column)
for filesystem in ${filesystems}; do
    sizes=$(zfs userspace -Hp -o used,quota,name "${filesystem}")
    IFS=$'\n'

    # multi-line output of userspace makes inner loop necessary
    for size in ${sizes}; do
        printf "%s\\t%s\\n" "${size}" "${filesystem}"
    done
    unset IFS
done

示例输出

root@host:/root# ./test.sh rpool | sort -rn
cannot get used/quota for rpool/dump: dataset is busy
cannot get used/quota for rpool/swap: dataset is busy
4273131520      none    root    rpool/ROOT/omnios-2
4197847040      none    root    rpool/ROOT/omnios-1
2681162240      none    root    rpool/ROOT/omnios
[...]

包含可用选项的手册页详细信息

 zfs userspace [-Hinp] [-o field[,field]...] [-s field]... [-S field]...
   [-t type[,type]...] filesystem|snapshot
   Displays space consumed by, and quotas on, each user in the specified
   filesystem or snapshot. This corresponds to the userused@user and
   userquota@user properties.

   -H  Do not print headers, use tab-delimited output.

   -S field
       Sort by this field in reverse order. See -s.

   -i  Translate SID to POSIX ID. The POSIX ID may be ephemeral if no
       mapping exists.  Normal POSIX interfaces (for example, stat(2), ls
       -l) perform this translation, so the -i option allows the output
       from zfs userspace to be compared directly with those utilities.
       However, -i may lead to confusion if some files were created by an
       SMB user before a SMB-to-POSIX name mapping was established. In
       such a case, some files will be owned by the SMB entity and some by
       the POSIX entity. However, the -i option will report that the POSIX
       entity has the total usage and quota for both.

   -n  Print numeric ID instead of user/group name.

   -o field[,field]...
       Display only the specified fields from the following set: type,
       name, used, quota.  The default is to display all fields.

   -p  Use exact (parsable) numeric output.

   -s field
       Sort output by this field. The -s and -S flags may be specified
       multiple times to sort first by one field, then by another. The
       default is -s type -s name.

   -t type[,type]...
       Print only the specified types from the following set: all,
       posixuser, smbuser, posixgroup, smbgroup.  The default is -t
       posixuser,smbuser.  The default can be changed to include group
       types.

 zfs groupspace [-Hinp] [-o field[,field]...] [-s field]... [-S field]...
   [-t type[,type]...] filesystem|snapshot
   Displays space consumed by, and quotas on, each group in the specified
   filesystem or snapshot. This subcommand is identical to zfs userspace,
   except that the default types to display are -t posixgroup,smbgroup.

相关内容