首页 文章

使用SATA HDD作为块设备

提问于
浏览
1

我对Linux内核完全不熟悉,所以我可能会混淆一下 . 但任何建议都会对我有帮助;)

我有一个通过PCIe SATA卡连接的SATA硬盘,我尝试在块设备上使用 readwrite . 我还希望将数据电源中断保存在硬盘上 - 而不是缓存 . 最后,我必须分析每个linux堆栈层中的松散时间 . 但是一步一步 .

目前我尝试使用* O_DIRECT *设备 open . 但我真的不明白我在哪里可以找到这个设备 . 它显示为 /dev/sdd ,我创建了一个分区 /dev/sdd1 .

分区 /dev/sdd1 上的

  • openread 有效 . write 失败并带有* O_DIRECT *(但我确定我有正确的块大小)
    009 open readwrite 呼叫 /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内核 - 如果这很重要的话 .

非常感谢您的时间,Fabian

1 回答

  • 1

    根据SDD的块大小(可以是512位或4K),您只能读取/写入该大小的多个块 .

    另外:当使用O_DIRECT标志时,您需要确保缓冲区正确对齐以阻止边界 . 您无法确保使用普通的char数组,而是使用memalign来分配对齐的内存 .

相关问题