Определить размер блока для квоты в Linux
Ограничение на дисковую квоту в Linux считается в блоках. Однако я не нашел надежного способа определения размера блока. Учебники, которые я нашел, ссылаются на размер блока как 512 байт, а иногда и 1024 байт.
Я запутался, читая пост на LinuxForum.org о том, что на самом деле означает размер блока. Поэтому я попытался найти это значение в контексте квоты.
Я нашел подсказку "Определить размер блока в файловой системе жесткого диска для дисковой квоты" в NixCraft, в которой была предложена команда:
dumpe2fs /dev/sdXN | grep -i 'Block size'
или же
blockdev --getbsz /dev/sdXN
Но в моей системе эти команды вернули 4096, и когда я проверил реальный размер блока квоты в той же системе, я получил размер блока 1024 байта.
Существует ли способ определения размера блока квоты на устройстве с помощью сценариев, за исключением создания файла с известным размером и проверки его использования по квоте?
1 ответ
Размер блоков файловой системы и размер блоков квот потенциально различны. Размер блока квоты задается 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)