एक ब्लॉक डिवाइस का आकार निर्धारित करें


134

मैं एक ब्लॉक डिवाइस के आकार का पता कैसे लगा सकता हूं, जैसे कि /dev/sda? दौड़ना ls -lकोई उपयोगी जानकारी नहीं देता है।


ब्लॉक आकार को समझना: wiki.linuxquestions.org/wiki/Block_size
अण्डाकार दृश्य

2
यह जानते हुए कि मुझे जवाब देने में 9 साल की देर है, लगता है कि आपको जवाब lsblk कमांड के साथ मिलेगा ।
अदिति

जवाबों:


72

fdiskमेरे मैक द्वारा उपयोग किए जा रहे विभाजन लेआउट को नहीं समझती है लिनक्स, और न ही कोई अन्य गैर-पीसी विभाजन प्रारूप। (हाँ, mac-fdiskपुराने मैक विभाजन टेबल के लिए है, और gdiskनए GPT विभाजन तालिका के लिए, लेकिन वे केवल अन्य विभाजन लेआउट नहीं हैं।)

चूंकि कर्नेल पहले से ही विभाजन लेआउट को स्कैन कर लेता है, जब ब्लॉक डिवाइस सेवा में आता है, तो इसे सीधे क्यों नहीं पूछें?

$ बिल्ली / खरीद / विभाजन
प्रमुख नाबालिग # नाम का नाम

   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 एसडीए
   8 1 514079 sda1
   8 2 155774272 sda2
   8 48 1465138584 sdd
   8 49 514079 sdd1
   8 50 1464621952 sdd2

यह सीडी ड्राइव जैसी चीजों के लिए काम नहीं करता है
गणेश सितमपालम

2
और केवल "मूल" नामों की भी रिपोर्ट करता है। ISCSI और / या मल्टीप्थ और / या LVM वाले सर्वर पर आपको बहुत सारे और बहुत सारे sd * और dm- * डिवाइस मिलते हैं, लेकिन आमतौर पर आपको उस व्यक्ति की सहानुभूति देखने की आवश्यकता होती है जिसे आप वास्तव में रुचि रखते हैं (जैसे / a / dev / मैपर / * एक)
ल्यूकहैम

2
यहां बताए गए मूल्य 1KiB के गुणक हैं जो एक सेक्टर (512 बाइट) बहुत छोटा हो सकता है।
लीकेनस्टेन

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सेक्टरों में रिटर्न साइज।

ब्लॉकदेव उपयोग - लिनेक्स का हिस्सा है।


4
दुर्भाग्य से सुपरसियर पावर की आवश्यकता है
heinrich5991

6
@ heinrich5991 आपके पास कोई विकल्प नहीं है। एक सामान्य उपयोगकर्ता सीधे एक ब्लॉक डिवाइस तक नहीं पहुंच सकता ("इसे पढ़ना"), जो सुरक्षा के लिए अच्छा है।
टोटर

@ टॉटर श्योर, लेकिन फिर भी इस विशिष्ट प्रश्न के उत्तर हैं कि किसी भी सुपर उपयोगकर्ता अधिकारों की आवश्यकता नहीं है।
हेनरिच

2
@ heinrich5991 जब फाइलसिस्टम के साथ काम कर रहे हैं तो आपको स्टैटिफ़्स () और दोस्तों से पूछना चाहिए। इससे भी महत्वपूर्ण बात, आपको ब्लॉक डिवाइस आकार और कुल / प्रयोग करने योग्य / प्रभावी / मुक्त / फाइल सिस्टम पर जो भी जगह है, के बीच कोई सीधा संबंध नहीं होना चाहिए ।
ल्यूकहॉमी

2
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 बाइट्स होता है । भविष्य के लिए, मैं इस इंटरफ़ेस को प्रलेखित करने की कोशिश कर रहा हूं ।
लेकेनस्टाइन

स्पष्ट करने के लिए धन्यवाद। मैंने देखा कि एक / sys / वर्ग / ब्लॉक / sda / कतार / तार्किक_ब्लॉक_साइज़ भी है। मुझे यकीन नहीं था कि मुझे इसका उपयोग करना चाहिए, या निरंतर 512.
एडवर्ड फॉक

33

यह सरल कोड। कोई दस्तावेज़ नहीं मिला , लेकिन चाल अच्छी तरह से करता है:

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

सुधार: यह वास्तव में आपको सेक्टर्स में आकार देता है। इसे संपादित करें और मैं बढ़ाऊंगा।
JCCyC

8
@JCCyC: BLKGETSIZE64आकार बाइट्स में देता है। देखें linux/fs.h, कौन सा नोट "बाइट्स में डिवाइस का आकार लौटाता है"। ध्यान दें कि BLKGETSIZE(कोई "64") इसे "/ 512" नहीं लौटाता है।
थानाटोस

