web-dev-qa-db-ja.com

ブロックデバイスのサイズを決定する

/dev/sdaなどのブロックデバイスのサイズを確認するにはどうすればよいですか? ls -lを実行しても、有用な情報はありません。

138
lfaraone

fdiskは、Linuxを実行しているMacで使用されているパーティションレイアウトや、PC以外のパーティションフォーマットを理解できません。 (はい、mac-fdiskは古いMacパーティションテーブル用、gdiskは新しいGPTパーティションテーブル用ですが、他のパーティションレイアウトはこれらだけではありません)。

カーネルは、ブロックデバイスの稼働時にパーティションレイアウトを既にスキャンしているので、直接尋ねてみませんか?

 $ cat /proc/partitions
major minor #blocks name 
 
 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 
74
ephemient

blockdev --getsize64 /dev/sdaはサイズをバイト単位で返します。

blockdev --getsz /dev/sdaは、サイズを512バイトセクターで返します。

非推奨:blockdev --getsize /dev/sdaはサイズをセクターで返します。

blockdevtil-linux の一部です。

177
David
cat /sys/class/block/sda/size

これにより、512バイトブロック単位でサイズがわかります。

35
Angus

この単純なコード。 anyのドキュメントは見つかりませんでしたが、トリックはうまく機能します。

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

どうですか:

fdisk -l

これにより、すべてのディスクとそれぞれの容量、使用状況などのリストが表示されます。

17
Wadih M.

blockdev --getsize /dev/sda

10
Vi.

lsblkは、デバイスタイプやマウントポイント(ある場合)を含む、探している情報をツリービューで人間が読める形式で提供します。

デバイスの種類は、Ganesh Sittampalamからの質問に応じて、CDドライブで機能することを意味します。

特定のデバイスのサイズのみをバイト単位で取得するには:

lsblk -rbno SIZE /dev/block-device
9
antonio
echo "`cat /sys/class/block/sda2/size`*512" | bc

または、算術演算子が64ビット整数で機能するbashまたは他のPOSIXのようなシェルを使用する場合、bcを呼び出す必要さえありません

echo "$((512*$(cat /sys/class/block/sda2/size)))"

サイズをバイト単位で示します。

catおよびfork(bashを除く)の呼び出しは、bashksh93およびzshを使用して最適化できます。

echo "$((512*$(</sys/class/block/sda2/size)))"
7
ray

Blockdev(8)には別の答えがありますか?オプション--getszおよび非推奨--getsizeは同じではありません。

  • [〜#〜] blksszget [〜#〜]blockdev --getss)は物理セクターサイズであり、
  • [〜#〜] blkbszget [〜#〜]blockdev --getbsz)は論理セクターサイズです。
echo $(($(blockdev --getsize64 /dev/sda)/$(blockdev --getss /dev/sda)))
5

Cでは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
mpartel

まず、貢献してくれたすべての人に感謝します。私はいくつかの有用なことを学びました。

それでも、私の経験では、これらの回答のほとんどは、少なくともCDおよびDVDに関しては、特にスーパーユーザーに限定されるのではなく、通常のユーザーが利用できるかどうかに関しては、やや不完全です。
これは私のLinux Mageia 2でのテストに基づいています。

スーパーユーザー向けのコマンドは、通常のユーザーが常に/sbin/を前に付けることでアクセスできます。/usr/sbin/を付けることもできます。現在、それらは通常のユーザーでは機能しない場合があります。

多くは、通常のユーザーの場合、DVDドライブのDVDがマウントされていない場合でも機能しますが、ハードディスクでは機能しません(通常のユーザーとして呼び出された場合)。

たとえば、/sbin/fdisk -l /dev/cdromは私のシステムで動作し、ドライブ内のDVDの「ジオメトリ」を提供します...これは明らかにほとんどナンセンスです。しかし、DVDのサイズをバイトとセクターで示し、正しいセクターサイズ(DVDの通常の2048バイト)を示しています。

同じことが/usr/sbin/gdisk -l /dev/cdromにも当てはまり、2048バイトのセクター内のサイズのみが示されます。

その他の例(非rootの通常のユーザーとして)

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

これはDVDドライブ(ここでは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は、ディスク全体ではなく、マウントされたパーティションのサイズを示します。さらに、マウントされたCDまたはDVDの場合、CD/DVDの実際のサイズよりも小さくなります。より正確には、関心のある2つの異なるサイズがあります。

  • デバイスの全体的なサイズ(内部組織に使用されているものを含む)。通常、これはコマンドddで全体をコピーした場合に取得されるファイルのサイズです。
  • マウント時にユーザーが使用できるスペースのサイズ(おそらく読み取り専用モードのみ)。これは常に小さい。これは、コマンドdfで示されるサイズです。
5
babou

ブロックは、固定長のビットまたはバイトのシーケンスです。つまり、512バイト、4kB、8kB、16kB、32kBなどです。

blockdev --getbsz partition

# blockdev --getbsz /dev/sda1 
4096

したがって、このファイルシステムのブロックサイズは4kBです。

類推:箱の中のボトルの数。
enter image description here

3
Premraj

Node.jsを使用している場合は、このネイティブアドオンを使用して、ブロックデバイスサイズ、物理セクターサイズ、および論理セクターサイズを取得できます(FreeBSD、Linux、macOS、Windowsをサポートしています)。また、直接IOを行うためのヘルパーがいくつかあります。

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

1
Joran Greef

/sys/block/sda/sizeブロックサイズで?もしそうなら、どれですか?

Ioctl [〜#〜] blkgetsize [〜#〜] は、 [〜#〜] blksszget [ではなく、512単位であるのと同じ問題があります。 〜#〜] 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 を参照してください

0
echo "`blockdev --getbsz /dev/sdc`/1024"|bc

出力はKBで表示されます

[root@veritas datadg2]# echo "`blockdev --getbsz /dev/sdc`/1024"|bc
4
[root@veritas datadg2]#
0
Urvesh RHCE
fdisk -l /dev/sda | grep -m1 ^Disk | awk '{print $3 " " $4}'

これらすべての標準ツールまたはprocエントリよりも非常に便利です

0
SHW

もっと簡単に:

Sudo parted -l /dev/sda

覚えて入力するのが最も簡単です

0
Vicente Bolea

inqと呼ばれるEMCユーティリティがあり、ローカル接続、SANベースなど)など、すべてのタイプのブロックデバイスに関する情報を提供します。

やってみて。

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

以下はその機能の簡単な説明です: http://slashzeroconf.wordpress.com/2009/02/09/emc-inq-utility/

0
user1684122

プログラムでCで検索したい場合は、util-linuxパッケージのコードをチェックアウトします https://github.com/karelzak/util-linux/blob/master/lib/blkdev.c#L81

またはこれも便利です- http://www.linuxproblem.org/art_20.html (コードはLinuxカーネルバージョン5.0.0-32-generic。)

これらのコードは両方ともioctlシステムコールを使用します。

0
gkr2d2