我的磁盘是 sda,我有这些大小的文件:
/sys/dev/block/8:0/size
/sys/class/block/sda/size
/sys/block/sda/size
我应该使用哪一个?第一个被使用lsblk
。有什么不同吗?
我的磁盘是 sda,我有这些大小的文件:
/sys/dev/block/8:0/size
/sys/class/block/sda/size
/sys/block/sda/size
我应该使用哪一个?第一个被使用lsblk
。有什么不同吗?
查看
您会看到所有三个都指向同一个目录。
除了它们的路径之外,文件之间没有区别。
如果你有块设备文件的路径,例如
/dev/sda
,/dev/disk/by-id/whatever
,some/path/to/my/loop/device
,有几个选项可以在 Linux 上获取它的大小,包括:打开()设备并发出
BLKGETSIZE64
ioctl()
. 就是blockdev --getsize64 path/to/block/device
这样。open() 设备并发出
BLKGETSIZE
ioctl()
类似blockdev --getsz path/to/block/device
的命令,并将其乘以 512(不是BLKSSZGET
ioctl() (asblocksize --getss path/to/block/device
) 返回的值)。open() 设备,lseek() 到最后将返回当前光标位置。例如,在
zsh
:假设 sysfs 挂载在 中
/sys
,在其中找到设备文件的相应路径,读取其中的size
文件并乘以 512(不是其中任何queue/*size
文件中的值)。对于上面的1到3,你至少需要对块设备有读写权限。
对于 4,由于块设备文件的名称可以是任何名称,因此识别 /sys 路径的可靠方法以及
lsblk
您发现的是依赖于通过stat()
调用获得的主要和次要设备号块设备的路径(您只需要搜索父目录的访问权限)然后使用/sys/dev/block/<major>:<minor>
which 将是/sys/devices
块设备树中目录的符号链接,<major>
并<minor>
作为主要/次要编号。例如,与
zsh
:或者你可以
lsblk
为你做这件事:/sys/dev/block/8:0
,/sys/class/block/sda
并且/sys/block/sda
都只是指向同一位置的符号链接,因此使用哪个并不重要。