मैं आंशिक रूप से इस आधार पर एक समग्र नमूना बाहर काम किया stackoverflow.com/a/48490543/446106 । उपरोक्त स्निपेट का उपयोग करने के लिए, fileएक फाइल डिस्क्रिप्टर (उदाहरण के लिए open()) file_size_in_bytesहोना चाहिए , और होना चाहिए size_t
mwfearnley

(वास्तव में, file_size_in_bytes64-बिट प्रकार होना चाहिए, इसलिए यह होना चाहिए unsigned long long।)
mwfearnley

16

कैसा रहेगा:

fdisk -l

यह आपको उनकी संबंधित क्षमता, उपयोग, और बहुत कुछ के साथ आपके सभी डिस्क की एक सूची देगा।


3
इसे सुडो के साथ आज़माएं, अन्यथा यह कुछ भी नहीं छापता है।
अल्फ


9

lsblk डिवाइस प्रकार और माउंटपॉइंट (यदि कोई हो), एक ट्री व्यू और एक मानव पठनीय प्रारूप सहित, आपके द्वारा देखी जा रही जानकारी देता है।

डिवाइस प्रकार का अर्थ है कि यह सीडी ड्राइव के लिए काम करता है, जैसा कि गणेश सितापलम द्वारा पूछा गया है।

केवल किसी विशेष उपकरण का आकार बाइट्स में प्राप्त करने के लिए:

lsblk -rbno SIZE /dev/block-device

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

या यदि आप बैश या किसी अन्य 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 की कोई आवश्यकता नहीं है। बस फ़ाइल के अंत की तलाश करें और उस तरह से आकार (बाइट्स में) प्राप्त करें:

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

यदि आप कच्ची डिस्क ड्राइव के आकार की तलाश कर रहे हैं, तो आपको अंतिम छोर तक पहुंचने के लिए फ़ाइल खोलने के लिए रूट प्राइवेट की आवश्यकता होगी।
एडवर्ड फॉक

5

ब्लॉकदेव (8) का अलग जवाब है? विकल्प --getszऔर पदावनत --getsizeसमान नहीं हैं।

  • BLKSSZGET ( blockdev --getss) भौतिक क्षेत्र के आकार और के लिए है
  • BLKBSZGET ( blockdev --getbsz) तार्किक क्षेत्र आकार के लिए है।
echo $(($(blockdev --getsize64 /dev/sda)/$(blockdev --getss /dev/sda)))

वास्तव में, मुझे लगता है कि आपके पास उलटा है। (जब तक कि मेरे सिस्टम में 512-बाइट भौतिक ब्लॉक और 4096-बाइट लॉजिकल ब्लॉक हैं।)
एडवर्ड फॉक

2
ठीक है, मुझे एहसास हुआ कि block/ioctl.cलिनक्स कर्नेल स्रोत में भ्रामक टिप्पणियां हैं। BLKPBSZGET (नोटिस पी) को भौतिक क्षेत्र का आकार मिलता है, BLKSSZGET को तार्किक क्षेत्र आकार और BLKBSZGET (या BLKBSZGET_32 में block/compat_ioctl.c) फ़ाइल सिस्टम आवंटन इकाई (क्लस्टर) आकार मिलता है। जब उन्नत स्वरूप 512e का उपयोग किया जाता है तो तार्किक और भौतिक क्षेत्र का आकार भिन्न होता है। ( 512e @ WP )
पलेक

इस सवाल के सभी उत्तरों और टिप्पणियों के बीच @Palec सबसे अधिक ज्ञानपूर्ण टिप्पणी।
इरफान लतीफ

5

सबसे पहले, योगदान देने वाले सभी को मेरा धन्यवाद। मैंने कुछ उपयोगी चीजें सीखीं।

फिर भी, मेरा अनुभव यह है कि इनमें से अधिकांश उत्तर कुछ अधूरे हैं, कम से कम जहां सीडी और डीवीडी का संबंध है, विशेष रूप से इस बात से संबंधित है कि क्या वे सुपरसुसर तक सीमित होने के बजाय सामान्य उपयोगकर्ताओं के लिए उपलब्ध हैं।
यह मेरे लिनक्स Mageia 2 पर परीक्षणों पर आधारित है।

सुपरयुसर के लिए इच्छित कमांड को हमेशा एक सामान्य उपयोगकर्ता द्वारा उनके साथ /sbin/या कभी-कभी / usr /bin / के साथ उपसर्ग करके पहुँचा जा सकता है । अब वे सामान्य उपयोगकर्ता के लिए काम कर भी सकते हैं और नहीं भी।

कई लोग काम कर सकते हैं, एक सामान्य उपयोगकर्ता के लिए, डीवीडी ड्राइव पर एक डीवीडी के लिए, यहां तक ​​कि जब यह माउंट नहीं होता है, जबकि वे एक हार्ड डिस्क के लिए काम नहीं करेंगे (फिर से जब सामान्य उपयोगकर्ता के रूप में आमंत्रित किया जाता है)।

