Определить размер блока для квоты в Linux - PullRequest
7 голосов
/ 24 марта 2010

Предел, установленный для дисковой квоты в Linux, считается в блоках. Однако я не нашел надежного способа определения размера блока. Учебники, которые я нашел, ссылаются на размер блока как 512 байт, а иногда и 1024 байт.

Я запутался, читая пост на LinuxForum.org о том, что на самом деле означает размер блока. Поэтому я попытался найти это значение в контексте квоты.

Я обнаружил подсказку «Определить размер блока в файловой системе жесткого диска для дисковой квоты» в NixCraft , в которой была предложена команда:

dumpe2fs /dev/sdXN | grep -i 'Block size'

или

blockdev --getbsz /dev/sdXN

Но в моей системе эти команды вернули 4096, и когда я проверил реальный размер блока квоты в той же системе, я получил размер блока 1024 байта.

Существует ли способ определения размера блока квоты на устройстве с помощью сценариев, за исключением создания файла с известным размером и проверки его использования по квоте?

1 Ответ

7 голосов
/ 24 марта 2010

Размер блоков файловой системы и размер блоков квот потенциально различны. Размер блока квоты задается макросом 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)
...