2012-10-17 3 views
1

J'essaie d'obtenir la taille du secteur, en particulier pour que je puisse correctement dimensionner le tampon pour la lecture/écriture avec O_DIRECT.Obtenir la taille du secteur de disque sans l'autorisation du système de fichiers raw

Le code suivant fonctionne lorsque mon application est exécutée en tant que root:

int fd = open("/dev/xvda1", O_RDONLY|O_NONBLOCK); 
size_t blockSize; 
int rc = ioctl(fd, BLKSSZGET, &blockSize); 

Comment puis-je obtenir la taille du secteur sans qu'il soit en tant que root?

+0

Lisez-vous (avec 'O_DIRECT') la partition brute, ou un fichier sur un système de fichiers? –

+0

Pourquoi demandez-vous? Cherchez-vous la meilleure performance d'IO, ou pour d'autres raisons? –

+0

@BasileStarynkevitch Je suis en train de lire et d'écrire dans des fichiers, et j'utilise O_DIRECT pour les performances, car je ne lis ou n'écrit qu'un seul élément de 512 octets positionné aléatoirement. – Max

Répondre

1

Selon la page de manuel Linux open():

Dans les restrictions d'alignement Linux varient selon le système de fichiers et la version du noyau et pourrait être complètement absent. Toutefois, il n'existe actuellement aucune interface indépendante du système de fichiers permettant à une application de découvrir ces restrictions pour un fichier ou un système de fichiers donné. Certains systèmes de fichiers fournissent leurs propres interfaces pour ce faire, par exemple l'opération XFS_IOC_DIOINFO dans xfsctl (3).

Il semblerait donc que vous puissiez obtenir cette information en utilisant xfsctl() ... si vous utilisez xfs. Comme votre périphérique de bloc sous-jacent est un périphérique de bloc virtuel Xen et qu'il peut y avoir un nombre de couches inférieur (LVM, dm-crypt, un autre système de fichiers, etc.), je ne suis pas sûr de la signification de tout cela sera vraiment pour toi.

0

Vous pouvez utiliser le stat(2) et le syscall associé (peut-être sur un fichier particulier), puis utiliser le champ st_blksize. Cependant, cela donnerait une taille de bloc liée au système de fichiers, pas la taille du secteur comme préféré par le matériel. Mais pour O_DIRECT entrée (à partir d'un fichier sur le système de fichiers!) Que st_blocksize pourrait être plus pertinent. Sinon, je suggère une taille de puissance de deux, peut-être 8 Ko ou 64 Ko, comme la taille de vos lectures O_DIRECT (et vous voudrez peut-être aligner votre tampon de lecture sur la taille de la page, généralement 4 Ko).

Questions connexes