Advanced Format (Русский)

From ArchWiki
Состояние перевода: На этой странице представлен перевод статьи Advanced Format. Дата последней синхронизации: 21 сентября 2023. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

Минимальная физическая единица хранения данных на жёстком диске (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:'
Примечание: Для накопителей, подключенных через USB, используемый USB-мост должен поддерживать SAT — SCSI/ATA Translation (ANSI INCITS 431-2007).

На дисках 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 байт.

Важно: Невыровненные разделы помешают использовать размер сектора 4096 байт с dm-crypt/LUKS. [7]
  • fdisk, cfdisk и sfdisk выполняют выравнивание автоматически.
  • gdisk и cgdisk выполняют выравнивание автоматически.
    • sgdisk по умолчанию выравнивает только начала разделов. Используйте опцию -I/--align-end для выравнивания размеров разделов.
  • 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 issue 585 о том, почему команда может не сработать, если накопитель использует физические сектора 4K.

Если вы уже зашифровали устройство с неправильным размером сектора, устройство можно перешифровать командой:

Важно: Находящаяся на нём файловая система должна использовать размер блока 4096 байт или кратный ему, иначе всё сломается.
# 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 и т. д.) другой размер сектора файловой системы может снизить скорость записи до единиц МиБ/с, так как более производительные зоны записи заканчиваются, а слой трансляции секторов перегружается.

Примечание: На системах x86_64 Linux не может монтировать файловые системы с размером блока более 4 КиБ. Подробности и текущий прогресс описаны на странице Large block sizes (LBS).

Примеры явной установки размера сектора 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

Смотрите также