Detecte o tamanho do bloco para cota no Linux
Pergunta
O limite colocado na cota de disco no Linux é contado em blocos. No entanto, não encontrei uma maneira confiável de determinar o tamanho do bloco. Tutoriais que encontrei, consulte o tamanho do bloco como 512 bytes e, às vezes, como 1024 bytes.
Fiquei confuso lendo um Publique no Linuxforum.org Para o que um tamanho de bloco realmente significa. Então eu tentei encontrar esse significado no contexto da cota.
Encontrei um "Determine o tamanho do bloco no sistema de arquivos de disco rígido para cota de disco" dica sobre nixcraft, isso sugeriu o comando:
dumpe2fs /dev/sdXN | grep -i 'Block size'
ou
blockdev --getbsz /dev/sdXN
Mas no meu sistema esses comandos retornaram 4096 e, quando verifiquei o tamanho real do bloco de cotas no mesmo sistema, recebi um tamanho de bloco de 1024 bytes.
Existe uma maneira rivável de determinar o tamanho do bloco de cota em um dispositivo, com falta de criação de um arquivo de tamanho conhecido e verificando seu uso de cotas?
Solução
O sistema de arquivos bloqueia e o bloco de cota é potencialmente diferente. O tamanho da cota é dado pelo BLOCK_SIZE
macro definido em <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
...
O sistema de arquivos bloqueia para um determinado sistema de arquivos é retornado pelo statvfs
ligar:
#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;
}
o <sys/quota.h>
O cabeçalho inclui uma macro de conveniência para converter blocos de sistema de arquivos em blocos de cotas de disco:
/*
* 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)