একটি ব্লক ডিভাইসের আকার নির্ধারণ করুন


134

আমি কীভাবে কোনও ব্লক ডিভাইসের আকার জানতে পারি /dev/sda? দৌড়ানো ls -lকোনও কার্যকর তথ্য দেয় না gives



2
জেনে আমি উত্তর দিতে 9 বছর দেরি করেছি, অনুমান করুন যে আপনি উত্তরটি একটি lsblk কমান্ড দিয়ে খুঁজে পাবেন ।
এডিট ইয়া

উত্তর:


72

fdiskআমার ম্যাক চালিত লিনাক্স দ্বারা ব্যবহৃত পার্টিশন লেআউট, বা অন্য কোনও পিসি নন-পিসি পার্টিশন ফর্ম্যাট বুঝতে পারে না। (হ্যাঁ, mac-fdiskপুরানো ম্যাক পার্টিশন টেবিলগুলির gdiskজন্য এবং নতুন জিপিটি পার্টিশন টেবিলের জন্য রয়েছে, তবে সেগুলি কেবলমাত্র অন্যান্য পার্টিশন বিন্যাস নয়))

যেহেতু ব্লক ডিভাইসটি পরিষেবাতে আসার পরে কার্নেলটি পার্টিশন বিন্যাসগুলি ইতিমধ্যে স্ক্যান করেছে, কেন সরাসরি এটি জিজ্ঞাসা করবেন না?

$ বিড়াল / প্রকল্প / পার্টিশন
বড় নাবালিকা # ব্লক নাম

   8 16 390711384 এসডিবি
   8 17 514079 এসডিবি 1
   8 18 390194752 এসডিবি 2
   8 32 976762584 এসডিসি
   8 33 514079 এসডিসি 1
   8 34 976245952 এসডিসি 2
   8 0 156290904 এসডিএ
   8 1 514079 sda1
   8 2 155774272 এসডিএ 2
   8 48 1465138584 এসডিডি
   8 49 514079 এসডিডি 1
   8 50 1464621952 এসডিডি 2

এটি সিডি ড্রাইভের মতো কাজের জন্য কাজ করে না
গণেশ সিত্তপালাম

2
এবং কেবল "দেশীয়" নামগুলিও প্রতিবেদন করে। আইএসসিএসআই এবং / অথবা মাল্টিপ্যাথ এবং / অথবা এলভিএম সহ একটি সার্ভারে আপনি প্রচুর এবং প্রচুর এসডি * এবং ডিএম- * ডিভাইস পান তবে সাধারণত আপনাকে আগ্রহী এমনটির একটি সিমলিংকটি সন্ধান করতে হবে (যেমন: একটি / দেব / ম্যাপার / * এক)
লুক 404

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
দুর্ভাগ্যক্রমে superuser শক্তি প্রয়োজন
heinrich5991

6
@ হেনরিচ ৫৯৯১ আপনার পছন্দ নেই। একটি সাধারণ ব্যবহারকারী সরাসরি কোনও ব্লক ডিভাইস অ্যাক্সেস করতে পারে না (এটি "কাঁচা পড়া" এটি), যা সুরক্ষার পক্ষে ভাল।
টোটার

@ টোটার শিওর, তবে এখনও এই নির্দিষ্ট প্রশ্নের উত্তর রয়েছে যার জন্য কোনও সুপার ব্যবহারকারীর অধিকারের প্রয়োজন নেই।
heinrich5991

2
@ হেইনরিচ ৫৯৯১ ফাইল সিস্টেমে কাজ করার সময় আপনার স্ট্যাটফ () এবং বন্ধুদের জিজ্ঞাসা করা উচিত। আরও গুরুত্বপূর্ণ, আপনার ব্লক ডিভাইসের আকার এবং মোট / ব্যবহারযোগ্য / কার্যকর / মুক্ত / ফাইল সিস্টেমে যে কোনও স্থানের মধ্যে কোনও সরাসরি সম্পর্ক অনুমান করা উচিত নয়
লুক 404

2
Linux.die.net/man/8/ ব্লকদেব বলেছেন যে ম্যানপেজটি হ্রাস--getsize করা হয়েছে এবং --getszধারাবাহিকভাবে 512-বাইট সেক্টরের পরামর্শ দেয় । যদি --getsizeঅবশ্যই ব্যবহার করা হয় তবে আমার ধারণা অনুমান --getssকরা হয় যে খাতটির আকারটি আপনি যা প্রত্যাশা করছেন তা নিশ্চিত করার জন্যও এটি ব্যবহার করা উচিত।
mwfearnley

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

এটি আপনাকে 512-বাইট ব্লকে এর আকার দেয়।


9
@ হেনরিচ ৫৯৯১ আপনি কীভাবে নিশ্চিত হতে পারেন যে ডিভাইসটির ব্লক-আকার সর্বদা 512 বাইট হয়?
টোটার

