2016-10-16 22 views
0

ハードディスクのセクタサイズを決定できるC言語の小さなプログラムを作成したいと思います。私は/sys/block/sd[X]/queue/hw_sector_sizeにあるファイルを読んでみたかったので、CentOS 6/7で働いていました。Linuxでセクタサイズを決定する移植可能な方法

CentOS 5.11でテストしたところ、ファイルhw_sector_sizeが見つからず、max_hw_sectors_kbmax_sectors_kbしか見つかりませんでした。

このように、CentOS 5でどのようにセクタサイズを決定することができますか(API)、そうするにはもっと良い方法があります。ありがとう。

答えて

3

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.cblkdev_get_sector_sizeの定義に私をリード
static unsigned long get_sector_size(int fd) 
{ 
    int sect_sz; 

    if (!blkdev_get_sector_size(fd, &sect_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 

これがあります。有用と思われるBLKSSZGETioctlがあります。

記録の場合:BLKSSZGETの検索がコメントに次の情報が含まれthis stackoverflow question、に私たちをリードしBLKSSZGET =論理ブロックサイズ、BLKBSZGET =物理 ブロックサイズ、BLKGETSIZE64バイト単位=デバイスサイズ、BLKGETSIZE =デバイス サイズ/ 512少なくとも、fs.hと私の実験のコメントが を信頼できるものであれば。 - Edward Falk Jul 10 '12 at 19:33

+1

これは絶対に素晴らしいです!ありがとうalars larsks! – vesontio

関連する問題