/dev/sda
などのブロックデバイスのサイズを確認するにはどうすればよいですか? ls -l
を実行しても、有用な情報はありません。
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
cat /sys/class/block/sda/size
これにより、512バイトブロック単位でサイズがわかります。
この単純なコード。 anyのドキュメントは見つかりませんでしたが、トリックはうまく機能します。
#include <linux/fs.h>
...
ioctl(file, BLKGETSIZE64, &file_size_in_bytes);
どうですか:
fdisk -l
これにより、すべてのディスクとそれぞれの容量、使用状況などのリストが表示されます。
blockdev --getsize /dev/sda
lsblk
は、デバイスタイプやマウントポイント(ある場合)を含む、探している情報をツリービューで人間が読める形式で提供します。
デバイスの種類は、Ganesh Sittampalamからの質問に応じて、CDドライブで機能することを意味します。
特定のデバイスのサイズのみをバイト単位で取得するには:
lsblk -rbno SIZE /dev/block-device
echo "`cat /sys/class/block/sda2/size`*512" | bc
または、算術演算子が64ビット整数で機能するbashまたは他のPOSIXのようなシェルを使用する場合、bc
を呼び出す必要さえありません
echo "$((512*$(cat /sys/class/block/sda2/size)))"
サイズをバイト単位で示します。
cat
およびfork(bash
を除く)の呼び出しは、bash
、ksh93
およびzsh
を使用して最適化できます。
echo "$((512*$(</sys/class/block/sda2/size)))"
Blockdev(8)には別の答えがありますか?オプション--getsz
および非推奨--getsize
は同じではありません。
blockdev --getss
)は物理セクターサイズであり、blockdev --getbsz
)は論理セクターサイズです。echo $(($(blockdev --getsize64 /dev/sda)/$(blockdev --getss /dev/sda)))
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.
まず、貢献してくれたすべての人に感謝します。私はいくつかの有用なことを学びました。
それでも、私の経験では、これらの回答のほとんどは、少なくとも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
で示されるサイズです。Node.jsを使用している場合は、このネイティブアドオンを使用して、ブロックデバイスサイズ、物理セクターサイズ、および論理セクターサイズを取得できます(FreeBSD、Linux、macOS、Windowsをサポートしています)。また、直接IOを行うためのヘルパーがいくつかあります。
/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 を参照してください
echo "`blockdev --getbsz /dev/sdc`/1024"|bc
出力はKBで表示されます
[root@veritas datadg2]# echo "`blockdev --getbsz /dev/sdc`/1024"|bc
4
[root@veritas datadg2]#
fdisk -l /dev/sda | grep -m1 ^Disk | awk '{print $3 " " $4}'
これらすべての標準ツールまたはprocエントリよりも非常に便利です
もっと簡単に:
Sudo parted -l /dev/sda
覚えて入力するのが最も簡単です
inq
と呼ばれるEMCユーティリティがあり、ローカル接続、SANベースなど)など、すべてのタイプのブロックデバイスに関する情報を提供します。
やってみて。
ftp://ftp.emc.com/pub/symm3000/inquiry/
以下はその機能の簡単な説明です: http://slashzeroconf.wordpress.com/2009/02/09/emc-inq-utility/
プログラムで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システムコールを使用します。