如何找出块设备(例如/dev/sda)的大小?运行ls -l不会提供有用的信息。

评论

了解块大小:wiki.linuxquestions.org/wiki/Block_size

知道我要迟到9年了,所以您可以通过lsblk命令找到答案。

#1 楼

fdisk无法理解运行Linux的Mac使用的分区布局,也无法理解任何其他非PC分区格式。 (是的,对于旧的Mac分区表有mac-fdisk,对于较新的GPT分区表有gdisk,但是那并不是唯一的其他分区布局。)由于内核已经在扫描时阻止设备投入使用,为什么不直接问它?

$ cat /proc/partitions
major minor  #blocks  name

   8       16  390711384 sdb
   8       17     514079 sdb1
   8       18  390194752 sdb2
   8       32  976762584 sdc
   8       33     514079 sdc1
   8       34  976245952 sdc2
   8        0  156290904 sda
   8        1     514079 sda1
   8        2  155774272 sda2
   8       48 1465138584 sdd
   8       49     514079 sdd1
   8       50 1464621952 sdd2


评论


这不适用于CD驱动器

–GS-向Monica道歉
10-4-22在20:30

并且仅报告“本地”名称。在具有iSCSI和/或多路径和/或LVM的服务器上,您会获得很多sd *和dm- *设备,但是通常您需要查找您真正感兴趣的设备的符号链接(例如/ dev /映射器/ *一个)

–Luke404
13年7月30日在8:32

此处报告的值是1KiB的倍数,可能是一个扇区(512字节)太小。

– Lekensteyn
15/12/26在21:31

这对我很有用。我最终做了awk'/ sd [a-z] $ / {printf“%s%8.2f GiB \ n”,$ NF,$(NF-1)/ 1024/1024}'/ proc / partitions

– suprjami
16年8月5日,下午3:01

#2 楼

blockdev --getsize64 /dev/sda返回以字节为单位的大小。

blockdev --getsz /dev/sda返回以512字节扇区为单位的大小。 util-linux。

评论


不幸的是需要超级用户的力量

–heinrich5991
2012年10月3日在18:51

@ heinrich5991您别无选择。普通用户不能直接访问块设备(“原始读取”它),这对安全性很有帮助。

– Tortor
13年5月23日在7:38

@ heinrich5991使用文件系统时,您应该询问statfs()和朋友。更重要的是,您不应假定块设备大小与文件系统上的总空间/可用空间/有效空间/空闲空间/任何空间之间有任何直接关系。

–Luke404
13年8月1日在7:24

linux.die.net/man/8/blockdev上的联机帮助页上说--getsize已过时,建议--getsz使用一致的512字节扇区。如果必须使用--getsize,我猜也应该使用--getss以确保扇区大小符合您的期望。

–mwfearnley
18年1月28日在17:49

如果用户具有磁盘设备节点的读取权限,则好像blockdev --getsize *(可能还有底层的BLKGETSIZE64 ioctl)似乎不需要超级用户权限:```#sudo -u user id uid = 314(user) gid = 4000(eng)groups = 4000(eng)#ls -l hdw1 brw-rw ---- 1个用户磁盘8,177 Apr 10 17:17 hdw1#sudo -u user blockdev --getsize64 hdw1 983040#ls- l $ {which blockdev)#没有setuid位-rwxr-xr-x 2根root 26752 1999年12月31日/ sbin / blockdev```

– Kirill Spitsyn
18年4月19日在17:16



#3 楼

cat /sys/class/block/sda/size


这将以512字节块为单位提供其大小。

评论


@ heinrich5991如何确定设备块大小始终为512字节?

– Tortor
13年5月26日在19:19



根据源,扇区大小始终为512字节。为了将来,我正在尝试记录此接口。

– Lekensteyn
15/12/26在21:39

谢谢你说清楚。我注意到,还有一个/ sys / class / block / sda / queue / logical_block_size。我不确定是否应该使用常量512。

–爱德华·福克
19-10-4在23:10

#4 楼

