กำหนดขนาดของอุปกรณ์บล็อก


134

ฉันจะหาขนาดของอุปกรณ์บล็อกได้/dev/sdaอย่างไร? การวิ่งls -lไม่มีข้อมูลที่เป็นประโยชน์


การทำความเข้าใจขนาดบล็อก: wiki.linuxquestions.org/wiki/Block_size
มุมมองรูปไข่

2
เมื่อรู้ว่าฉันมีอายุเกิน 9 ปีในการตอบรับเดาว่าคุณจะพบคำตอบด้วยคำสั่งlsblk
Adit Ya

คำตอบ:


72

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

สิ่งนี้ใช้ไม่ได้กับไดรฟ์ซีดี
Ganesh Sittampalam

2
และรายงานเฉพาะชื่อ "เจ้าของภาษา" เท่านั้น บนเซิร์ฟเวอร์ที่มี iSCSI และ / หรือ multipath และ / หรือ LVM คุณจะได้รับอุปกรณ์ sd * และ dm- * จำนวนมาก แต่โดยปกติคุณจะต้องค้นหา symlink ของอุปกรณ์ที่คุณสนใจจริง ๆ (เช่น a / dev / mapper / * หนึ่ง)
ลุค 404

2
ค่าที่รายงานที่นี่คือทวีคูณของ 1KiB ซึ่งอาจเป็นหนึ่งเซกเตอร์ (512 ไบต์) เล็กเกินไป
Lekensteyn

1
สิ่งนี้มีประโยชน์สำหรับฉัน ฉันก็awk '/sd[a-z]$/{printf "%s %8.2f GiB\n", $NF, $(NF-1) / 1024 / 1024}' /proc/partitions
ลงมือ

173

blockdev --getsize64 /dev/sda ส่งคืนขนาดเป็นไบต์

blockdev --getsz /dev/sda ส่งคืนขนาดในเซกเตอร์ 512 ไบต์

เลิกใช้: blockdev --getsize /dev/sdaส่งคืนขนาดในเซ็กเตอร์

blockdevเป็นส่วนหนึ่งของutil ลินุกซ์


4
น่าเสียดายที่ต้องใช้พลัง superuser
heinrich5991

6
@ heinrich5991 คุณไม่มีทางเลือก ผู้ใช้ปกติไม่สามารถเข้าถึงอุปกรณ์บล็อกได้โดยตรง ("อ่านดิบ" มัน) ซึ่งเป็นสิ่งที่ดีสำหรับการรักษาความปลอดภัย
Totor

@Totor แน่นอน แต่ยังมีคำตอบสำหรับคำถามเฉพาะนี้ที่ไม่ต้องการสิทธิ์ผู้ใช้ขั้นสูง
heinrich5991

2
@ heinrich5991 เมื่อทำงานกับระบบไฟล์คุณควรถาม statfs () และเพื่อน ๆ ที่สำคัญคุณไม่ควรถือว่าความสัมพันธ์โดยตรงระหว่างขนาดของอุปกรณ์บล็อกกับพื้นที่รวม / ใช้งาน / มีผล / ฟรี / พื้นที่ใด ๆ ในระบบไฟล์
ลุ

2
manpage ที่linux.die.net/man/8/blockdevกล่าวว่า--getsizeเลิกใช้แล้วและแนะนำ--getszสำหรับภาค 512- ไบต์ที่สอดคล้องกัน ถ้า--getsizeต้องใช้ฉันเดาว่า--getssควรใช้เพื่อให้แน่ใจว่าขนาดเซกเตอร์เป็นสิ่งที่คุณคาดหวัง
mwfearnley

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

สิ่งนี้จะช่วยให้คุณมีขนาดบล็อก 512 ไบต์


9
@ heinrich5991 คุณจะแน่ใจได้อย่างไรว่าขนาดบล็อกอุปกรณ์อยู่ที่ 512 ไบต์เสมอ ?
Totor

5
เซกเตอร์ขนาดอยู่เสมอ 512 ไบต์ตามแหล่งที่มา สำหรับอนาคตฉันพยายามรับเอกสารเกี่ยวกับส่วนต่อประสานนี้
Lekensteyn

