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

Все устройства хранения данных имеют минимальную адресуемую единицу хранения информации, которую они могут использовать. Эта единица обычно называется сектором, поскольку так называлась наименьшая единица на вращающихся жёстких дисках (в твердотельных накопителях используются ячейки памяти, и их наименьшая единица называется страницей). См. [1]

На разных накопителях используются разные размеры секторов. С 2011 года современные жёсткие диски обычно используют сектора размером 4 КиБ вместо обычных 512 байт. Твердотельные накопители иногда поддерживают несколько форматов.

Разные «слои» (устройство / стековые блочные устройства / файловые системы) должны использовать один и тот же размер сектора для эффективной работы. Если размеры сектора не будут совпадать, будет выполняться преобразование из секторов файловой системы в физические сектора, что может снизить производительность.

## Расширенный формат жёстких дисков

Расширенный формат - это общий термин, относящийся к любому формату сектора диска, используемому для хранения данных на магнитных дисках на жестких дисках, которые используют 4 килобайтные сектора вместо традиционных 512-байтовых секторов. Основная идея использования 4096-байтовых секторов заключается в увеличении плотности битов на каждой дорожке за счет уменьшения количества пробелов, которые содержат информацию о синхронизации / DAM и ECC (Error Correction Code) между секторами данных. Старый формат дал формат эффективности 88,7%, в то время как расширенный формат приводит к эффективности формата 97,3%.

Есть два типа дисков с расширенным форматом:

- Диски Advanced Format, отмеченные оранжевым логотипом «AF»: внутри они используют сектора 4 КиБ, но предоставляют слой эмуляции для совместимости с операционными системами, не поддерживающими их.
- Диски Advanced Format 4k native, отмеченные синим логотипом «4Kn»: для них требуется поддержка со стороны операционной системы (Windows 8+ или Linux 2.6.31+). Поскольку в них нет слоя трансляции, они дешевле, однако они могут быть несовместимы со старыми инструментами.

### Проверка поддерживаемых размеров сектора

Размер физического и логического сектора жесткого диска `/dev/sdX` можно определить, прочитав следующие записи sysfs:

    $ cat /sys/class/block/sdX/queue/physical_block_size
    $ cat /sys/class/block/sdX/queue/logical_block_size

Диски, использующие слой трансляции (см. выше), обычно сообщают логический размер блока 512 (для обратной совместимости) и физический размер блока 4096 (что указывает на то, что это диски Advanced Format).

Инструменты, которые будут сообщать о физическом секторе диска (при условии, что диск сообщит об этом правильно):

- fdisk:

      # LC_ALL=C fdisk -l /dev/sdX | grep 'Sector size'

- smartmontools:

      # smartctl -a /dev/sdX | grep 'Sector Size'

- hdparm:

      # hdparm -I /dev/sdX | grep 'Sector size:'

Обратите внимание, что оба они работают даже для USB-подключенных дисков (если USB-мост поддерживает SAT aka SCSI/ATA Translation, ANSI INCITS 431-2007).

## Твердотельные накопители

Большинство твердотельных накопителей (SSD) сообщают системе размер сектора 512 байт, хотя в них используются сектора большего размера — обычно 4 или 8 КиБ, а иногда даже больше. Из-за этого файловые системы не могут автоматически оптимизироваться под родной для накопителя размер сектора. Чтобы избежать потерь производительности, можно:

- вручную указать размер сектора при создании файловой системы;
- или изменить размер сектора, сообщаемый накопителем.

### Просмотр размеров сектора, поддерживаемых NVMe-накопителем

Используйте smartmontools:

    # smartctl -a устройство

    ...
    Supported LBA Sizes (NSID 0x1)
    Id Fmt  Data  Metadt  Rel_Perf
     0 +     512       0         2
     1 -    4096       0         1
    ...

### Установка размера сектора устройства

Некоторые SSD позволяют изменить размер сектора во время форматирования, что позволит использовать значение, более близкое к реальному размеру сектора.

#### NVMe

Чтобы проверить, поддерживает ли устройство 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` — это (вероятно) количество дополнительных байт метаданных на сектор, и это не очень хорошо поддерживается в Linux, поэтому лучше выбрать формат со значением 0.
- `Relative Performance` — указывает, какой формат обеспечит хорошую (good), получше (better) или наилучшую (best) производительность.

Для изменения размера сектора выполните `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

Это должно занять всего несколько секунд.

Если `nvme format` не работает, попробуйте перевести машину в ждущий режим (например, с помощью `systemctl suspend`), а после пробуждения выполнить `nvme format` ещё раз. Если `nvme format` по-прежнему не работает, возможно, поможет изменение настроек BIOS.

#### SATA

Для устройств SATA нужно использовать программы, предоставляемые производителем. Не все устройства SATA поддерживают изменение размера сектора.

##### Intel

Для Intel используйте Intel Memory and Storage (MAS) Tool (intel-mas-cli-toolAUR) с опцией `-set PhysicalSectorSize=4096`.

##### Seagate

Для Seagate используйте seagate-seachestAUR.

Просканируйте все диски, чтобы найти нужный, и выведите информацию о нём:

    # SeaChest_Basics --scan
    # SeaChest_Basics -d /dev/sgX -i

Проверьте серийный номер.

Проверьте размеры логических блоков, поддерживаемые диском:

    # SeaChest_Format -d /dev/sgX --showSupportedFormats

Если в списке есть 4096, вы можете изменить размер логического сектора на него следующим образом:

    # SeaChest_Format -d /dev/sgX --setSectorSize=4096 --confirm this-will-erase-data

Это займёт несколько минут, после чего ваш диск будет использовать размер сектора 4K.

## Выравнивание разделов

Правильное выравнивание разделов позволяет избежать лишних циклов read-modify-write. Типичной практикой для персональных компьютеров является выравнивание начала и размера каждого раздела по числам, кратным 1 МиБ (1 048 576 байт). Это значение очень удобно, так как делится на все часто используемые размеры страницы и блока — 1 МиБ, 512 КиБ, 128 КиБ, 4 КиБ и 512 байт.

Важно: Невыровненные разделы помешают использовать размер сектора 4096 байт с dm-crypt/LUKS. [2]

- fdisk, cfdisk и sfdisk выполняют выравнивание автоматически.
- gdisk и cgdisk выполняют выравнивание автоматически.
  - sgdisk по умолчанию выравнивает только начала разделов. Используйте опцию `-I`/`--align-end` для выравнивания размеров разделов.
- Parted выравнивает только начало раздела, но не размер. При создании разделов обязательно указывайте конец раздела в мебибайтах или более крупной двоичной единице МЭК.

## dm-crypt

В Cryptsetup 2.4.0 `luksFormat` автоматически определяет оптимальный размер сектора шифрования для формата LUKS2 [3].

Однако, чтобы это работало, устройство должно сообщать правильный размер сектора по умолчанию; смотрите раздел #Установка размера сектора устройства.

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

Примеры явной установки размера сектора 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."
- Несоблюдение правил обращения с жестким диском приводит к ухудшению производительности чтения/записи. Смотрите эту статью для конкретных примеров.

Category:

- Storage (Русский)