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

Я пытаюсь получить размер сектора, в частности, чтобы правильно определить размер буфера для чтения/записи с помощью 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
Почему ты спрашиваешь? Вы ищете лучшую производительность ввода-вывода или по каким-то другим причинам?   -  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) и соответствующий системный вызов (возможно, для какого-то конкретного файла), затем используйте поле st_blksize. Однако это даст размер блока, связанный с файловой системой, а не размер сектора, который предпочитает аппаратное обеспечение. Но для ввода O_DIRECT (из файла в файловой системе!), st_blocksize может быть более подходящим.

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

person Basile Starynkevitch    schedule 17.10.2012