5
উত্স অনুসারে সেক্টরের আকার সর্বদা 512 বাইট । ভবিষ্যতের জন্য, আমি এই ইন্টারফেসটি নথিভুক্ত করার চেষ্টা করছি ।
লেকেনস্টেইন

পরিষ্কার করার জন্য আপনাকে ধন্যবাদ। আমি লক্ষ্য করেছি যে একটি / সিএস / শ্রেণি / ব্লক / এসডিএ / সারি / লজিকাল_ব্লক_সাইজও রয়েছে। আমি নিশ্চিত ছিলাম না যে আমি এটি ব্যবহার করতে হবে বা ধ্রুবক 512.
এডওয়ার্ড

33

এই সহজ কোড। কোনও ডকুমেন্টেশন খুঁজে পাওয়া যায়নি , তবে কৌশলটি দুর্দান্তভাবে করেছেন:

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

সংশোধন: এটি আপনাকে সেক্টরগুলিতে আকার দেয়। এটি সম্পাদনা করুন এবং আমি upvote করব।
জে সি সি সি সি

8
@ জিসিসিসি: BLKGETSIZE64বাইট আকারে ফিরিয়ে দেয়। দেখুন linux/fs.h, কোনটি "বাইটে ডিভাইসের আকার ফেরত দেয়" নোট করে। দ্রষ্টব্য যে BLKGETSIZE(কোনও "64" নয়) এটি "/ 512" প্রদান করে।
থানাটোস

আমি আংশিকভাবে স্ট্যাকওভারফ্লো . 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
এটি sudo দিয়ে চেষ্টা করুন, অন্যথায় এটি কিছুই ছাপায় না।
আলফ


9

lsblk গাছের দর্শন সহ এবং একটি মানব পাঠযোগ্য বিন্যাসে ডিভাইসের ধরণ এবং মাউন্টপয়েন্টগুলি (যদি থাকে) সহ আপনি সন্ধান করছেন এমন তথ্য দেয়।

ডিভাইসের ধরণের অর্থ হ'ল এটি সিডি ড্রাইভের জন্য কাজ করে, যেমন গণেশ সিতাম্পালাম বলেছিলেন।

একটি নির্দিষ্ট ডিভাইসের আকার কেবল বাইটে পেতে:

lsblk -rbno SIZE /dev/block-device

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

অথবা আপনি যদি বাশ বা অন্য কোনও পসিক্স-এর মতো শেল ব্যবহার করেন যার পাটিগণিত অপারেটরগুলি bit৪ বিটের পূর্ণসংখ্যার সাথে কাজ করে, আপনার কল করার দরকার নেই 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লিনাক্সের কার্নেল উত্সটিতে বিভ্রান্তিকর মন্তব্য রয়েছে। বিএলকেপিবিএসজেজিজেট (পি পি লক্ষ্য করুন) দৈহিক সেক্টরের আকার পায়, বিএলকেএসজেডজিট যৌক্তিক খাতের আকার এবং বিএলকেবিএসজিজেট (বা বিএলকে বিএসবিজেজিজেই 3232 block/compat_ioctl.c) ফাইল সিস্টেম বরাদ্দ ইউনিট (ক্লাস্টার) আকার পায়। অ্যাডভান্সড ফর্ম্যাট 512e ব্যবহার করা হলে লজিকাল এবং ফিজিক্যাল সেক্টরের আকার পৃথক হয়। ( 512e @ ডাব্লু )
Palec

@ পোলেক এই প্রশ্নের সকল উত্তর এবং মন্তব্যের মধ্যে সর্বাধিক জ্ঞাত মন্তব্য।
ইরফান লতিফ

5

প্রথম, যারা অবদান রেখেছেন তাদের সবাইকে আমার ধন্যবাদ। আমি কয়েকটি দরকারী জিনিস শিখেছি।

তবুও, আমার অভিজ্ঞতা হ'ল এই উত্তরগুলির বেশিরভাগই কিছুটা অসম্পূর্ণ, কমপক্ষে যেখানে সিডি এবং ডিভিডিই উদ্বিগ্ন, বিশেষত এটি সুপারভাইজারের মধ্যে সীমাবদ্ধ না রেখে সাধারণ ব্যবহারকারীদের জন্য উপলব্ধ কিনা তা নিয়ে।
এটি আমার লিনাক্স মাগিয়া 2-এর পরীক্ষার উপর ভিত্তি করে।

সুপারইউসারটির উদ্দেশ্যে চিহ্নিত কমান্ডগুলি সর্বদা সাধারণ ব্যবহারকারীর দ্বারা পূর্বনির্ধারিত /sbin/বা কখনও কখনও / usr / sbin / দ্বারা ব্যবহার করা যেতে পারে । এখন তারা সাধারণ ব্যবহারকারীর জন্য কাজ করতে পারে বা নাও করতে পারে।

