В процессе исследования схемы разделов 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 из книги “
Текст программы 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 }