2016-10-16 9 views
0

하드 디스크의 섹터 크기를 결정할 수있는 C로 작은 프로그램을 작성하고 싶습니다. /sys/block/sd[X]/queue/hw_sector_size에있는 파일을 읽고 싶었고 CentOS 6/7에서 작동했습니다.리눅스에서 섹터 크기를 결정하는 이동 가능한 방법

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을 찾을 필요가있는 것처럼 보입니다.

글쎄, 그건 도움이되지 않았다. 우리는 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); 

날 리드 어떤 :

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; 
} 

차례로 lib/blkdev.c에서 blkdev_get_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

이것은 정말 놀랍습니다! 고맙습니다. – vesontio