Используйте жесткий диск SATA в качестве блочного устройства

Я совершенно новичок в ядре Linux, поэтому я, наверное, все перепутал. Но любой совет мне поможет;)

У меня есть жесткий диск SATA, подключенный через карту SATA PCIe, и я пытаюсь использовать read а также write как на блочном устройстве. Я также хочу, чтобы отключение питания данных сохранялось на жестком диске - не кэшировалось. И в конце я должен проанализировать, сколько времени я теряю в каждом слое стека Linux. Но по одному шагу за раз.

На данный момент я пытаюсь open устройство с *O_DIRECT*. Но я не совсем понимаю, где я могу найти устройство. Это проявляется как /dev/sdd и я создал один раздел /dev/sdd1,

  • open а также read на раздел /dev/sdd1 работает. write не удается с *O_DIRECT* (но я уверен, что у меня правильный размер блока)
  • openread а также write призвал /dev/sdd терпит неудачу полностью.
  • Может быть, есть еще один файл в /dev/ который представляет мое устройство на блочном слое?
  • Каковы мои ошибки и неправильные предположения?

Это мой текущий тестовый код

int main() {
    int w,r,s;
    char buffer[512] = "test string mit 512 byte";

    printf("test\n");

    // OPEN
    int fd = open("/dev/sdd", O_DIRECT | O_RDWR | O_SYNC);
    printf("fd = %d\n",fd);

    // WRITE
    printf("try to write %d byte : %s\n",sizeof(buffer),buffer);
    w = write(fd,buffer,sizeof(buffer));
    if(w == -1) printf("write failed\n");
    else printf("write ok\n");

    // RESET BUFFER
    memset(buffer,0,sizeof(buffer));

    // SEEK
    s = lseek(fd,0,SEEK_SET);   
    if(s == -1) printf("seek failed\n");
    else printf("seek ok\n");

    // READ
    r = read(fd,buffer,sizeof(buffer));
    if(r == -1) printf("read failed\n");
    else printf("read ok\n");

    // PRINT BUFFER
    printf("buffer = %s\n",buffer);

    return 0;
}

Редактировать: я работаю с ядром 3.2 на мощной архитектуре - если это важно.

Большое спасибо за ваше время, Фабиан

1 ответ

В зависимости от размера блока вашего SDD (может быть 512 бит или 4K), вы можете только читать / записывать кратные из этого размера.

Также: при использовании флага O_DIRECT необходимо убедиться, что буфер правильно выровнен по границам блоков. Вы не можете гарантировать, что используя обычный массив символов, используйте memalign для выделения выровненной памяти.

Другие вопросы по тегам