检测 Linux 中配额的块大小
题
Linux 中磁盘配额的限制以块为单位。但是,我没有找到可靠的方法来确定块大小。我发现教程将块大小称为 512 字节,有时称为 1024 字节。
我读起来很困惑 在 LinuxForum.org 上发帖 了解块大小的真正含义。所以我试图在配额的背景下找到这个含义。
我发现“确定硬盘文件系统上的块大小以实现磁盘配额” NixCraft 的提示, ,建议使用以下命令:
dumpe2fs /dev/sdXN | grep -i 'Block size'
或者
blockdev --getbsz /dev/sdXN
但在我的系统上,这些命令返回 4096,当我检查同一系统上的实际配额块大小时,我得到的块大小为 1024 字节。
是否有一种可编写脚本的方法来确定设备上的配额块大小,无需创建已知大小的文件并检查其配额使用情况?
解决方案
文件系统块大小和配额块大小可能不同。配额块大小由下式给出 BLOCK_SIZE
宏定义于 <sys/mount.h>
(/usr/include/sys/mount.h):
#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)
不隶属于 StackOverflow