उदाहरण के लिए, /sbin/fdisk -l /dev/cdromमेरे सिस्टम पर काम करेगा और ड्राइव में डीवीडी की "ज्यामिति" देगा ... जो कि स्पष्ट रूप से ज्यादातर बकवास है। लेकिन यह बाइट्स और सेक्टरों में डीवीडी का आकार देता है, और एक सही सेक्टर आकार (2048 बाइट्स डीवीडी के अनुसार सामान्य है)।

यह सच है /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

डिवाइस पर एक डीवीडी का आकार देगा /dev/sr0, 512 बाइट्स (साथ ही अन्य डिस्क का आकार, यहां तक ​​कि माउंट नहीं किया गया) के टुकड़ों में। हालाँकि cat /sys/class/block/cdrom/sizeयह काम नहीं करेगा / dev / cdrom केवल एक प्रतीकात्मक लिंक है

dfकुछ द्वारा सुझाया गया कमांड , पूरे विभाजन का नहीं, घुड़सवार विभाजन का आकार देता है। इसके अलावा, एक घुड़सवार सीडी या डीवीडी के लिए यह सीडी / डीवीडी के वास्तविक आकार से कम देता है। अधिक सटीक रूप से, दो अलग-अलग आकार हैं जिनमें से एक में रुचि हो सकती है:

  • डिवाइस का समग्र आकार, जिसमें इसके आंतरिक संगठन के लिए उपयोग किया जाता है। आमतौर पर यह फ़ाइल का आकार होता है यदि इसे कमांड के साथ पूरा कॉपी किया जाता है dd;
  • उपलब्ध होने पर उपयोगकर्ता को उपलब्ध अंतरिक्ष का आकार (संभवतः केवल-केवल मोड में), जो हमेशा कम होता है। यह वह आकार है जो कमांड द्वारा इंगित किया गया है df

$ / sbin / blockdev --gets / dev / cdrom के लिए uptick # डीवीडी सेक्टर का आकार
पेट्रिएट्र

आप 512k कहते हैं लेकिन आपका मतलब सिर्फ 512 बाइट सेक्टर्स से है।
टॉम हेल

3

एक ब्लॉक बिट या बाइट्स का एक निश्चित लंबाई के साथ अनुक्रम होता है अर्थात 512 बाइट्स, 4kB, 8kB, 16kB, 32kB आदि।

blockdev --getbsz partition

उदाहरण

# blockdev --getbsz /dev/sda1 
4096

तो इस फाइल सिस्टम का ब्लॉक साइज 4kB है।

सादृश्य: टोकरे में बोतलों की संख्या।
यहां छवि विवरण दर्ज करें


यह सही जवाब है।
कार्ल मॉरिसन

1

यदि आप Node.js का उपयोग कर रहे हैं, तो आप ब्लॉक डिवाइस आकार, भौतिक क्षेत्र आकार और तार्किक क्षेत्र आकार (FreeBSD, Linux, macOS और Windows के लिए समर्थन के साथ) प्राप्त करने के लिए इस मूल ऐड का उपयोग कर सकते हैं। प्रत्यक्ष IO करने के लिए इसके कुछ अन्य सहायक भी हैं:

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


0

है /sys/block/sda/sizeब्लॉक आकार में? यदि ऐसा है तो कौन सा?

Ioctl BLKGETSIZE के रूप में यह 512 के बजाय की इकाइयों में है एक ही समस्या है BLKSSZGETBLKGETSIZE64 इस अस्पष्टता को हल करता है। असली ब्लॉक गिनती है 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
मुखरता का दुरुपयोग: यदि आप मुखरता को अक्षम करते हैं, तो आपके आवश्यक दुष्प्रभाव अब नहीं होंगे।
अल्फ

0

ईएमसी उपयोगिता कहा जाता है inqजो सभी प्रकार के ब्लॉक उपकरणों जैसे स्थानीय संलग्न, सैन आधारित, आदि के बारे में जानकारी देता है।

कोशिश करके देखो।

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}'

मुझे यह उन सभी मानक साधनों या खरीद प्रविष्टियों की तुलना में बहुत उपयोगी लगता है


-3
df -k | grep /dev/sda

आपको KB (प्रथम संख्या) और साथ ही उपयोग किए गए स्थान (दूसरा नंबर) और उपलब्ध स्थान (तीसरा नंबर) में आकार देगा


5
अगर फाइलसिस्टम आरोहित है तभी।
१२:०४ पर lfaraone

2
यह ब्लॉक डिवाइस स्पेस के बारे में नहीं है, यह आपको उपयोग किए जाने वाले फाइल सिस्टम के प्रयोग और प्रयोग करने योग्य स्थान देगा जो कि / dev / sda पर होता है। बिना स्पेस वाली जगह का क्या? यदि आपके पास कई विभाजन हैं तो क्या होगा?
kbyrd
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.