2010-03-24 14 views
7

Die Begrenzung der Festplattenkontingente unter Linux wird in Blöcken gezählt. Ich habe jedoch keine zuverlässige Methode gefunden, um die Blockgröße zu bestimmen. Tutorials, die ich gefunden habe, beziehen sich auf Blockgröße als 512 Bytes und manchmal als 1024 Bytes.Blockgröße für Kontingent unter Linux erkennen

Ich habe verwirrt gelesen post on LinuxForum.org für was eine Blockgröße wirklich bedeutet. Also habe ich versucht, diese Bedeutung im Kontext der Quote zu finden.

fand ich eine "Bestimmen Sie die Blockgröße auf der Festplatte Dateisystem für Disk Quota" tip on NixCraft, dass der Befehl vorgeschlagen:

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

oder

blockdev --getbsz /dev/sdXN 

Aber auf meinem System diese Befehle zurück 4096 und als ich die tatsächliche Quota-Blockgröße auf dem gleichen System überprüfte, bekam ich eine Blockgröße von 1024 Bytes.

Gibt es eine skriptfähige Möglichkeit, die Größe des Kontingentblocks auf einem Gerät zu ermitteln, kurz bevor eine Datei bekannter Größe erstellt und deren Kontingentnutzung überprüft wird?

Antwort

7

Das Dateisystem Blocksize und die Quota Blocksize sind möglicherweise unterschiedlich. Die Quote Blockgröße wird durch die BLOCK_SIZE Makro definiert in <sys/mount.h> (/usr/include/sys/mount.h) gegeben:

#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 
... 

Die Dateisystem-Blockgröße für ein gegebenes Dateisystem durch den statvfs Aufruf zurückgegeben wird:

#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; 
} 

der <sys/quota.h> Header enthält eine Bequemlichkeit Makro-Dateisystem-Blöcke auf dem Datenträger Kontingent Blöcke zu konvertieren:

/* 
* 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) 
+0

So sagen Sie, dass die Quote -block-size ist eine Systemkonstante und ist eine Funktion der aktuellen glibc (/usr/include/sys/mount.h) und/oder der Kernel-Version (/usr/include/linux/fs.h)? Gibt es eine Möglichkeit, diesen Wert mit '/ proc' oder'/sys' zu erreichen, oder sollte ich einfach den installierten glibc/kernel kennen? –

+0

Es ist ein Teil des Kernel ABI Userspace - so kann es nicht geändert werden. – caf

+1

"Das Dateisystem blocksize und das Quota blocksize sind potentiell verschieden. Das quota blocksize wird durch das Makro BLOCK_SIZE definiert, das in definiert ist" -> Extrem nützlich, danke! Woher hast du das? Ich würde gerne die Originalreferenz sehen ... –