ขอบคุณที่ทำให้ชัดเจน ฉันสังเกตเห็นว่ามี / sys / class / block / sda / queue / logical_block_size ฉันไม่แน่ใจว่าควรใช้สิ่งนั้นหรือค่าคงที่ 512
Edward Falk

33

รหัสง่าย ๆ ไม่พบเอกสารใด ๆแต่ไม่หลอกลวงอย่าง:

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

การแก้ไข: จริง ๆ แล้วมันทำให้คุณมีขนาดในภาค แก้ไขแล้วฉันจะโหวต
JCCyC

8
@JCCyC: BLKGETSIZE64ส่งคืนขนาดเป็นไบต์ ดูlinux/fs.hที่บันทึกย่อ "คืนขนาดอุปกรณ์เป็นไบต์" โปรดทราบว่าBLKGETSIZE(ไม่ "64") ส่งคืน "/ 512"
Thanatos

ผมทำงานออกตัวอย่างฟูลเลอร์ส่วนบนพื้นฐานนี้ที่stackoverflow.com/a/48490543/446106 ที่จะใช้ข้อมูลดังกล่าวข้างต้นที่นี่fileจะต้องมีการอธิบายไฟล์ (เช่นจากopen()) และควรจะเป็นfile_size_in_bytes size_t
mwfearnley

(อันที่จริงfile_size_in_bytesควรจะเป็นประเภทแบบ 64 บิตดังนั้นจึงควรจะunsigned long long.)
mwfearnley

16

เกี่ยวกับ:

fdisk -l

นี่จะให้รายการดิสก์ทั้งหมดที่มีความจุการใช้งานและอื่น ๆ


3
ลองด้วย sudo ไม่เช่นนั้นจะไม่พิมพ์อะไรเลย
Alfe


9

lsblk ให้ข้อมูลที่คุณต้องการรวมถึงประเภทอุปกรณ์และจุดเมานท์ (ถ้ามี) พร้อมมุมมองแบบต้นไม้และในรูปแบบที่มนุษย์สามารถอ่านได้

ประเภทอุปกรณ์หมายถึงใช้งานได้กับไดรฟ์ซีดีตามที่ Ganesh Sittampalam ถาม

วิธีรับขนาดของอุปกรณ์เฉพาะเป็นไบต์เท่านั้น:

lsblk -rbno SIZE /dev/block-device

7
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)))"

5

ไม่จำเป็นต้องใช้ 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.

หากคุณกำลังมองหาขนาดของดิสก์ไดรฟ์แบบดิบคุณจะต้องมีสิทธิ์ของรูทเพื่อเปิดไฟล์เพื่อค้นหาในตอนท้าย
Edward Falk

5

blockdev (8) มีคำตอบที่ต่างออกไปไหม ตัวเลือก--getszและเลิกใช้--getsizeไม่เหมือนกัน

  • BLKSSZGET ( blockdev --getss) สำหรับขนาดเซกเตอร์กายภาพและ
  • BLKBSZGET ( blockdev --getbsz) สำหรับขนาดเซกเตอร์ตรรกะ
echo $(($(blockdev --getsize64 /dev/sda)/$(blockdev --getss /dev/sda)))

ที่จริงฉันคิดว่าคุณมีสิ่งที่ตรงกันข้าม (ยกเว้นกรณีที่ระบบของฉันมีบล็อกทางกายภาพ 512 ไบต์และ 4096 ไบต์บล็อกตรรกะ.)
เอ็ดเวิร์ด Falk

2
ฉันรู้ว่าblock/ioctl.cใน Linux kernel kernel มีความคิดเห็นที่ทำให้เข้าใจผิด BLKPBSZGET (สังเกตว่า P) รับขนาดเซกเตอร์กายภาพ, BLKSSZGET รับขนาดเซกเตอร์ตรรกะและ BLKBSZGET (หรือ BLKBSZGET_32 นิ้วblock/compat_ioctl.c) รับขนาดหน่วยการจัดสรรระบบไฟล์ (คลัสเตอร์) ขนาดเซกเตอร์เชิงตรรกะและกายภาพแตกต่างกันเมื่อใช้รูปแบบขั้นสูง 512e ( 512e @ WP )
Palec