অনেকে একটি সাধারণ ব্যবহারকারীর জন্য, ডিভিডি ড্রাইভের ডিভিডির জন্য, এটি মাউন্ট না করা অবস্থায়ও কাজ করতে পারেন, যখন তারা হার্ড ডিস্কের জন্য কাজ করবেন না (যখন আবার সাধারণ ব্যবহারকারী হিসাবে ডাকে)।

উদাহরণস্বরূপ /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/sr0512 বাইট (পাশাপাশি অন্যান্য ডিস্কের আকার এমনকি মাউন্ট করা হয়নি) হিসাবে ডিভাইসে একটি ডিভিডি আকার দেবে । তবে cat /sys/class/block/cdrom/sizeকাজ করবে না কারণ / দেব / সিড্রাম কেবল একটি প্রতীকী লিঙ্ক

dfকিছু দ্বারা প্রস্তাবিত কমান্ডটি পুরো ডিস্কের পরিবর্তে মাউন্ট করা পার্টিশনের আকার দেয়। তদুপরি, একটি মাউন্ট করা সিডি বা ডিভিডি জন্য এটি সিডি / ডিভিডি এর প্রকৃত আকারের চেয়ে কম দেয়। আরও স্পষ্টভাবে, দুটি স্বতন্ত্র আকারের মধ্যে আগ্রহী হতে পারে:

  • অভ্যন্তরীণ সংস্থার জন্য যা ব্যবহৃত হয় তা সহ ডিভাইসের সামগ্রিক আকার। সাধারণত কমান্ডের সাথে অনুলিপি করা থাকলে এটি প্রাপ্ত ফাইলের আকার dd;
  • ব্যবহারকারী যখন এটি মাউন্ট করা হয় তখন উপলব্ধ জায়গার আকার (সম্ভবত কেবলমাত্র পঠনযোগ্য মোডে) উপলব্ধ থাকে যা সর্বদা কম থাকে। কমান্ড দ্বারা ইঙ্গিত করা হয় যে আকার df

DVD / এসবিন / ব্লকদেব --getss / dev / cdrom # ডিভিডি সেক্টরের আকারের জন্য
আপটিক

আপনি 512 কে বলছেন তবে আপনার অর্থ মাত্র 512 বাইট সেক্টর।
টম হেল

3

একটি ব্লক একটি নির্দিষ্ট দৈর্ঘ্য সহ বিট বা বাইটের ক্রম যা 512 বাইট, 4 কেবি, 8 কেবি, 16 কেবি, 32 কেবি ইত্যাদি with

blockdev --getbsz partition

উদাহরণ

# blockdev --getbsz /dev/sda1 
4096

সুতরাং এই ফাইল সিস্টেমের ব্লকের আকার 4kB।

সাদৃশ্য: ক্রেটগুলিতে বোতল সংখ্যা।
এখানে চিত্র বর্ণনা লিখুন


এটা সঠিক উত্তর.
কার্ল মরিসন

1

আপনি যদি নোড.জেএস ব্যবহার করে থাকেন তবে ব্লক ডিভাইস আকার, শারীরিক সেক্টর আকার এবং লজিক্যাল সেক্টরের আকার (ফ্রিবিএসডি, লিনাক্স, ম্যাকোস এবং উইন্ডোজ সমর্থন সহ) পেতে আপনি এই নেটিভ অ্যাড ব্যবহার করতে পারেন। সরাসরি আইও করার জন্য এটির আরও কয়েকজন সহায়ক রয়েছে:

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


0

Is /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
দৃ of় ব্যবহারের অপব্যবহার: আপনি যদি দাবিগুলি অক্ষম করেন তবে আপনার প্রয়োজনীয় পার্শ্ব প্রতিক্রিয়াগুলি আর ঘটবে না।
আলফ

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

কেবিতে আউটপুট প্রদর্শন করবে

[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

আপনাকে কেবিতে (প্রথম নম্বর) আকারের পাশাপাশি ব্যবহৃত স্থান (দ্বিতীয় সংখ্যা) এবং উপলভ্য স্থান (তৃতীয় সংখ্যা) দেবে


5
কেবলমাত্র যদি ফাইল সিস্টেমটি মাউন্ট করা হয়।
lfaraone

2
এটি ব্লক ডিভাইস স্পেস সম্পর্কে নয়, এটি আপনাকে / dev / sda-তে থাকা মাউন্টযুক্ত ফাইল-সিস্টেমের ব্যবহারযোগ্য এবং ব্যবহারযোগ্য স্থান দেবে। অবিবাহিত স্থান সম্পর্কে কী? আপনার যদি একাধিক পার্টিশন থাকে?
Kbyrd
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.