Advanced Format (Русский)
Минимальная физическая единица хранения данных на жёстком диске (HDD) называется сектор. На твердотельных накопителях (SSD) его аналогом является страница.[1] Прошивки накопителей абстрагируют физические сектора с помощью логических секторов, с которыми могут работать программы. Размер сектора соответствует размеру наименьшей адресуемой единицы на диске.
- Размер физического сектора
- Это наименьшая единица, которую накопитель может записать атомарно. Для жёстких дисков это фактический размер секторов на пластине. Раньше физический размер сектора у жёстких дисков обычно составлял 512 байт, то есть каждый сектор вмещал 512 байт данных. Однако с появлением Advanced Format размер физического сектора был увеличен до 4096 байт (4 КиБ), что позволило повысить плотность хранения данных и улучшить возможности коррекции ошибок. Твердотельные накопители не указывают реальный размер страницы флэш-памяти NAND, который обычно составляет от 4 до 16 КиБ, вместо они сообщают размер физического сектора, совпадающий с размером логического сектора. Для NVMe SSD используется значение параметра Atomic Write Unit Power Fail (AWUPF), если он доступен.
- Размер логического сектора
- Логический размер сектора, также известный как размер сектора операционной системы, — это размер секторов, с которыми работают операционная система и приложения. Именно этот размер сектора используется для чтения из накопителя и записи в него на программном уровне. Логический размер сектора может отличаться от физического размера сектора. Например, жёсткий диск Advanced Format с физическим размером сектора 4096 байт может иметь логический размер сектора 512 байт для совместимости со старыми системами и приложениями.
Разные «слои» (устройство / стековые блочные устройства / файловые системы) должны использовать один и тот же размер сектора для эффективной работы. Если размеры сектора не будут совпадать, будет выполняться преобразование из секторов файловой системы в физические сектора, что может снизить производительность.
Текущие сообщаемые устройством размеры физического и логического секторов можно узнать несколькими способами (однако сообщаемый размер физического сектора может отличаться от реального, особенно на NVMe-накопителях). Например, с помощью lsblk:
$ lsblk -td
NAME ALIGNMENT MIN-IO OPT-IO PHY-SEC LOG-SEC ROTA SCHED RQ-SIZE RA WSAME sda 0 4096 0 4096 4096 1 mq-deadline 64 128 0B nvme1n1 0 4096 0 4096 4096 0 none 1023 128 0B nvme0n1 0 4096 0 4096 4096 0 none 1023 128 0B
В столбце PHY-SEC
указан размер физического сектора, а в LOG-SEC
— логического.
Другой способ — с помощью обращения к sysfs:
$ cat /sys/class/block/устройство/queue/physical_block_size $ cat /sys/class/block/устройство/queue/logical_block_size
Информация о размерах секторов также есть в выводе программ fdisk, smartctl и hdparm.
Изменение размера сектора
Некоторые накопители NVMe и «корпоративные» жёсткие диски SATA поддерживают изменение сообщаемого ими размера сектора с помощью стандартных команд NVMe (Format NVM
из NVM Command Set Specification 1.0 или новее) или (SET SECTOR CONFIGURATION EXT
from ATA Command Set - 4 или новее) соответственно. На жёстких дисках при этом изменяется логический размер сектора так, чтобы он соответствовал физическому размеру сектора для оптимальной производительности, а на NVMe SSD можно изменить как логический, так и физический размер сектора.
Твердотельные накопители SATA, как правило, не поддерживают изменение размера сектора. Исключение составляют некоторые Intel SATA SSD, которые могут изменять сообщаемый ими физический размер сектора, но не логический.[2] Смотрите раздел #Intel.
Изменение размера сектора диска — сложный процесс, требующий низкоуровневого форматирования. В качестве альтернативы можно вручную указать нужный размер сектора при создании файловых систем на диске для достижения оптимальной производительности. Смотрите разделы #dm-crypt и #Файловые системы.
Жёсткие диски Advanced Format
Чтобы узнать, можно ли изменить размер сектора жёсткого диска Advanced Format, можно использовать hdparm:
# hdparm -I /dev/sdX | grep 'Sector size:'
На дисках Advanced Format, в Sector Configuration Log которых указано несколько логических размеров секторов, будет показан их список:
Logical Sector size: 512 bytes [ Supported: 512 4096 ] Physical Sector size: 4096 bytes
Жёсткие диски, не поддерживающие несколько изменяемых размеров логических секторов, просто сообщают текущие размеры секторов. Например, диск Advanced Format 512e:
Logical Sector size: 512 bytes Physical Sector size: 4096 bytes
Для достижения оптимальной производительности на дисках такого типа убедитесь, что #dm-crypt или #Файловые системы имеют размер блока не менее 4096 байт и что соответствующие разделы выровнены по физическому размеру сектора.
Диск Advanced Format 4Kn:
Logical Sector size: 4096 bytes Physical Sector size: 4096 bytes
Диски 4Kn уже изначально имеют оптимальную конфигурацию и не нуждаются в особом внимании при разметке разделов и форматировании. Их можно просто использовать как есть.
Если жёсткий диск SATA поддерживает несколько размеров логических секторов и опциональную ATA-команду SET SECTOR CONFIGURATION EXT
(например, диски Seagate, заявляющие поддержку FastFormat), то для переключения между поддерживаемыми размерами логических секторов можно использовать hdparm. Чтобы установить значение 4096 байт, то есть 4Kn, выполните команду:
# hdparm --set-sector-size 4096 --please-destroy-my-drive /dev/sdX
После этого hdparm должен сообщить, что размер логического сектора составляет 4096 байт:
# hdparm -I /dev/sdX | grep 'Sector size:'
Logical Sector size: 4096 bytes [ Supported: 512 4096 ] Physical Sector size: 4096 bytes
NVMe
Большинство твердотельных накопителей (SSD) сообщают логический размер 512 байт, хотя физически они используют более крупные блоки — 4 КиБ, 8 КиБ или даже больше.
Чтобы проверить размер логического блока (formatted logical block address size, FLBAS) на устройстве NVMe, используйте команду Identify Namespace:
# nvme id-ns -H /dev/nvme0n1 | grep "Relative Performance"
LBA Format 0 : Metadata Size: 0 bytes - Data Size: 512 bytes - Relative Performance: 0x2 Good (in use) LBA Format 1 : Metadata Size: 0 bytes - Data Size: 4096 bytes - Relative Performance: 0x1 Better
-
Metadata Size
— это количество дополнительных байт метаданных, связанных с адресом логического блока (LBA). Это не очень хорошо поддерживается в Linux, поэтому лучше выбрать формат со значением 0. -
Relative Performance
— указывает, какой формат обеспечит сниженную (degraded), хорошую (good), получше (better) или наилучшую (best) производительность.
smartctl также умеет показывать поддерживаемые размеры, но не предоставляет удобных для пользователя описаний:
# smartctl -c /dev/nvme0n1
... Supported LBA Sizes (NSID 0x1) Id Fmt Data Metadt Rel_Perf 0 + 512 0 2 1 - 4096 0 1
Для изменения размера сектора выполните nvme format
с указанием предпочтительного значения в параметре --lbaf
:
# nvme format --lbaf=1 /dev/nvme0n1
You are about to format nvme0n1, namespace 0x1. WARNING: Format may irrevocably delete this device's data. You have 10 seconds to press Ctrl-C to cancel this operation. Use the force [--force] option to suppress this warning. Sending format operation ... Success formatting namespace:1
Это должно занять всего несколько секунд.
Некоторые старые накопители (до 2020 года) блокируют команду Format NVM
, если прошивка системы отправляет им нестандартную команду «security freeze» после этапа POST.[3][4] Если nvme format
не работает, попробуйте перевести систему в ждущий режим (убедитесь, что используется именно режим S3, а не S0ix) и выполнить nvme format
после пробуждения системы.[5][6]
Использование программ производителя
Если перечисленные выше универсальные инструменты не позволяют изменить размер сектора, возможно, его можно изменить с помощью инструмента от производителя диска.
Intel
Для Intel используйте Intel Memory and Storage (MAS) Tool (intel-mas-cli-toolAUR) с опцией -set PhysicalSectorSize=4096
.
Seagate
Для Seagate используйте openseachestAUR.
Просканируйте все диски, чтобы найти нужный, и выведите информацию о нём:
# openSeaChest_Basics --scan # openSeaChest_Basics -d /dev/sdX -i
Проверьте серийный номер.
Проверьте размеры логических блоков, поддерживаемые диском:
# openSeaChest_Format -d /dev/sdX --showSupportedFormats
Если в списке есть 4096, вы можете изменить размер логического сектора на него следующим образом:
# openSeaChest_Format -d /dev/sdX --setSectorSize=4096 --confirm this-will-erase-data
Это займёт несколько минут, после чего ваш диск будет использовать размер сектора 4K.
Выравнивание разделов
Правильное выравнивание разделов позволяет избежать лишних циклов read-modify-write. Типичной практикой для персональных компьютеров является выравнивание начала и размера каждого раздела по числам, кратным 1 МиБ (1 048 576 байт). Это значение очень удобно, так как делится на все часто используемые размеры страницы и блока — 1 МиБ, 512 КиБ, 128 КиБ, 4 КиБ и 512 байт.
- fdisk, cfdisk и sfdisk выполняют выравнивание автоматически.
-
gdisk и cgdisk выполняют выравнивание автоматически.
-
sgdisk по умолчанию выравнивает только начала разделов. Используйте опцию
-I
/--align-end
для выравнивания размеров разделов.
-
sgdisk по умолчанию выравнивает только начала разделов. Используйте опцию
- Parted выравнивает только начало раздела, но не размер. При создании разделов обязательно указывайте конец раздела в мебибайтах или более крупной двоичной единице МЭК.
dm-crypt
В Cryptsetup 2.4.0 luksFormat
автоматически определяет оптимальный размер сектора шифрования для формата LUKS2 [8].
Однако, чтобы это работало, устройство должно сообщать правильный размер сектора по умолчанию; смотрите раздел #Изменение размера сектора.
После использования cryptsetup luksFormat
вы можете проверить размер сектора, используемого томом LUKS2, с помощью команды
# cryptsetup luksDump устройство | grep sector
Если размер сектора оказался неверный, вы можете принудительно создать контейнер LUKS2, указав размер сектора 4K и оставив другие параметры со значениями по умолчанию:
# cryptsetup luksFormat --sector-size=4096 устройство
Команда выдаст ошибку, если запрашиваемый размер не соответствует вашему устройству:
# cryptsetup luksFormat --sector-size 4096 устройство (...) Verify passphrase: Device size is not aligned to requested sector size.
Если вы уже зашифровали устройство с неправильным размером сектора, устройство можно перешифровать командой:
# cryptsetup reencrypt --sector-size=4096 устройство
Файловые системы
mkfs.btrfs(8), mkfs.jfs(8), mkfs.nilfs2(8), mkfs.reiserfs(8) и mkswap(8) по умолчанию используют размер сектора 4096 байт.
mkfs.ext4(8) по умолчанию использует размер сектора 1024 байт для файловых систем меньше чем 512 МиБ и 4096 байт для 512 МиБ и больше.
mkfs.xfs(8) по умолчанию использует размер сектора 512 байт, но будет использовать 4096 для 512e и 4Kn дисков.
mkfs.f2fs(8), mkfs.fat(8), mkfs.ntfs(8) и mkfs.udf(8) используют логический размер сектора, сообщаемый устройством — то есть 512 байт для 512e и 4096 байт для 4Kn дисков.
zpool-create(8) (из ZFS) по умолчанию использует размер сектора 512 (2⁹) байт, для использования другого размера его нужно явно указать во время создания пула с помощью параметра -o ashift=12
(2¹², 4096 байт).
Если накопитель не сообщает правильный размер сектора, можно явно указать нужный размер сектора при форматировании.
В частности, для дисков с черепичной магнитной записью (Shingled Magnetic Recording, SMR), управляемых прошивкой, использование логического размера сектора 512 байт, если их физический размер сектора составляет 4096 байт, приводит к серьёзным негативным последствиям. Эти диски имеют зоны записи с разной производительностью, и перераспределение выполняется во время простоя, но во время активной записи (например, при ресинхронизации RAID, резервном копировании, записи множества небольших файлов, rsync и т. д.) другой размер сектора файловой системы может снизить скорость записи до единиц МиБ/с, так как более производительные зоны записи заканчиваются, а слой трансляции секторов перегружается.
Примеры явной установки размера сектора 4096 байт:
-
ext4:
# mkfs.ext4 -b 4096 /dev/устройство
-
XFS:
# mkfs.xfs -s size=4096 /dev/устройство
-
FAT:
# mkfs.fat -S 4096 /dev/устройство
-
NTFS-3G:
# mkfs.ntfs -Q -s 4096 /dev/устройство
- UDF:
# mkfs.udf -b 4096 /dev/устройство
-
ZFS:
# zpool create -o ashift=12 имя-пула raidz устройство0 … устройствоN
Смотрите также
- Расширенный формат Western Digital: начинается переход на сектора 4K
- Белая книга под названием "Advanced Format Technology."
- Несоблюдение правил обращения с жёстким диском приводит к ухудшению производительности чтения/записи. Смотрите эту статью для конкретных примеров.