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

You can get the block size of a device node by calling ioctl with the DKIOCGETBLOCKSIZE selector (defined in <sys/disk.h>). 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 
#include 
#include 
#include 
#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 \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);
}

</pre>

Компиляция:

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