मैं एक ब्लॉक डिवाइस के आकार का पता कैसे लगा सकता हूं, जैसे कि /dev/sda
? दौड़ना ls -l
कोई उपयोगी जानकारी नहीं देता है।
मैं एक ब्लॉक डिवाइस के आकार का पता कैसे लगा सकता हूं, जैसे कि /dev/sda
? दौड़ना ls -l
कोई उपयोगी जानकारी नहीं देता है।
जवाबों:
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
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
।)
lsblk
डिवाइस प्रकार और माउंटपॉइंट (यदि कोई हो), एक ट्री व्यू और एक मानव पठनीय प्रारूप सहित, आपके द्वारा देखी जा रही जानकारी देता है।
डिवाइस प्रकार का अर्थ है कि यह सीडी ड्राइव के लिए काम करता है, जैसा कि गणेश सितापलम द्वारा पूछा गया है।
केवल किसी विशेष उपकरण का आकार बाइट्स में प्राप्त करने के लिए:
lsblk -rbno SIZE /dev/block-device
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)))"
सी में 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.
ब्लॉकदेव (8) का अलग जवाब है? विकल्प --getsz
और पदावनत --getsize
समान नहीं हैं।
blockdev --getss
) भौतिक क्षेत्र के आकार और के लिए हैblockdev --getbsz
) तार्किक क्षेत्र आकार के लिए है।echo $(($(blockdev --getsize64 /dev/sda)/$(blockdev --getss /dev/sda)))
block/ioctl.c
लिनक्स कर्नेल स्रोत में भ्रामक टिप्पणियां हैं। BLKPBSZGET (नोटिस पी) को भौतिक क्षेत्र का आकार मिलता है, BLKSSZGET को तार्किक क्षेत्र आकार और BLKBSZGET (या BLKBSZGET_32 में block/compat_ioctl.c
) फ़ाइल सिस्टम आवंटन इकाई (क्लस्टर) आकार मिलता है। जब उन्नत स्वरूप 512e का उपयोग किया जाता है तो तार्किक और भौतिक क्षेत्र का आकार भिन्न होता है। ( 512e @ WP )
सबसे पहले, योगदान देने वाले सभी को मेरा धन्यवाद। मैंने कुछ उपयोगी चीजें सीखीं।
फिर भी, मेरा अनुभव यह है कि इनमें से अधिकांश उत्तर कुछ अधूरे हैं, कम से कम जहां सीडी और डीवीडी का संबंध है, विशेष रूप से इस बात से संबंधित है कि क्या वे सुपरसुसर तक सीमित होने के बजाय सामान्य उपयोगकर्ताओं के लिए उपलब्ध हैं।
यह मेरे लिनक्स 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
।एक ब्लॉक बिट या बाइट्स का एक निश्चित लंबाई के साथ अनुक्रम होता है अर्थात 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 देखें
ईएमसी उपयोगिता कहा जाता है inq
जो सभी प्रकार के ब्लॉक उपकरणों जैसे स्थानीय संलग्न, सैन आधारित, आदि के बारे में जानकारी देता है।
कोशिश करके देखो।
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
मेरे लिए याद रखने और टाइप करने में सबसे आसान है
df -k | grep /dev/sda
आपको KB (प्रथम संख्या) और साथ ही उपयोग किए गए स्थान (दूसरा नंबर) और उपलब्ध स्थान (तीसरा नंबर) में आकार देगा