Xác định kích thước của thiết bị khối


Câu trả lời:


72

fdiskkhông hiểu cách bố trí phân vùng được sử dụng bởi máy Mac của tôi chạy Linux, cũng như bất kỳ định dạng phân vùng không phải PC nào khác. (Có, có mac-fdiskcác bảng phân vùng Mac cũ và gdiskcho bảng phân vùng GPT mới hơn, nhưng chúng không phải là các bố cục phân vùng khác ngoài đó.)

Vì kernel đã quét các bố cục phân vùng khi thiết bị khối đi vào hoạt động, tại sao không hỏi trực tiếp?

$ cat / Proc / phân vùng
tên chính #blocks nhỏ

   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
   8 49 514079 s1
   8 50 1464621952 sdd2

Điều này không hoạt động cho những thứ như ổ đĩa CD
Ganesh Sittampalam

2
Và cũng chỉ báo cáo tên "bản địa". Trên máy chủ có iSCSI và / hoặc đa đường và / hoặc LVM, bạn nhận được rất nhiều thiết bị sd * và dm- * nhưng thông thường bạn cần tra cứu liên kết tượng trưng của thiết bị bạn thực sự quan tâm (ví dụ: a / dev / mapper / * one)
Luke404

2
Các giá trị được báo cáo ở đây là bội số của 1KiB, có thể là một sector (512 byte) quá nhỏ.
Lekensteyn

1
Điều này rất hữu ích với tôi. Tôi đã kết thúc việc làmawk '/sd[a-z]$/{printf "%s %8.2f GiB\n", $NF, $(NF-1) / 1024 / 1024}' /proc/partitions
suprjami

173

blockdev --getsize64 /dev/sda trả về kích thước tính theo byte.

blockdev --getsz /dev/sda trả về kích thước trong các cung từ 512 byte.

Deprecated: blockdev --getsize /dev/sdatrả về kích thước trong các lĩnh vực.

blockdev là một phần của linux-linux .


4
không may cần sức mạnh siêu người dùng
heinrich5991

6
@ heinrich5991 bạn không có sự lựa chọn. Một người dùng bình thường không thể truy cập trực tiếp vào một thiết bị khối ("đọc thô"), điều này tốt cho bảo mật.
Toto

@Totor Chắc chắn, nhưng vẫn có câu trả lời cho câu hỏi cụ thể này không yêu cầu bất kỳ quyền siêu người dùng nào.
heinrich5991

2
@ heinrich5991 khi làm việc với các hệ thống tập tin, bạn nên hỏi statfs () và bạn bè. Quan trọng hơn, bạn không nên thừa nhận bất kỳ mối quan hệ trực tiếp nào giữa kích thước thiết bị khối và tổng / có thể sử dụng / hiệu quả / miễn phí / bất kỳ không gian nào trên hệ thống tệp.
Luke404

2
Trang web tại linux.die.net/man/8/blockdev nói --getsizekhông được dùng nữa và gợi ý --getszcho các lĩnh vực 512 byte nhất quán. Nếu --getsizephải được sử dụng, tôi đoán --getsscũng nên được sử dụng để đảm bảo quy mô ngành là những gì bạn mong đợi.
mwfearnley

35
cat /sys/class/block/sda/size

Điều này cung cấp cho bạn kích thước của nó trong các khối 512 byte.


9
@ heinrich5991 Làm thế nào bạn có thể chắc chắn kích thước khối thiết bị luôn là 512 byte?
Totor

5
Kích thước cung luôn là 512 byte theo nguồn . Trong tương lai, tôi đang cố gắng để tài liệu này có giao diện .
Lekensteyn

Cảm ơn bạn đã làm rõ điều đó. Tôi nhận thấy rằng cũng có một / sys / class / block / sda / queue / logic_block_size. Tôi không chắc mình nên sử dụng cái đó hay hằng số 512.
Edward Falk

33

Mã đơn giản này. Không thể tìm thấy bất kỳ tài liệu nào , nhưng thực hiện thủ thuật độc đáo:

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

Sửa chữa: nó thực sự giúp bạn có kích thước trong NGÀNH. Chỉnh sửa nó và tôi sẽ nâng cấp.
JCCyC

8
@JCCyC: BLKGETSIZE64trả về kích thước tính theo byte. Xem linux/fs.h, ghi chú "trả lại kích thước thiết bị theo byte". Lưu ý rằng BLKGETSIZE(không có "64") trả về "/ 512".
Thanatos

Tôi đã tạo ra một mẫu đầy đủ hơn một phần dựa trên điều này tại stackoverflow.com/a/48490543/446106 . Để sử dụng đoạn mã trên ở đây, filecần phải là một mô tả tệp (ví dụ từ open()) và file_size_in_bytesphải là một size_t.
mwfearnley

