В процессе исследования схемы разделов GPT мне понадобилось узнать размер блока на диске (прошу прощения читателей, кому данная тема неинтересна, но обещанное я должен довести до конца, исследование системы требует жертв). Обычно он равен 512 байт, но:

You can get the block size of a device node by calling ioctl with the DKIOCGETBLOCKSIZE selector (defined in ). Do not assume that the block size is always going to be 512 bytes.

Штатных средств получения данных по ioctl я не нашёл, поэтому приведу программу на C из книги “Mac OS X Internals. A Systems Approach“.

Текст программы diskinfo.c:

// diskinfo.c
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/disk.h>
#define PROGNAME "diskinfo"
void
cleanup(char *errmsg, int retval)
{
	perror(errmsg);
	exit(retval);
}
#define TRY_IOCTL(fd, request, argp) \
		if ((ret = ioctl(fd, request, argp)) < 0) { \
		close(fd); cleanup("ioctl", ret); \
	}

int
main(int argc, char **argv)
{
	int fd, ret;
	u_int32_t blockSize;
	u_int64_t blockCount;
	u_int64_t maxBlockRead;
	u_int64_t maxBlockWrite;
	u_int64_t capacity1000, capacity1024;
	dk_firmware_path_t fwPath;
	if (argc != 2) {
		fprintf(stderr, "usage: %s <raw disk>\n", PROGNAME);
		exit(1);
	}
	if ((fd = open(argv[1], O_RDONLY, 0)) < 0)
		cleanup("open", 1);
	TRY_IOCTL(fd, DKIOCGETFIRMWAREPATH, &fwPath);
	TRY_IOCTL(fd, DKIOCGETBLOCKSIZE, &blockSize);
	TRY_IOCTL(fd, DKIOCGETBLOCKCOUNT, &blockCount);
	TRY_IOCTL(fd, DKIOCGETMAXBLOCKCOUNTREAD, &maxBlockRead);
	TRY_IOCTL(fd, DKIOCGETMAXBLOCKCOUNTWRITE, &maxBlockWrite);
	close(fd);
	capacity1024 = (blockCount * blockSize) / (1ULL << 30ULL);
	capacity1000 = (blockCount * blockSize) / (1000ULL * 1000ULL * 1000ULL);
	printf("%-20s = %s\n", "Device", argv[1]);
	printf("%-20s = %s\n", "Firmware Path", fwPath.path);
	printf("%-20s = %llu GB / %llu GiB\n", "Capacity",
		capacity1000, capacity1024);
	printf("%-20s = %u bytes\n", "Block Size", blockSize);
	printf("%-20s = %llu\n", "Block Count", blockCount);
	printf("%-20s = { read = %llu blocks, write = %llu blocks }\n",
		"Maximum Request Size", maxBlockRead, maxBlockWrite);
	exit(0);
}

Компиляция:

$ gcc -Wall -o diskinfo diskinfo.c

Использование:

$ ./diskinfo /dev/rdisk4
Device               = /dev/rdisk4
Firmware Path        = /PCI0@0/EHC1@4,1/@3:0
Capacity             = 320 GB / 298 GiB
Block Size           = 512 bytes
Block Count          = 625142448
Maximum Request Size = { read = 256 blocks, write = 256 blocks }