Получаване на размера на сектора на диска без разрешение за необработена файлова система

Опитвам се да получа размера на сектора, по-специално, за да мога да оразмеря правилно буфера за четене/запис с O_DIRECT.

Следният код работи, когато приложението ми се изпълнява като root:

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

Как мога да получа размера на сектора, без да се изпълнява като root?


person Max    schedule 17.10.2012    source източник
comment
Четете ли (с O_DIRECT) необработения дял или някакъв файл във файловата система в него?   -  person Basile Starynkevitch    schedule 17.10.2012
comment
Защо питаш? Търсите ли най-добрата IO производителност или поради някакви други причини?   -  person Basile Starynkevitch    schedule 17.10.2012
comment
@BasileStarynkevitch Чета и пиша във файлове и използвам O_DIRECT за производителност, тъй като винаги чета или пиша само произволно позициониран 512-байтов блок.   -  person Max    schedule 17.10.2012


Отговори (2)


Според ръководството на Linux за open():

В Linux ограниченията за подравняване варират според файловата система и версията на ядрото и може да липсват напълно. Понастоящем обаче няма независим от файловата система интерфейс за приложение, за да открие тези ограничения за даден файл или файлова система. Някои файлови системи предоставят свои собствени интерфейси за това, например операцията XFS_IOC_DIOINFO в xfsctl(3).

Така че изглежда, че можете да получите тази информация с помощта на xfsctl()... ако използвате xfs.

Тъй като основното ви блоково устройство е виртуално блоково устройство на Xen и може да има произволен брой слоеве под него (LVM, dm-crypt, друга файлова система и т.н...), не съм сигурен колко значимо ще бъде всичко това за ти.

person Celada    schedule 17.10.2012

Можете да използвате stat(2) и свързания syscall (може би на конкретен файл), след това използвайте полето st_blksize. Това обаче би дало свързан с файловата система размер на блока, а не размера на сектора, както се предпочита от хардуера. Но за O_DIRECT вход (от файл във файловата система!), че st_blocksize може да е по-подходящо.

В противен случай бих предложил размер на степен две, може би 8Kbytes или 64Kbytes, както е размерът на вашия O_DIRECT-ed reads (и може да искате да приведете вашия буфер за четене към размера на страницата, обикновено 4Kbytes).

person Basile Starynkevitch    schedule 17.10.2012