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, §_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
우리가 간다. 유용한 것으로 보이는 BLKSSZGET
ioctl
이 있습니다.
기록의 경우 : BLKSSZGET
에 대한 검색이 코멘트에 다음 정보를 포함 this stackoverflow question로 우리를 인도 BLKSSZGET = 논리 블록 크기, BLKBSZGET = 물리적 블록 크기, BLKGETSIZE64 바이트 = 장치 크기, BLKGETSIZE = 장치 크기/512 적어도 fs.h와 내 실험의 댓글은 신뢰할 수 있습니다. - Edward Falk Jul 10 '12 at 19:33
이것은 정말 놀랍습니다! 고맙습니다. – vesontio