Détecter la taille des blocs de quotas sous Linux
Question
La limite placée sur le quota de disque sous Linux est compté dans les blocs. Cependant, j'ai trouvé aucun moyen fiable de déterminer la taille du bloc. Tutoriels Je trouve référence à la taille du bloc de 512 octets, et parfois 1024 octets.
Je me suis embrouillé la lecture d'un après le LinuxForum.org quelle taille de bloc signifie vraiment. J'ai donc essayé de trouver ce sens dans le cadre du quota.
J'ai trouvé un « Déterminer la taille du bloc sur le système de fichiers du disque dur pour le quota de disque » tip sur NixCraft, qui a suggéré la commande:
dumpe2fs /dev/sdXN | grep -i 'Block size'
ou
blockdev --getbsz /dev/sdXN
Mais sur mon système ces commandes sont revenus 4096, et quand j'ai vérifié la taille réelle du bloc de quotas sur le même système, je me suis une taille de bloc de 1024 octets.
Y at-il un moyen scriptable pour déterminer la taille du bloc de quotas sur un dispositif, à court de créer un fichier de taille connue, et le vérifier est l'utilisation des quotas?
La solution
Le système de fichiers et le blocksize blocksize des quotas sont potentiellement différentes. La taille de bloc de quota est donnée par la macro BLOCK_SIZE
défini dans <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
...
Le système de fichiers pour blocksize un système de fichiers donné est renvoyé par l'appel 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;
}
L'en-tête <sys/quota.h>
comprend une macro pratique pour convertir des blocs de système de fichiers à des blocs de quotas de disque:
/*
* 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)