ฉันจะหาขนาดของอุปกรณ์บล็อกได้/dev/sda
อย่างไร? การวิ่งls -l
ไม่มีข้อมูลที่เป็นประโยชน์
ฉันจะหาขนาดของอุปกรณ์บล็อกได้/dev/sda
อย่างไร? การวิ่งls -l
ไม่มีข้อมูลที่เป็นประโยชน์
คำตอบ:
fdisk
ไม่เข้าใจรูปแบบพาร์ติชันที่ใช้โดย Mac ของฉันที่ใช้ Linux หรือรูปแบบพาร์ติชันอื่นที่ไม่ใช่พีซี (ใช่มีmac-fdisk
สำหรับตารางพาร์ติชัน Mac เก่าและgdisk
สำหรับตารางพาร์ติชัน GPT ที่ใหม่กว่า แต่นั่นไม่ใช่รูปแบบพาร์ติชันอื่น ๆ เท่านั้น)
เนื่องจากเคอร์เนลสแกนโครงร่างพาร์ติชันแล้วเมื่ออุปกรณ์บล็อกเข้ามาให้บริการทำไมไม่ถามมันโดยตรง
$ cat / proc / พาร์ทิชัน #blocks สำคัญเล็กน้อย 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
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
ส่งคืนขนาดในเซ็กเตอร์
--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
จะต้องมีการอธิบายไฟล์ (เช่นจากopen()
) และควรจะเป็นfile_size_in_bytes
size_t
file_size_in_bytes
ควรจะเป็นประเภทแบบ 64 บิตดังนั้นจึงควรจะunsigned long long
.)
เกี่ยวกับ:
fdisk -l
นี่จะให้รายการดิสก์ทั้งหมดที่มีความจุการใช้งานและอื่น ๆ
lsblk
ให้ข้อมูลที่คุณต้องการรวมถึงประเภทอุปกรณ์และจุดเมานท์ (ถ้ามี) พร้อมมุมมองแบบต้นไม้และในรูปแบบที่มนุษย์สามารถอ่านได้
ประเภทอุปกรณ์หมายถึงใช้งานได้กับไดรฟ์ซีดีตามที่ Ganesh Sittampalam ถาม
วิธีรับขนาดของอุปกรณ์เฉพาะเป็นไบต์เท่านั้น:
lsblk -rbno SIZE /dev/block-device
echo "`cat /sys/class/block/sda2/size`*512" | bc
หรือถ้าคุณใช้ bash หรือเชลล์ที่คล้าย POSIX อื่น ๆ ซึ่งตัวดำเนินการทางคณิตศาสตร์ทำงานกับเลขจำนวนเต็ม 64 บิตคุณไม่จำเป็นต้องโทรหา bc
echo "$((512*$(cat /sys/class/block/sda2/size)))"
ให้ขนาดเป็นไบต์
เรียกร้องให้cat
และส้อม (ยกเว้นbash
) สามารถเพิ่มประสิทธิภาพไปด้วยbash
, ksh93
และzsh
ด้วย:
echo "$((512*$(</sys/class/block/sda2/size)))"
ไม่จำเป็นต้องใช้ ioctl ใน C เพียงแค่หาจุดสิ้นสุดไฟล์และรับขนาด (เป็นไบต์) ด้วยวิธีนี้:
/* 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 kernel kernel มีความคิดเห็นที่ทำให้เข้าใจผิด BLKPBSZGET (สังเกตว่า P) รับขนาดเซกเตอร์กายภาพ, BLKSSZGET รับขนาดเซกเตอร์ตรรกะและ BLKBSZGET (หรือ BLKBSZGET_32 นิ้วblock/compat_ioctl.c
) รับขนาดหน่วยการจัดสรรระบบไฟล์ (คลัสเตอร์) ขนาดเซกเตอร์เชิงตรรกะและกายภาพแตกต่างกันเมื่อใช้รูปแบบขั้นสูง 512e ( 512e @ WP )
ก่อนอื่นขอขอบคุณทุกคนที่มีส่วนร่วม ฉันเรียนรู้บางสิ่งที่มีประโยชน์
ถึงกระนั้นประสบการณ์ของฉันก็คือคำตอบเหล่านี้ส่วนใหญ่จะค่อนข้างไม่สมบูรณ์อย่างน้อยก็ในกรณีที่เกี่ยวข้องกับซีดีและดีวีดีโดยเฉพาะอย่างยิ่งว่าพวกเขามีให้สำหรับผู้ใช้ทั่วไปหรือไม่
สิ่งนี้อ้างอิงจากการทดสอบบน Linux Mageia 2 ของฉัน
คำสั่งที่มีไว้สำหรับ superuser สามารถเข้าถึงได้โดยผู้ใช้ปกติโดยนำหน้าด้วย/sbin/
หรือบางครั้งด้วย / usr / sbin / ตอนนี้พวกเขาอาจหรืออาจไม่ทำงานสำหรับผู้ใช้ปกติ
หลายคนอาจใช้งานได้สำหรับผู้ใช้ทั่วไปสำหรับ DVD บนไดรฟ์ DVD แม้ว่าจะไม่ได้ติดตั้งในขณะที่พวกเขาจะไม่ทำงานสำหรับฮาร์ดดิสก์ (อีกครั้งเมื่อเรียกใช้ในฐานะผู้ใช้ปกติ)
ตัวอย่างเช่น/sbin/fdisk -l /dev/cdrom
จะทำงานในระบบของฉันและให้ "เรขาคณิต" ของดีวีดีในไดรฟ์ ... ซึ่งเห็นได้ชัดว่าไร้สาระส่วนใหญ่ แต่จะให้ขนาดของ DVD เป็นไบต์และในเซกเตอร์และมีขนาดเซกเตอร์ที่ถูกต้อง (2048 ไบต์ตามปกติสำหรับ DVD)
เช่นเดียวกับของจริง/usr/sbin/gdisk -l /dev/cdrom
ซึ่งให้ขนาดเฉพาะในเซ็กเตอร์ของ 2048 ไบต์
ตัวอย่างอื่น ๆ (ในฐานะผู้ใช้ที่ไม่ใช่รูท, ผู้ใช้ปกติ)
$ /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
...
งานนี้สำหรับไดรฟ์ดีวีดีที่นี่เรียกว่า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
แนะนำโดยบางคนจะให้ขนาดของพาร์ติชันที่เมาท์ไม่ใช่ของดิสก์ทั้งหมด นอกจากนี้สำหรับแผ่นซีดีหรือดีวีดีที่ติดตั้งจะให้ขนาดที่น้อยกว่าขนาดจริงของซีดี / ดีวีดี แม่นยำยิ่งขึ้นมีสองขนาดที่แตกต่างกันอย่างใดอย่างหนึ่งที่อาจสนใจ:
dd
;df
ที่มีขนาดที่ระบุโดยคำสั่งบล็อกคือลำดับของบิตหรือไบต์ที่มีความยาวคงที่เช่น 512 ไบต์ 4kB, 8kB, 16kB, 32kB เป็นต้น
blockdev --getbsz partition
ตัวอย่าง
# blockdev --getbsz /dev/sda1
4096
ขนาดบล็อกของระบบไฟล์นี้คือ 4kB
หากคุณกำลังใช้ 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
สำหรับฉันวิธีที่ง่ายที่สุดในการจดจำและพิมพ์
fdisk -l /dev/sda | grep -m1 ^Disk | awk '{print $3 " " $4}'
ฉันคิดว่ามันมีประโยชน์มากกว่าเครื่องมือมาตรฐานหรือรายการ proc ทั้งหมด
df -k | grep /dev/sda
จะทำให้คุณมีขนาดเป็น KB (หมายเลขแรก) เช่นเดียวกับพื้นที่ที่ใช้ (หมายเลขที่สอง) และพื้นที่ว่าง (หมายเลขที่สาม)