在Linux下检测配额的块大小

8
Linux中对磁盘配额的限制是按块计算的。然而,我找不到可靠的方法来确定块大小。我发现的教程将块大小称为512字节,有时也称为1024字节。
我在阅读LinuxForum.org上的帖子时感到困惑,不知道块大小真正意味着什么。因此,我试图在配额的上下文中找到该含义。
我发现了一个“确定硬盘文件系统上的块大小以用于磁盘配额”的NixCraft提示, 建议使用以下命令:
dumpe2fs /dev/sdXN | grep -i 'Block size'

或者

blockdev --getbsz /dev/sdXN

但在我的系统上,这些命令返回了4096,当我检查同一系统上的实际配额块大小时,我得到了1024字节的块大小。
有没有一种可编写脚本的方法来确定设备的配额块大小,而不需要创建已知大小的文件并检查其配额使用情况?
1个回答

7

文件系统块大小和配额块大小可能不同。 配额块大小由 <sys/mount.h> (/usr/include/sys/mount.h)中定义的BLOCK_SIZE宏指定:

#ifndef _SYS_MOUNT_H
#define _SYS_MOUNT_H    1

#include <features.h>
#include <sys/ioctl.h>

#define BLOCK_SIZE      1024
#define BLOCK_SIZE_BITS 10
...

给定文件系统的文件系统块大小由statvfs调用返回:
#include <stdio.h>
#include <sys/statvfs.h>

int main(int argc, char *argv[])
{
    char *fn;
    struct statvfs vfs;

    if (argc > 1)
        fn = argv[1];
    else
        fn = argv[0];

    if (statvfs(fn, &vfs))
    {
        perror("statvfs");
        return 1;
    }

    printf("(%s) bsize: %lu\n", fn, vfs.f_bsize);

    return 0;
}

头文件<sys/quota.h>包含一个方便的宏,用于将文件系统块转换为磁盘配额块:

/*
 * Convert count of filesystem blocks to diskquota blocks, meant
 * for filesystems where i_blksize != BLOCK_SIZE
 */
#define fs_to_dq_blocks(num, blksize) (((num) * (blksize)) / BLOCK_SIZE)

那么您是说quota-block-size是一个系统常量,并且是当前glibc (/usr/include/sys/mount.h)和/或内核 (/usr/include/linux/fs.h)版本的特性?是否有一种通过/proc/sys获取此值的方法,或者我应该只需了解已安装的glibc/kernel即可? - Chen Levy
这是内核 ABI 的一部分,对用户空间来说是不可更改的。 - caf
1
文件系统块大小和配额块大小可能不同。配额块大小由在<sys/mount.h>中定义的BLOCK_SIZE宏给出。非常有用,谢谢!您从哪里获取的信息?我想查看原始参考资料... - Dr. Jan-Philip Gehrcke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接