这个简单的代码。找不到任何文档,但是很好地完成了这个技巧:

#include <linux/fs.h>
...
ioctl(file, BLKGETSIZE64, &file_size_in_bytes);


评论


校正:它实际上使您达到SECTORS的大小。编辑它,我将投票。

– JCCyC
2012年6月22日,1:14

@JCCyC:BLKGETSIZE64返回字节大小。请参阅linux / fs.h,其中指出“返回设备大小(以字节为单位)”。请注意,BLKGETSIZE(无“ 64”)将其返回为“ / 512”。

–Thanatos
13年3月3日在23:26

我在stackoverflow.com/a/48490543/446106上部分基于此得出了更完整的示例。要在此处使用上述代码段,文件必须是文件描述符(例如,来自open()的文件),而file_size_in_bytes应该是size_t。

–mwfearnley
18年1月28日在19:54

(实际上,file_size_in_bytes应该是64位类型,因此应为long long long unsigned。)

–mwfearnley
18年1月28日在20:17

#5 楼

怎么样:

fdisk -l


,这将为您提供所有磁盘的列表以及它们各自的容量,用途等。

评论


尝试使用sudo,否则它什么都不打印。

– Alfe
2012年6月20日上午10:23

#6 楼

交互式使用
lsblk -no SIZE /dev/block-device

请注意,如果有分区,则会得到一个列表,其中列出了设备的总大小,然后是每个分区的大小,或者您可以将该分区附加到设备名称之后。 />脚本编制
如果需要将大小存储在变量中,请使用:
size=$(lsblk -bno SIZE /dev/path | head -1)

现在,结果始终以字节为单位,如果path不包含分区,则为总磁盘大小,否则为分区大小。

评论


+1,最好,最准确的答案。而且它甚至不需要sudo! \ o /

–MestreLion
20 Sep 6 '20 at 10:09

小改进:-bo SIZE似乎意味着-r。另外,由于/ dev / sda之类的设备可能包含分区,因此最好仅考虑第一行:lsblk -bno SIZE / dev / block-device |头-n1

–MestreLion
20-09-6在10:17



@MestreLion:鉴于您的想法,我更新了答案

–antonio
20/09/16 '18:41

#7 楼

blockdev --getsize /dev/sda

评论


与sudo一起使用,否则您将获得权限被拒绝。

– Wimateeka
18年8月9日在18:00

#8 楼

echo "`cat /sys/class/block/sda2/size`*512" | bc


,或者如果您使用bash或任何其他类似POSIX的shell,其算术运算符可处理64位整数,则甚至无需调用bc

echo "$((512*$(cat /sys/class/block/sda2/size)))"


以字节为单位。

cat和fork(bash除外)的调用可以通过bashksh93zsh进行优化,方法如下:
echo "$((512*$(</sys/class/block/sda2/size)))"


#9 楼

不需要在C中使用ioctl。只需查找文件的末尾并以这种方式获取大小(以字节为单位):

 /* define this before any #includes when dealing with large files: */
#define _FILE_OFFSET_BITS 64
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

// ...
int fd = open("/dev/sda", O_RDONLY);
off_t size = lseek(fd, 0, SEEK_END);
// Now size is the size of the file, in bytes, or -1 on error.
// lseek(fd, 0, SEEK_SET) to get back to the start of the file.
 


评论


如果要查找原始磁盘驱动器的大小,则需要root privs打开文件才能查找到结尾。

–爱德华·福克
19-10-4在23:12

#10 楼

blockdev(8)有不同的答案吗?选项--getsz和已弃用的--getsize不同。



BLKSSZGET(blockdev --getss)用于物理扇区大小,

BLKBSZGET(blockdev --getbsz)用于物理扇区大小逻辑扇区大小。

echo $(($(blockdev --getsize64 /dev/sda)/$(blockdev --getss /dev/sda)))


评论


实际上,我认为您已经扭转了这些。 (除非我的系统具有512字节的物理块和4096字节的逻辑块。)

–爱德华·福克
2012年7月10日在19:24

