Вопрос или проблема
Я ответил на этот вопрос, предполагая, что файл *.img
имеет размер сектора 512
.
Как запросить устройство или образ устройства, чтобы найти правильный размер сектора?
fdisk -l
(это строчная L в параметре) покажет вам, среди прочей информации, и размер сектора.
$ sudo fdisk -l
Disk /dev/sda: 150.3 GB, 150323855360 bytes
255 heads, 63 sectors/track, 18275 cylinders, total 293601280 sectors
Units = sectors of 1 * 512 = 512 bytes
Device Boot Start End Blocks Id System
/dev/sda1 * 63 208844 104391 83 Linux
/dev/sda2 208845 209712509 104751832+ 83 Linux
Это показывает, что размер сектора составляет 512 байт.
РЕДАКТИРОВАНО: Новые версии fdisk
, например, fdisk
(из пакета util-linux 2.20.1
), также покажут вам логический и физический размеры секторов. Например, соответствующий вывод с диска “WDC WD10EFRX 1TB drive”:
Disk /dev/sdn: 1000.2 GB, 1000204886016 bytes
255 heads, 63 sectors/track, 121601 cylinders, total 1953525168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Согласно документации к файлам sysfs очереди:
# cat /sys/block/sda/queue/hw_sector_size
512
Можно просто использовать команду file(1)
и сделать вычисления самостоятельно. Это работает, даже если у вас есть только образ FAT-системы.
Например:
$ sudo file -s /dev/sda5 | tr , '\n'
/dev/sda5: DOS/MBR boot sector
code offset 0x58+2
OEM-ID "mkfs.fat"
sectors/cluster 64
reserved sectors 64
Media descriptor 0xf8
sectors/track 63
heads 255
hidden sectors 147632128
sectors 536870912 (volumes > 32 MB)
FAT (32 bit)
sectors/FAT 65536
serial number 0x9f981691
unlabeled
Этот раздел имеет 64 сектора на кластер. Количество байт в каждом секторе составляет 512, что является значением по умолчанию, следовательно, размер кластера – 32KB.
Обратите внимание, что размер сектора может быть больше 512 (спецификация FAT ограничивает его до 4096, но можно установить и больше). Когда это происходит, в выводе появляется дополнительное поле “Bytes/sector”.
$ sudo mkfs.fat -S 4096 -s 16 /dev/sda5
mkfs.fat 4.1 (2017-01-24)
$ sudo file -s /dev/sda5 | tr , '\n'
/dev/sda5: DOS/MBR boot sector
code offset 0x58+2
OEM-ID "mkfs.fat"
Bytes/sector 4096
sectors/cluster 16
Media descriptor 0xf8
sectors/track 63
heads 255
hidden sectors 147632128
sectors 67108864 (volumes > 32 MB)
FAT (32 bit)
sectors/FAT 4096
serial number 0xb059d826
label: unlabeled
Сделайте вычисления снова: 4096 байт × 16 секторов = 64 KiB на кластер.
Спасибо за приведенные выше ответы о том, что fdisk показывает физический размер сектора и о пути /sys…
но одно замечание…
по словам Лукаса в книге Absolute FreeBSD… почти каждый жесткий диск будет лгать о размере сектора, так что в случае с Linux
/sys/block/sda/queue/hw_sector_size
будет всегда, насколько я могу понять, показывать 512
для лучшей производительности стоит учитывать физический размер сектора, реальный, который действительно используется в логике оборудования. Он показан fdisk и присутствует в
cat /sys/block/sdc/queue/physical_block_size
4096
Этот ответ сосредоточен на файлах образов.
Я полагаю, что вопрос сам по себе не совсем правильный. Вопрос был (исключая часть про аппаратные устройства):
Как я могу запросить […] образ устройства, чтобы узнать правильный размер сектора?
Файл образа не имеет размера сектора, поскольку вы можете обрабатывать его как угодно. Например, вы можете создать устройство с размером сектора 4096
байт из него с помощью losetup -b 4096 file.img
или устройство с размером сектора 512
байт с помощью losetup -b 512 file.img
(я полагаю, но не уверен, что -b 512
является значением по умолчанию, так что эту часть можно опустить). Это создаст устройства /dev/loopX
(X
— это число, зависящее от того, сколько других loop-устройств уже существует) с размерами секторов 4096
или 512
байт соответственно.
Пока вы не создали устройство хранения из файла образа, ОС не имеет представления о размере секторов файла. Она даже не знает, что файл на самом деле является образом (чего бы то ни было) или что он содержит сектора. Например, это может быть просто текстовый файл с необычным расширением.
Единственное, что вы можете сделать, — это определить размер сектора устройства, с которого был сделан образ, методом проб и ошибок, предполагая, что вы знаете, что файл является образом устройства, структурированного в секторах. Обратите внимание, что есть много устройств, к которым это не относится, например /dev/urandom
.
Если вы знаете, что ваш файл — это образ жесткого диска или SSD, и если вы знаете, как это устройство хранения было отформатировано и разделено на секции в момент снятия образа, вы можете попробовать что-то вроде этого:
losetup -b 4096 --show -P -f file.img
Краткое объяснение: -b
устанавливает предполагаемый размер сектора, как объяснено выше. --show
позволяет увидеть, какое loop-устройство используется (например, /dev/loop0
). -f
означает, что оно само выберет, какое loop-устройство использовать. -P
важно на практике: Оно делает ядро осведомленным о устройстве и разделах на нем если таблица разделов или разделы найдены (см. ниже). Это означает, что, например, вы можете использовать устройство /dev/loop0p1
, которое будет первым разделом на /dev/loop0
.
Теперь вы можете проверить, содержит ли созданное устройство ожидаемое содержимое. Например, если вы знаете, что оригинальное устройство (устройство, с которого был снят образ) содержало обычную таблицу разделов и если вы знаете, какие разделы на нем были, вы можете выполнить что-то вроде
fdisk -l /dev/loop0
Если размер сектора, который вы указали в параметре -b
команды losetup
, соответствует размеру сектора оригинального устройства, вывод будет обычной таблицей разделов. Если размер сектора не совпадает, точный вывод зависит от обстоятельств, но почти всегда вы сразу заметите, что это не таблица разделов, которую вы ожидали.
В зависимости от вашей цели и от того, насколько вы осведомлены о разделах или других характеристиках формата оригинального устройства, вы можете поиграть с этим параметром -b
до тех пор, пока не увидите ожидаемое содержимое (например, таблицу разделов) в /dev/loop0
. Как только вы увидите ожидаемое содержимое, есть вероятность, что вы нашли размер сектора оригинального устройства, откуда взят образ.
На практике случаи, когда размер сектора в образе HDD или SSD является чем-то другим, чем 4096
и 512
, редки. Однако они существуют. Например, я встречал размеры секторов 8192
в образах дисков, а также размеры секторов 520
(не так уж редко с SAS-дисками в специализированном оборудовании хранения).
В заключение, я не знаю о программе для работы с разделами или другом программном обеспечении, которое пытается определить “правильный” размер сектора автоматически.
Попробуйте это
disk_sector_num=$(cat /sys/block/sdc/size)
disk_size_gb=$(expr $disk_sector_num / 2097152)
echo "sdc = ${disk_size_gb} GB"
sdc = 28 GB
.
Ответ или решение
Определение размера сектора раздела – это важный аспект управления хранилищем данных, особенно когда речь идет о работе с образами дисков и физическими дисками. Разумеется, правильная работа с размерами секторов может значительно сказаться на производительности и корректности операций чтения и записи данных. В данном ответе мы рассмотрим теоретические аспекты понятия размера сектора, приведем примеры использования утилит для определения этого параметра, а также рассмотрим применение этих знаний на практике.
Теоретический аспект: Понятие и важность размера сектора
Размер сектора представляет собой базовую единицу хранения данных на жестких дисках и в файловых системах. Обычно, размер сектора измеряется в байтах, традиционно 512 байт является стандартным размером для многих старых дисков. Однако, с развитием технологий, диски с размером сектора 4096 байт (или 4K) стали более распространенными, так как они позволяют более эффективно использовать дисковое пространство и увеличивают скорость операций ввода-вывода.
Знание точного размера сектора важно по нескольким причинам:
- Оптимизация производительности: Правильный выравнивание файловой системы по границам секторов может значительно улучшить производительность ввода-вывода.
- Совместимость и интеграция: Некоторые системы или устройства требуют конкретного размера сектора для корректной работы.
- Диагностика и восстановление данных: Понимание структуры хранения данных критично для успешного восстановления данных в случае их повреждения.
Примеры: Инструменты для определения размера сектора
Для определения размера сектора физического диска или его образа в операционных системах на базе UNIX и Linux, существует несколько подходов и утилит:
-
fdisk: Эта утилита является основной для работы с таблицами разделов на дисках. Запуск
fdisk -l
выдаст информацию о дисках, включая размер сектора.$ sudo fdisk -l
Вы увидите строки вида:
Units = sectors of 1 * 512 = 512 bytes
или, в более новых версиях, дополнительную информацию о физических и логических размерах сектора:
Sector size (logical/physical): 512 bytes / 4096 bytes
-
Чтение атрибутов устройства: Файловая система
/sys
на Linux содержит множество атрибутов, относящихся к аппаратуре. Для получения информации о размере сектора можно использовать:$ cat /sys/block/sda/queue/hw_sector_size $ cat /sys/block/sda/queue/physical_block_size
Здесь
hw_sector_size
обычно показывает размер логического сектора, аphysical_block_size
— физического. -
Команда file: Хотя она чаще всего используется для определения типа файла, команда
file
при применении к устройству или образу может содержать информацию о структуре разделов, включающую размер сектора:$ sudo file -s /dev/sda5
-
Создание loop устройства: Если требуется проанализировать образ устройства, его можно подключить как loop устройство с определенным размером сектора с помощью
losetup
:$ losetup -b 4096 --show -P -f file.img
Для анализа корректности выбраного размера сектора можно воспользоваться командой fdisk
непосредственно на loop устройстве:
$ fdisk -l /dev/loop0
Применение: Практическое использование знаний о размере сектора
На практике, знание о размере сектора полезно как при начальной настройке систем хранения данных, так и при решении проблем их эксплуатации. Любая ошибка в определении или применении размера сектора может привести к потере данных, снижению производительности или даже полной недоступности данных.
Пример применения:
Когда вам необходимо создать новый раздел на диске, который будет использоваться в производственной среде, важно убедиться, что логическая файловая система выровнена по границам физических секторов. Это можно сделать при помощи утилиты mkfs
, задав соответствующие параметры создания файловой системы:
$ sudo mkfs.ext4 -b 4096 /dev/sda2
В этом примере ключ -b 4096
гарантирует, что файловая система будет выравнена с учетом размера физического сектора 4096 байт, что оптимизирует производительность системы.
Также, при работе с образами дисков, особенно если внедряются в инфраструктуру виртуализации или контейнеризации, важно быть уверенным, что образы были созданы с правильными параметрами сектора, чтобы избежать несоответствий при монтировании в различных средах.
Заключение
Знание и управление размером сектора — это не просто теория, это критически важный аспект в обеспечении надежности и эффективности работы современных систем хранения данных. Используя инструменты и подходы, описанные выше, специалисты могут точно определить и корректно применять размеры секторов в своей каждодневной работе, минимизируя риски и оптимизируя производительность своих систем.