@Palec ความคิดเห็นที่มีความรู้มากที่สุดในบรรดาคำตอบและความคิดเห็นสำหรับคำถามนี้
Irfan Latif

5

ก่อนอื่นขอขอบคุณทุกคนที่มีส่วนร่วม ฉันเรียนรู้บางสิ่งที่มีประโยชน์

ถึงกระนั้นประสบการณ์ของฉันก็คือคำตอบเหล่านี้ส่วนใหญ่จะค่อนข้างไม่สมบูรณ์อย่างน้อยก็ในกรณีที่เกี่ยวข้องกับซีดีและดีวีดีโดยเฉพาะอย่างยิ่งว่าพวกเขามีให้สำหรับผู้ใช้ทั่วไปหรือไม่
สิ่งนี้อ้างอิงจากการทดสอบบน 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ที่มีขนาดที่ระบุโดยคำสั่ง

uptick สำหรับ $ / sbin / blockdev --getss / dev / cdrom # ขนาดดีวีดีเซกเตอร์
peterretief

คุณบอกว่า 512k แต่คุณหมายถึงเพียง 512 ไบต์เท่านั้น
Tom Hale

3

บล็อกคือลำดับของบิตหรือไบต์ที่มีความยาวคงที่เช่น 512 ไบต์ 4kB, 8kB, 16kB, 32kB เป็นต้น

blockdev --getbsz partition

ตัวอย่าง

# blockdev --getbsz /dev/sda1 
4096

ขนาดบล็อกของระบบไฟล์นี้คือ 4kB

คล้ายคลึง: จำนวนขวดในลังไม้
ป้อนคำอธิบายรูปภาพที่นี่


นี่คือคำตอบที่ถูกต้อง
Karl Morrison

1

หากคุณกำลังใช้ Node.js คุณสามารถใช้ส่วนเสริมดั้งเดิมนี้เพื่อรับขนาดอุปกรณ์บล็อกขนาดเซกเตอร์กายภาพและขนาดเซกเตอร์ตรรกะ (พร้อมรองรับ FreeBSD, Linux, macOS และ Windows) นอกจากนี้ยังมีผู้ช่วยอื่นอีกสองสามคนที่ทำ IO โดยตรง:

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


0

คือ/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


1
การละเมิดการยืนยัน: หากคุณปิดการใช้งานการยืนยันผลข้างเคียงที่จำเป็นของคุณจะไม่เกิดขึ้นอีก
Alfe

0

มียูทิลิตี EMC ที่เรียกว่าinqซึ่งให้ข้อมูลเกี่ยวกับอุปกรณ์บล็อกทุกประเภทเช่นโลคัลที่เชื่อมต่อโลคัลอิง SAN เป็นต้น

ลองดู

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

นี่คือคำอธิบายสั้น ๆ เกี่ยวกับสิ่งที่ทำ: http://slashzeroconf.wordpress.com/2009/02/09/emc-inq-utility/


0
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ให้ขนาดของบล็อกไม่ใช่ขนาดของอุปกรณ์
mwfearnley


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

ฉันคิดว่ามันมีประโยชน์มากกว่าเครื่องมือมาตรฐานหรือรายการ proc ทั้งหมด


-3
df -k | grep /dev/sda

จะทำให้คุณมีขนาดเป็น KB (หมายเลขแรก) เช่นเดียวกับพื้นที่ที่ใช้ (หมายเลขที่สอง) และพื้นที่ว่าง (หมายเลขที่สาม)


5
เพียงแค่ติดตั้งระบบไฟล์เท่านั้น
lfaraone

2
สิ่งนี้ไม่เกี่ยวกับพื้นที่บล็อกอุปกรณ์มันจะให้พื้นที่ใช้งานและพื้นที่ใช้งานของระบบไฟล์ที่เมาท์ซึ่งเกิดขึ้นเป็น / dev / sda แล้วพื้นที่ที่ไม่มีการแบ่งส่วนล่ะ? ถ้าคุณมีหลายพาร์ติชัน
kbyrd
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.