好吧,我意识到Linux内核源代码中的block / ioctl.c包含令人误解的注释。 BLKPBSZGET(注意P)获取物理扇区大小,BLKSSZGET获取逻辑扇区大小,BLKBSZGET(或block / compat_ioctl.c中的BLKBSZGET_32)获取文件系统分配单元(群集)的大小。使用Advanced Format 512e时,逻辑和物理扇区大小会有所不同。 (512e @ WP)

– Palec
2015年2月22日在21:03



@Palec在此问题的所有答案和评论中,最有知识的评论。

–艾尔凡·拉蒂夫(Irfan Latif)
19-09-5在9:26

#11 楼

首先,感谢所有贡献者。我学到了一些
有用的东西。

不过,我的经验是,大多数答案都是不完整的,至少在涉及CD和DVD的地方,
尤其是关于普通用户是否可以使用它们,而不仅仅是超级用户。
这是基于我的Linux Mageia 2上的测试。

用于超级用户的命令始终可以可以由普通用户通过为其加上前缀/sbin/或有时使用/ usr / sbin /来访问。
现在,它们可能会或可能不适用于普通用户。对于普通用户来说,即使在未安装DVD驱动器的情况下,对于DVD驱动器上的DVD也可能有效,而对于硬盘来说,它们却不起作用(再次以普通用户身份调用)。
br />
例如/sbin/fdisk -l /dev/cdrom可以在我的系统上工作,并且
给出驱动器中DVD的“几何形状” ...显然,这显然是胡说八道。但是它确实给出了DVD的大小(以字节为单位)和
扇区,以及正确的扇区大小(通常为DVD的2048字节)。

/usr/sbin/gdisk -l /dev/cdrom也是如此,仅给出2048个字节的扇区大小。

其他示例(作为非root用户,普通用户)

$ /sbin/blockdev --getss /dev/cdrom   # DVD sector size
2048
$ /sbin/blockdev --getsize64 /dev/cdrom  # DVD byte size
5453316096

$ cat /proc/partitions  # see below
...
   8        8  416027241 sda8
  11        0    5325504 sr0
   8       16 1465138584 sdb
...


这适用于DVD驱动器,这里称为sr0,因为用于它的设备实际上是/dev/sr0/dev/cdrom只是指向它的符号链接。
大小以1k块给出。
>
类似地,作为普通用户,命令

$ cat /sys/class/block/sr0/size
10651008


将给出设备/dev/sr0上DVD的大小,以512字节的块为单位
(以及其他磁盘的大小,即使未安装也是如此)。
但是cat /sys/class/block/cdrom/size无法正常工作
/ dev / cdrom只是一个符号链接

命令df有人建议,它给出已安装的分区的大小,而不是整个磁盘的大小。此外,对于已安装的CD或DVD
,它所提供的尺寸小于CD / DVD的实际尺寸。更确切地说,有
可能有两种不同的尺寸:


设备的整体尺寸,包括用于内部组织的尺寸。通常,这是如果使用命令dd复制整个文件而获得的文件大小;
挂载时用户可用的空间大小(可能仅在只读模式下)总是小于。这是命令df指示的大小。


评论


$ / sbin / blockdev --getss / dev / cdrom#的DVD扇区大小

–peterretief
13-10-5在11:02

您说的是512k,但是您的意思是只有512字节的扇区。

–汤姆·黑尔
16年11月10日在8:06

#12 楼

块是具有固定长度的位或字节序列,即512字节,4kB,8kB,16kB,32kB等。

blockdev --getbsz partition


示例

# blockdev --getbsz /dev/sda1 
4096


因此,此文件系统的块大小为4kB。

类比:包装箱中的瓶子数量。

评论


这是正确的答案。

–卡尔·莫里森(Karl Morrison)
18 Mar 17 '18 at 18:19

#13 楼

如果您使用的是Node.js,则可以使用此本机附加组件来获取块设备大小,物理扇区大小和逻辑扇区大小(支持FreeBSD,Linux,macOS和Windows)。它还有一些其他的直接IO帮助器:

