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


134

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


ブロックサイズの理解:wiki.linuxquestions.org/wiki/Block_size
ビュー

2
私が答えるのに9年遅れていることを知って、あなたはlsblkコマンドで答えを見つけるだろうと思います。
Adit Ya

回答:


73

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

ブロックデバイスが使用可能になったときにカーネルがパーティションレイアウトを既にスキャンしているので、直接問い合わせてみませんか?

$ cat / proc / partitions
メジャーマイナー#ブロック名

   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

これは、CDドライブのようなものには機能しません
ガネーシュSittampalam

2
また、「ネイティブ」名のみをレポートします。iSCSIおよび/またはマルチパスおよび/またはLVMを搭載したサーバーでは、多数のsd *およびdm- *デバイスを取得しますが、通常は実際に関心のあるシンボリックリンクを検索する必要があります(例:/ dev / mapper / * one)
Luke404

2
ここで報告される値は1KiBの倍数であり、1セクター(512バイト)が小さすぎる可能性があります。
Lekensteyn

1
これは私にとって有用でした。私がやってしまったawk '/sd[a-z]$/{printf "%s %8.2f GiB\n", $NF, $(NF-1) / 1024 / 1024}' /proc/partitions
suprjamiを

173

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

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

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

blockdev util-linuxの一部です。


4
残念ながらスーパーユーザーの電源が必要です
-heinrich5991

6
@ heinrich5991あなたには選択肢がありません。通常のユーザーは、ブロックデバイスに直接アクセスすることはできません(「生の読み取り」)。これはセキュリティに適しています。
トーター

@Totorもちろんですが、この特定の質問に対する答えはありますが、スーパーユーザーの権利は必要ありません。
heinrich5991

2
@ heinrich5991ファイルシステムで作業するときは、statfs()や友人に尋ねるべきです。さらに重要なことは、ブロックデバイスのサイズとファイルシステム上の合計/使用可能/有効/空き/任意のスペースとの間に直接的な関係があると想定しないことです。
ルーク404

2
manページlinux.die.net/man/8/blockdevは言う--getsize廃止されました、と示唆して--getsz一貫性のある512バイトセクタのために。--getsize使用する必要がある場合は--getss、セクターサイズが期待どおりであることを確認するためにも使用する必要があります。
mwfearnley

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

これにより、サイズが512バイトブロックになります。


9
@ heinrich5991デバイスのブロックサイズが常に 512バイトであることを確認するにはどうすればよいですか?
トーター

5
セクターサイズはソースによると常に512バイトです。将来のために、私はこのインターフェースを文書化しようとしています
Lekensteyn

それを明確にしてくれてありがとう。/ sys / class / block / sda / queue / logical_block_sizeもあることに気付きました。私は、私はそれを使うべきかどうかわからなかった、または定数512
エドワード・フォーク

33

この単純なコード。ドキュメントを見つけることができませんでしたが、うまくやっています:

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

訂正:実際にSECTORSのサイズを取得します。それを編集して、賛成票を投じます。
JCCyC

8
@JCCyC:BLKGETSIZE64サイズをバイト単位で返します。linux/fs.h「デバイスのサイズをバイト単位で返す」ことに注意してください。BLKGETSIZE( "64"ではない)は "/ 512"を返すことに注意してください。
タナトス

stackoverflow.com/a/48490543/446106でこれに一部基づいてより充実したサンプルを作成しました。ここで上記のスニペットを使用するにはfile、ファイル記述子(fromなどopen())であるfile_size_in_bytes必要があり、である必要がありsize_tます。
mwfearnley

(実際にfile_size_in_bytesは、64ビット型である必要がありunsigned long longますので、。)
mwfearnley

16

どうですか:

fdisk -l

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


3
sudoで試してください。そうでない場合は何も表示されません。
アルフェ


9

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

Ganesh Sittampalamが尋ねたように、デバイスタイプはCDドライブで機能することを意味します。

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

lsblk -rbno SIZE /dev/block-device

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

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

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

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

catand fork(を除くbash)への呼び出しはbashksh93zshで最適化できます:

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

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.

rawディスクドライブのサイズを探している場合は、ファイルを開いて最後までシークするためのルート権限が必要です。
エドワードフォーク

5

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

  • BLKSSZGETblockdev --getss)は物理セクターサイズ用で、
  • BLKBSZGETblockdev --getbsz)は、論理セクターサイズ用です。
echo $(($(blockdev --getsize64 /dev/sda)/$(blockdev --getss /dev/sda)))

実際、これらは逆になっていると思います。(私のシステムに512バイトの物理ブロックと4096バイトの論理ブロックがない限り。)
エドワードフォーク

2
さて、block/ioctl.cLinuxカーネルのソースには誤解を招くコメントが含まれていることに気付きました。BLKPBSZGET(Pに注意)は物理セクターサイズを取得し、BLKSSZGETは論理セクターサイズを取得し、BLKBSZGET(またはのBLKBSZGET_32 block/compat_ioctl.c)はファイルシステムアロケーションユニット(クラスター)サイズを取得します。Advanced Format 512eを使用する場合、論理セクターサイズと物理セクターサイズは異なります。512e @ WP
Palec

@Palecこの質問に対するすべての回答とコメントの中で最も知識のあるコメント。
イルファンラティフ

5

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

それでも、私の経験では、少なくとも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

device上のDVDのサイズを/dev/sr0512バイトのチャンク(およびマウントされていない他のディスクのサイズ)で示します。ただしcat /sys/class/block/cdrom/size、/ dev / cdromはシンボリックリンクにすぎないため、機能しません。

df一部の人が提案するコマンドは、ディスク全体ではなく、マウントされたパーティションのサイズを示します。さらに、マウントされたCDまたはDVDの場合、CD / DVDの実際のサイズよりも小さくなります。より正確には、興味のある2つの異なるサイズがあります。

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

$ / sbin / blockdev --getss / dev / cdromのuptick#DVDセクターサイズ
peterretief

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には、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を参照してください


1
アサーションの乱用:アサーションを無効にすると、必要な副作用は発生しなくなります。
アルフェ


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

KB単位で出力を表示します

[root@veritas datadg2]# echo "`blockdev --getbsz /dev/sdc`/1024"|bc
4
[root@veritas datadg2]#

bashはインラインで計算できます: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)(最初の数値)、使用済みスペース(2番目の数値)、および使用可能なスペース(3番目の数値)が表示されます


5
ファイルシステムがマウントされている場合のみです。
lfaraone

2
これはブロックデバイススペースではなく、/ dev / sdaにあるマウントされたファイルシステムの使用済みおよび使用可能なスペースを提供します。パーティション化されていないスペースはどうですか?複数のパーティションがある場合はどうなりますか?
kbyrd
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.