回答:
fdisk
Linuxを実行している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
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
セクター単位でサイズを返します。
blockdevは util-linuxの一部です。
--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
、ファイル記述子(fromなどopen()
)であるfile_size_in_bytes
必要があり、である必要がありsize_t
ます。
file_size_in_bytes
は、64ビット型である必要がありunsigned long long
ますので、。)
echo "`cat /sys/class/block/sda2/size`*512" | bc
または、bashまたは算術演算子が64ビット整数で動作する他のPOSIX風のシェルを使用する場合、呼び出す必要さえありません。 bc
echo "$((512*$(cat /sys/class/block/sda2/size)))"
バイト単位でサイズを指定します。
cat
and fork(を除くbash
)への呼び出しはbash
、ksh93
とzsh
で最適化できます:
echo "$((512*$(</sys/class/block/sda2/size)))"
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.
blockdev(8)には別の答えがありますか?オプション--getsz
と非推奨--getsize
は同じではありません。
blockdev --getss
)は物理セクターサイズ用で、blockdev --getbsz
)は、論理セクターサイズ用です。echo $(($(blockdev --getsize64 /dev/sda)/$(blockdev --getss /dev/sda)))
block/ioctl.c
Linuxカーネルのソースには誤解を招くコメントが含まれていることに気付きました。BLKPBSZGET(Pに注意)は物理セクターサイズを取得し、BLKSSZGETは論理セクターサイズを取得し、BLKBSZGET(またはのBLKBSZGET_32 block/compat_ioctl.c
)はファイルシステムアロケーションユニット(クラスター)サイズを取得します。Advanced Format 512eを使用する場合、論理セクターサイズと物理セクターサイズは異なります。(512e @ WP)
まず、貢献してくれたすべての人に感謝します。いくつかの有用なことを学びました。
それでも、私の経験では、少なくとも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/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を参照してください
inq
ローカル接続、SANベースなど、あらゆるタイプのブロックデバイスに関する情報を提供するEMCユーティリティがあります。
やってみて。
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
私にとって覚えやすく入力しやすい