Làm thế nào tôi có thể tìm ra kích thước của một thiết bị khối, chẳng hạn như /dev/sda
? Chạy ls -l
không cho thông tin hữu ích.
Làm thế nào tôi có thể tìm ra kích thước của một thiết bị khối, chẳng hạn như /dev/sda
? Chạy ls -l
không cho thông tin hữu ích.
Câu trả lời:
fdisk
khô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-fdisk
các bảng phân vùng Mac cũ và gdisk
cho 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
awk '/sd[a-z]$/{printf "%s %8.2f GiB\n", $NF, $(NF-1) / 1024 / 1024}' /proc/partitions
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/sda
trả về kích thước trong các lĩnh vực.
blockdev là một phần của linux-linux .
--getsize
không được dùng nữa và gợi ý --getsz
cho các lĩnh vực 512 byte nhất quán. Nếu --getsize
phải được sử dụng, tôi đoán --getss
cũng nên được sử dụng để đảm bảo quy mô ngành là những gì bạn mong đợi.
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.
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);
BLKGETSIZE64
trả 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".
file
cần phải là một mô tả tệp (ví dụ từ open()
) và file_size_in_bytes
phải là một size_t
.
file_size_in_bytes
nên là loại 64 bit, vì vậy nó phải như vậy unsigned long long
.)
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
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 cat
và fork (trừ bash
) có thể được tối ưu hóa đi với bash
, ksh93
và zsh
với:
echo "$((512*$(</sys/class/block/sda2/size)))"
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.
Blockdev (8) có câu trả lời khác nhau? Tùy chọn --getsz
và không dùng nữa --getsize
không giống nhau.
blockdev --getss
) dành cho kích thước khu vực vật lý vàblockdev --getbsz
) dành cho kích thước khu vực logic.echo $(($(blockdev --getsize64 /dev/sda)/$(blockdev --getss /dev/sda)))
block/ioctl.c
trong 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 )
Đầ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/cdrom
sẽ 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/cdrom
chỉ 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/size
sẽ 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:
dd
;df
.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.
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:
Là /sys/block/sda/size
trong 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ự là 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
Có một tiện ích EMC được gọi là inq
cung cấp thông tin về tất cả các loại thiết bị khối như cục bộ đính kèm, dựa trên SAN, v.v.
Hãy thử nó.
ftp://ftp.emc.com/pub/symm3000/inquiry/
Dưới đây là một mô tả ngắn gọn về những gì nó làm: http://slashzeroconf.wordpress.com/2009/02/09/emc-inq-utility/
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]#
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ị.
Đơn giản hơn:
sudo parted -l /dev/sda
Đối với tôi là dễ nhớ nhất và gõ
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)