https://github.com/ronomon/direct-io

#14 楼

块大小为/sys/block/sda/size吗?如果是哪一个呢?

ioctl BLKGETSIZE存在与以512为单位而不是BLKSSZGET相同的问题。 BLKGETSIZE64解决了这种歧义。实际的块计数是BLKGETSIZE64 / BLKSSZGET。

/*BINFMTC:
http://lkml.indiana.edu/hypermail/linux/kernel/0105.2/0744.html
*/
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/fs.h>
#include <assert.h>

int main(int argc, char **argv)
{
        int fd;
        long blk=0L;
        long ssz=0L;
        long long oct=0LL;

        if((fd=open(argv[1],O_RDONLY))<0) { perror(argv[1]); exit(1); }
        if(ioctl(fd,BLKGETSIZE,&blk)<0) { perror("BLKGETSIZE"); exit(1); }
        if(ioctl(fd,BLKSSZGET,&ssz)<0) { perror("BLKSSZGET"); exit(1); }
        if(ioctl(fd,BLKGETSIZE64,&oct)<0) { perror("BLKGETSIZE64"); exit(1); }
        if(close(fd)<0) { perror("close"); exit(1); }
        printf("BLKGETSIZE=%ld BLKSSZGET=%ld BLKGETSIZE64=%lld BLKGETSIZE64/BLKSSZGET=%ld SIZEGB=%f #%f0GiB\n\n",\
blk,ssz,oct,(long)(oct/(long long)ssz),(double)oct/1000000000.0,(double)oct/1073741824.0);

        fflush(stdout); /* before exec */

        execl("/bin/bash","bash","-c",\
"for i in \
/sys/block/?d?/{size,alignment_offset,?d??/size,?d??/alignment_offset,queue/*block*,queue/*sector*}; \
do test -f \"$i\" && echo \"$i: $(<$i)\"; done"\
,NULL);

        exit(127);
        return 127; /* not reached */
}


请参阅http://lkml.indiana.edu/hypermail/linux/kernel/0105.2/0744.html

评论


滥用断言:如果禁用断言,则不再发生必要的副作用。

– Alfe
2012年6月20日10:25

#15 楼

有一个名为inq的EMC实用程序,它提供有关所有类型的块设备的信息,例如本地连接的,基于SAN的等。

试用一下。

ftp:// ftp .emc.com / pub / symm3000 / inquiry /

以下是其功能的简要说明:
http://slashzeroconf.wordpress.com/2009/02/09/emc -inq-utility /

#16 楼

echo "`blockdev --getbsz /dev/sdc`/1024"|bc


将以KB显示输出

[root@veritas datadg2]# echo "`blockdev --getbsz /dev/sdc`/1024"|bc
4
[root@veritas datadg2]#


评论


bash可以进行内联计算:echo $(($(blockdev ...)/ 1024))。还要注意,--getbsz给出块的大小,而不是设备的大小。

–mwfearnley
18年1月28日在18:59

#17 楼

更简单:

sudo parted -l /dev/sda

对我来说,最容易记住和键入

#18 楼

如果要在C中以编程方式找到它,请检出util-linux软件包的代码-https://github.com/karelzak/util-linux/blob/master/lib/blkdev.c#L81

这也很有用-http://www.linuxproblem.org/art_20.html
(该代码在Linux内核版本5.0.0-32-generic上有效。)

这两个代码均使用ioctl系统调用。

#19 楼

fdisk -l /dev/sda | grep -m1 ^Disk | awk '{print  " " }'


我发现它比所有这些标准工具或proc条目非常有用

#20 楼

df -k | grep /dev/sda


将为您提供KB大小(第一个数字),已用空间(第二个数字)和可用空间(第三个数字)

评论


只有挂载了文件系统。

– lfaraone
09年6月22日在12:54

这与块设备空间无关,它将为您提供恰好在/ dev / sda上的已挂载文件系统的已用和可用空间。那未分区的空间呢?如果您有多个分区怎么办?

–kbyrd
2014年4月25日在22:01