fdisk
ユーティリティは、この情報を表示します(CentOS 5の2.6.xのヴィンテージよりも古いカーネルでも正常に実行されます)。そのため、回答を探す可能性が高いようです。幸いなことに、我々はオープンソースのすばらしい世界に住んでいるので、必要なのはちょっとした調査です。
fdisk
プログラムはutil-linuxパッケージで提供されていますので、まずそれが必要です。
セクタサイズは、このようfdisk
の出力に表示されます。
Disk /dev/sda: 477 GiB, 512110190592 bytes, 1000215216 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes/512 bytes
我々はutil-linuxコードでSector size
を探している場合、我々はdisk-utils/fdisk-list.cでそれを見つける:
fdisk_info(cxt, _("Sector size (logical/physical): %lu bytes/%lu bytes"),
fdisk_get_sector_size(cxt),
fdisk_get_physector_size(cxt));
だから、それをlibfdisk/src/context.cで定義されているfdisk_get_sector_size
を見つける必要があるように見えます。
unsigned long fdisk_get_sector_size(struct fdisk_context *cxt)
{
assert(cxt);
return cxt->sector_size;
}
さて、それは非常に有用ではなかった。私たちは、cxt->sector_size
が設定されている場所を見つける必要があります。
$ grep -lri 'cxt->sector_size.*=' | grep -v tests
libfdisk/src/alignment.c
libfdisk/src/context.c
libfdisk/src/dos.c
libfdisk/src/gpt.c
libfdisk/src/utils.c
私はそのファイル名は有望に聞こえることから、alignment.c
を開始するつもりです。私はファイルをリストするために使用したのと同じ正規表現のためにそのファイルを介して見ると、私たちはthisを見つける:
に私をリード
cxt->sector_size = get_sector_size(cxt->dev_fd);
:
順番に
lib/blkdev.cで
blkdev_get_sector_size
の定義に私をリード
static unsigned long get_sector_size(int fd)
{
int sect_sz;
if (!blkdev_get_sector_size(fd, §_sz))
return (unsigned long) sect_sz;
return DEFAULT_SECTOR_SIZE;
}
:
#ifdef BLKSSZGET
int blkdev_get_sector_size(int fd, int *sector_size)
{
if (ioctl(fd, BLKSSZGET, sector_size) >= 0)
return 0;
return -1;
}
#else
int blkdev_get_sector_size(int fd __attribute__((__unused__)), int *sector_size)
{
*sector_size = DEFAULT_SECTOR_SIZE;
return 0;
}
#endif
これがあります。有用と思われるBLKSSZGET
ioctl
があります。
記録の場合:BLKSSZGET
の検索がコメントに次の情報が含まれthis stackoverflow question、に私たちをリードしBLKSSZGET =論理ブロックサイズ、BLKBSZGET =物理 ブロックサイズ、BLKGETSIZE64バイト単位=デバイスサイズ、BLKGETSIZE =デバイス サイズ/ 512少なくとも、fs.hと私の実験のコメントが を信頼できるものであれば。 - Edward Falk Jul 10 '12 at 19:33
これは絶対に素晴らしいです!ありがとうalars larsks! – vesontio