【问题标题】:Block device information without mounting in Linux在 Linux 中不挂载的块设备信息
【发布时间】:2012-01-15 00:27:17
【问题描述】:

我正在尝试在 C++ 中获取 linux 中块设备的一些信息(特别是块大小)。是否可以在不安装设备并且可能不查看动态文件(如/sys 中的文件)的情况下获取设备的块大小,但仅使用系统调用。

我尝试使用stat,但如果我询问/dev/sdb2,它会返回有关/dev 文件系统的数据。

如果系统调用不可能,我应该在哪里查看动态文件(也无法找到它。)

【问题讨论】:

    标签: linux block-device


    【解决方案1】:

    您想使用ioctl,尤其是BLKSSZGET

    引用 linux/fs.h:

    #define BLKSSZGET  _IO(0x12,104)/* get block device sector size */
    

    未经测试的例子:

    #include <sys/ioctl.h>
    #include <linux/fs.h>
    
    int fd = open("/dev/sda");
    size_t blockSize;
    int rc = ioctl(fd, BLKSSZGET, &blockSize);
    

    【讨论】:

    • 哦,有人可能会建议,为什么我得到一个零?
    • @shbk - blockSize 是零还是 rc?两者都为零会令人惊讶。
    • 是的,就是这样。我应该更加注意。谢谢。
    • 记录:BLKSSZGET = 逻辑块大小,BLKBSZGET = 物理块大小,BLKGETSIZE64 = 设备大小(以字节为单位),BLKGETSIZE = 设备大小/512。至少如果 fs.h 中的 cmets 和我的实验是可以信任的。
    【解决方案2】:

    我认为ioctl 的值应该是unsigned long 而不是size_t(最新的是更多的内存相关),我还将它初始化为0(以防BLKSSZGET 返回unsigned int)。

    #include <sys/ioctl.h>
    #include <linux/fs.h>
    
    int fd = open("/dev/sda");
    unsigned long blockSize = 0;
    int rc = ioctl(fd, BLKSSZGET, &blockSize);
    

    【讨论】:

    • 他们是fs.h 中的size_t,fwiw:#define BLKBSZGET _IOR(0x12,112,size_t)#define BLKBSZSET _IOW(0x12,113,size_t)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-31
    • 1970-01-01
    • 2019-05-19
    • 2011-10-13
    • 1970-01-01
    • 2014-06-08
    相关资源
    最近更新 更多