(Trên thực tế, file_size_in_bytesnên là loại 64 bit, vì vậy nó phải như vậy unsigned long long.)
mwfearnley

16

Làm thế nào về:

fdisk -l

Điều này sẽ cung cấp cho bạn một danh sách tất cả các đĩa của bạn với dung lượng, cách sử dụng tương ứng và hơn thế nữa.


3
Hãy thử nó với sudo, nếu không nó chỉ in không có gì.
Alfe

10

blockdev --getsize /dev/sda


Sử dụng với sudo, nếu không bạn nhận được Permission denied.
Wimateeka

9

lsblk cung cấp thông tin bạn đang tìm kiếm, bao gồm các loại thiết bị và điểm gắn kết (nếu có), với chế độ xem dạng cây và ở định dạng có thể đọc được.

Loại thiết bị có nghĩa là nó hoạt động cho các ổ đĩa CD, như được hỏi bởi Ganesh Sittampalam.

Để chỉ nhận kích thước của một thiết bị cụ thể theo byte:

lsblk -rbno SIZE /dev/block-device

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

hoặc nếu bạn sử dụng bash hoặc bất kỳ shell nào giống như POSIX có toán tử số học hoạt động với số nguyên 64 bit, bạn thậm chí không cần phải gọi bc

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

cho kích thước tính bằng byte.

Các cuộc gọi đến catvà fork (trừ bash) có thể được tối ưu hóa đi với bash, ksh93zshvới:

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

5

Không cần ioctl trong C. Chỉ cần tìm đến cuối tệp và lấy kích thước (tính bằng byte) theo cách đó:

/* 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.

Nếu bạn đang tìm kích thước của ổ đĩa thô, bạn sẽ cần các quyền riêng tư gốc để mở tệp để tìm kiếm đến cùng.
Edward Falk

5

Blockdev (8) có câu trả lời khác nhau? Tùy chọn --getszvà không dùng nữa --getsizekhông giống nhau.

  • BLKSSZGET ( blockdev --getss) dành cho kích thước khu vực vật lý và
  • BLKBSZGET ( blockdev --getbsz) dành cho kích thước khu vực logic.
echo $(($(blockdev --getsize64 /dev/sda)/$(blockdev --getss /dev/sda)))

Trên thực tế, tôi nghĩ rằng bạn có những người đảo ngược. (Trừ khi hệ thống của tôi có các khối vật lý 512 byte và các khối logic 4096 byte.)
Edward Falk

2
Vâng, tôi nhận ra rằng block/ioctl.ctrong nguồn nhân Linux có chứa các bình luận sai lệch. BLKPBSZGET (chú ý P) có kích thước khu vực vật lý, BLKSSZGET có kích thước khu vực logic và BLKBSZGET (hoặc BLKBSZGET_32 in block/compat_ioctl.c) có kích thước đơn vị phân bổ hệ thống tệp (cụm). Kích thước khu vực logic và vật lý khác nhau khi Định dạng nâng cao 512e được sử dụng. ( 512e @ WP )
Palec

@Palec Nhận xét am hiểu nhất trong số tất cả các câu trả lời và nhận xét cho câu hỏi này.
Irfan Latif

5

Đầu tiên, tôi cảm ơn tất cả những người đã đóng góp. Tôi đã học được một vài điều hữu ích.

Tuy nhiên, kinh nghiệm của tôi là hầu hết các câu trả lời này có phần chưa hoàn chỉnh, ít nhất là khi CD và DVD có liên quan, đáng chú ý là liệu chúng có sẵn cho người dùng bình thường thay vì giới hạn cho siêu người dùng hay không.
Điều này dựa trên các thử nghiệm trên Linux Mageia 2 của tôi.

Các lệnh dành cho siêu người dùng luôn có thể được truy cập bởi người dùng bình thường bằng cách thêm tiền tố vào /sbin/hoặc đôi khi bằng / usr / sbin /. Bây giờ họ có thể hoặc không thể làm việc cho một người dùng bình thường.

Nhiều người có thể làm việc, đối với người dùng bình thường, đối với DVD trên ổ đĩa DVD, ngay cả khi nó không được gắn, trong khi họ sẽ không hoạt động cho đĩa cứng (một lần nữa khi được gọi là người dùng bình thường).

Ví dụ, /sbin/fdisk -l /dev/cdromsẽ hoạt động trên hệ thống của tôi và đưa ra "hình học" của DVD trong ổ đĩa ... điều này rõ ràng là vô nghĩa. Nhưng nó cho kích thước của DVD theo byte và theo cung và kích thước cung cấp chính xác (2048 byte như thông thường đối với DVD).

Điều tương tự cũng đúng /usr/sbin/gdisk -l /dev/cdrom, chỉ cung cấp kích thước trong các lĩnh vực 2048 byte.

các ví dụ khác (như người dùng không root, người dùng bình thường)

$ /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
...

Điều này hoạt động cho ổ đĩa DVD, ở đây được gọi là sr0, vì thiết bị cho nó thực sự /dev/sr0, /dev/cdromchỉ là một liên kết tượng trưng cho nó. Kích thước được đưa ra trong khối 1k.

Tương tự, như người dùng bình thường, lệnh

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

sẽ cho kích thước của một đĩa DVD trên thiết bị /dev/sr0, với khối lượng 512 byte (cũng như kích thước của đĩa khác, thậm chí không được gắn). Tuy nhiên cat /sys/class/block/cdrom/sizesẽ không hoạt động vì nguyên nhân / dev / cdrom chỉ là một liên kết tượng trưng

Lệnh df, được đề xuất bởi một số người, đưa ra kích thước của các phân vùng được gắn, không phải của toàn bộ đĩa. Hơn nữa, đối với CD hoặc DVD được gắn, nó cung cấp ít hơn kích thước thực của CD / DVD. Chính xác hơn, có hai kích thước riêng biệt mà người ta có thể quan tâm:

  • kích thước tổng thể của thiết bị, bao gồm cả những gì được sử dụng cho tổ chức nội bộ của nó. Thông thường đó là kích thước của tệp thu được nếu nó được sao chép toàn bộ bằng lệnh dd;
  • kích thước của không gian có sẵn (có thể chỉ ở chế độ chỉ đọc) cho người dùng khi được gắn kết, luôn luôn ít hơn. Đó là kích thước được chỉ định bởi lệnh df.

tăng giá cho $ / sbin / blockdev --getss / dev / cdrom # kích thước khu vực DVD
peterretief

Bạn nói 512k nhưng ý bạn chỉ là các cung 512 byte.
Tom Hale

3

Một khối là một chuỗi bit hoặc byte có độ dài cố định, ví dụ 512 byte, 4kB, 8kB, 16kB, 32kB, v.v.

blockdev --getbsz partition

Thí dụ

# blockdev --getbsz /dev/sda1 
4096

Vì vậy, kích thước khối của hệ thống tập tin này là 4kB.

Tương tự: số lượng chai trong thùng.
nhập mô tả hình ảnh ở đây


Đây là câu trả lời chính xác.
Karl Morrison

1

Nếu bạn đang sử dụng Node.js, bạn có thể sử dụng tiện ích bổ sung gốc này để nhận kích thước khối thiết bị, kích thước khu vực vật lý và kích thước khu vực logic (có hỗ trợ FreeBSD, Linux, macOS và Windows). Nó cũng có một vài trợ giúp khác để thực hiện IO trực tiếp:

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


0

/sys/block/sda/sizetrong kích thước khối? Nếu vậy thì cái nào?

BLKGETSIZE của ioctl có cùng một vấn đề giống như ở đơn vị 512 thay vì BLKSSZGET . BLKGETSIZE64 giải quyết sự mơ hồ này. Số khối thực sự 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 */
}

Xem http://lkml.indiana.edu/hypermail/linux/kernel/0105.2/0744.html


1
Lạm dụng khẳng định: Nếu bạn vô hiệu hóa các xác nhận, tác dụng phụ cần thiết của bạn sẽ không xảy ra nữa.
Alfe


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

sẽ hiển thị đầu ra tính bằng KB

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

bash có thể thực hiện tính toán nội tuyến : echo $(( $(blockdev ...)/1024 )). Cũng lưu ý, --getbszđưa ra kích thước của khối, không phải kích thước của thiết bị.
mwfearnley


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

Tôi thấy nó rất hữu ích hơn tất cả các công cụ tiêu chuẩn hoặc các mục nhập của Proc


-3
df -k | grep /dev/sda

sẽ cung cấp cho bạn kích thước tính bằng KB (số thứ nhất) cũng như không gian được sử dụng (số thứ hai) và không gian có sẵn (số thứ ba)


5
Điều đó chỉ khi hệ thống tập tin được gắn kết.
lfaraone

2
Đây không phải là về không gian thiết bị khối, nó sẽ cung cấp cho bạn không gian sử dụng và có thể sử dụng của các hệ thống tập tin được gắn kết xảy ra trên / dev / sda. Còn không gian không liên kết thì sao? Nếu bạn có nhiều phân vùng thì sao?
kbyrd
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.