Answers:
fdisk
不了解运行Linux的Mac使用的分区布局,也不了解其他任何非PC分区格式。(是的,有mac-fdisk
旧的Mac分区表和gdisk
较新的GPT分区表,但这些并不是那里唯一的其他分区布局。)
由于在块设备投入使用时内核已经扫描了分区布局,所以为什么不直接询问呢?
$ cat / proc / partitions 主要次要#blocks名称 8 16 390711384 sdb 8 17 514079 sdb1 8 18 390194752 sdb2 8 32 976762584直流 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
awk '/sd[a-z]$/{printf "%s %8.2f GiB\n", $NF, $(NF-1) / 1024 / 1024}' /proc/partitions
blockdev --getsize64 /dev/sda
返回字节大小。
blockdev --getsz /dev/sda
返回512字节扇区的大小。
不推荐使用:blockdev --getsize /dev/sda
返回扇区大小。
blockdev是 util-linux的一部分。
--getsize
已被弃用,并提出--getsz
了一致的512字节扇区。如果--getsize
必须使用,我猜--getss
也应该用来确保扇区大小符合您的期望。
cat /sys/class/block/sda/size
这样就可以以512字节的块为单位指定其大小。
这个简单的代码。找不到任何文档,但是很好地完成了这个窍门:
#include <linux/fs.h>
...
ioctl(file, BLKGETSIZE64, &file_size_in_bytes);
BLKGETSIZE64
返回字节大小。请参阅linux/fs.h
,其中指出“返回设备大小(以字节为单位)”。注意BLKGETSIZE
(无“ 64”)返回“ / 512”。
file
必须是文件描述符(例如from open()
),并且file_size_in_bytes
应该是size_t
。
file_size_in_bytes
应该是64位类型,所以应该是unsigned long long
。)
无需在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.
blockdev(8)有不同的答案吗?选项--getsz
和不建议使用--getsize
的不相同。
blockdev --getss
)用于表示物理扇区大小,blockdev --getbsz
)用于逻辑扇区大小。echo $(($(blockdev --getsize64 /dev/sda)/$(blockdev --getss /dev/sda)))
block/ioctl.c
在Linux内核源代码中包含令人误解的注释。BLKPBSZGET(注意P)获取物理扇区大小,BLKSSZGET获取逻辑扇区大小,而BLKBSZGET(或BLKBSZGET_32 in block/compat_ioctl.c
)获取文件系统分配单元(群集)大小。使用Advanced Format 512e时,逻辑和物理扇区大小会有所不同。(512e @ WP)
首先,感谢所有贡献者。我学到了一些有用的东西。
不过,我的经验仍然是,大多数答案都是不完整的,至少在涉及CD和DVD的地方,特别是关于它们是否可供普通用户使用而不是仅限于超级用户使用。
这基于我的Linux Mageia 2上的测试。
普通用户始终可以通过使用前缀/sbin/
,有时也使用/ usr / sbin / 来访问针对超级用户的命令。现在,它们可能对正常用户有效或无效。
即使对于普通用户,即使未安装DVD驱动器上的DVD,它们也可能会工作,而对于硬盘(即使再次以普通用户身份调用)也不会工作。
例如,/sbin/fdisk -l /dev/cdrom
将在我的系统上工作,并在驱动器中给出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
将给出设备上DVD的大小,以/dev/sr0
512字节的块为单位(以及其他磁盘的大小,即使未安装)。但是,由于cat /sys/class/block/cdrom/size
/ dev / cdrom只是一个符号链接,因此不起作用
df
一些人建议的命令给出了已安装分区的大小,而不是整个磁盘的大小。此外,对于已安装的CD或DVD,其容量小于CD / DVD的实际容量。更准确地说,可能有两种不同的尺寸:
dd
;df
。如果您使用的是Node.js,则可以使用此本机附加组件来获取块设备大小,物理扇区大小和逻辑扇区大小(支持FreeBSD,Linux,macOS和Windows)。它还具有其他一些直接IO的帮助程序:
是/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 #%f\240GiB\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
有一个称为的EMC实用程序inq
,可提供有关所有类型的块设备的信息,例如本地连接的,基于SAN的等。
试试看。
ftp://ftp.emc.com/pub/symm3000/inquiry/
以下是其功能的简要说明:http : //slashzeroconf.wordpress.com/2009/02/09/emc-inq-utility/
echo "`blockdev --getbsz /dev/sdc`/1024"|bc
将以KB显示输出
[root@veritas datadg2]# echo "`blockdev --getbsz /dev/sdc`/1024"|bc
4
[root@veritas datadg2]#
echo $(( $(blockdev ...)/1024 ))
。另请注意,--getbsz
给出的是块的大小,而不是设备的大小。
更简单地说:
sudo parted -l /dev/sda
对我来说是最容易记住和输入的
df -k | grep /dev/sda
将为您提供以KB为单位的大小(第一个数字),已用空间(第二个数字)和可用空间(第三个数字)