Использование команды `mkfs` в Linux: полное руководство по форматированию дисков и разделов
Команда `mkfs` (создание файловой системы) является основной утилитой Linux для записи структуры файловой системы на блочное устройство — будь то необработанный диск, раздел или логический том. Она инициализирует суперблок, таблицы инодов, группы блоков и структуры журнала, необходимые перед записью каких-либо данных на устройство.
Прежде чем работать с любым диском, запомните: `mkfs` — это деструктивная, необратимая операция. Она не просто стирает запись в таблице разделов — она перезаписывает критически важные метаданные на диске. Запуск команды на неправильном устройстве, даже кратковременный, делает существующие данные невосстановимыми без криминалистических инструментов. Проверяйте целевое устройство с помощью `lsblk` или `blkid` перед каждым вызовом.
Что `mkfs` делает под капотом
Когда вы выполняете `mkfs -t ext4 /dev/sdb1`, ядро не просто «форматирует» раздел в понимании Windows. Команда вызывает соответствующий бинарный файл для конкретной файловой системы (в данном случае `mkfs.ext4`, который фактически является `mke2fs` с настройками ext4 по умолчанию) и выполняет следующее:
- Записывает суперблок и резервные копии суперблока по фиксированным смещениям групп блоков
- Выделяет и инициализирует таблицу инодов во всех группах блоков
- Создаёт таблицу дескрипторов групп блоков
- Инициализирует журнал (для журналируемых файловых систем, таких как ext4 и XFS)
- Записывает инод корневого каталога (инод 2 для ext4)
- Присваивает файловой системе UUID для постоянной идентификации
Это различие важно на больших дисках. Форматирование раздела ext4 объёмом 4 TB с полной инициализацией таблицы инодов может занять несколько минут. XFS, напротив, откладывает большую часть этой работы до времени выполнения, что делает `mkfs.xfs` практически мгновенным независимо от размера тома.
Определение правильного устройства перед форматированием
Никогда не угадывайте имя устройства. Используйте следующие инструменты для сопоставления физического оборудования с узлами устройств ядра.
Использование `lsblk`
“`bash
lsblk -o NAME,SIZE,FSTYPE,LABEL,UUID,MOUNTPOINT
“`
Пример вывода:
“`
NAME SIZE FSTYPE LABEL UUID MOUNTPOINT
sda 100G
├─sda1 20G ext4 a1b2c3d4-… /
└─sda2 80G ext4 e5f6a7b8-… /home
sdb 500G
└─sdb1 500G
“`
Пустое поле `FSTYPE` подтверждает, что `/dev/sdb1` не имеет существующей файловой системы — его можно безопасно форматировать.
Использование `blkid`
“`bash
sudo blkid /dev/sdb1
“`
Если команда не возвращает вывода, раздел не содержит распознанной сигнатуры файловой системы. Если она возвращает тип, вы собираетесь перезаписать существующие данные.
Использование `fdisk -l`
“`bash
sudo fdisk -l /dev/sdb
“`
Это позволяет увидеть границы разделов, типы разделов и использует ли диск MBR или GPT. Если `/dev/sdb` не показывает таблицы разделов вообще, возможно, сначала потребуется разбить диск на разделы с помощью `fdisk`, `gdisk` или `parted` перед запуском `mkfs`.
Основной синтаксис и шаблоны вызова `mkfs`
Канонический синтаксис:
“`bash
mkfs -t <filesystem_type> [options] <device>
“`
Однако `mkfs` сам по себе является тонкой обёрткой. Каждый тип файловой системы поставляется со своим собственным выделенным бинарным файлом:
| Псевдоним `mkfs` | Базовый бинарный файл | Файловая система |
|---|
| — | — | — |
|---|
| `mkfs.ext4` | `mke2fs` | Fourth Extended Filesystem |
|---|
| `mkfs.xfs` | `mkfs.xfs` | XFS |
|---|
| `mkfs.btrfs` | `mkfs.btrfs` | B-Tree Filesystem |
|---|
| `mkfs.vfat` | `mkdosfs` | FAT16/FAT32 |
|---|
| `mkfs.exfat` | `mkfs.exfat` | exFAT |
|---|
| `mkfs.ntfs` | `mkntfs` | NTFS |
|---|
| `mkfs.f2fs` | `mkfs.f2fs` | Flash-Friendly Filesystem |
|---|
Вызов `mkfs -t ext4` и прямой вызов `mkfs.ext4` функционально идентичны — первый просто разрешается во второй. В производственных скриптах предпочтительнее использовать явный псевдоним (`mkfs.ext4`), чтобы намерение было однозначным.
Выбор типа файловой системы: техническое сравнение
Выбор неподходящей файловой системы для рабочей нагрузки — распространённая и дорогостоящая ошибка. Следующая таблица сопоставляет характеристики файловых систем с реальными сценариями использования.
| Файловая система | Макс. размер тома | Макс. размер файла | Журналирование | Лучший сценарий использования | Кросс-платформенная поддержка |
|---|
| — | — | — | — | — | — |
|---|
| **ext4** | 1 EiB | 16 TiB | Да (ordered/writeback) | Универсальные корневые и дисковые тома Linux | Нативная для Linux; только чтение на macOS/Windows с драйверами |
|---|
| **XFS** | 8 EiB | 8 EiB | Да (только метаданные по умолчанию) | Большие файлы, базы данных, высокопроизводительное хранилище, NFS-экспорты | Нативная для Linux |
|---|
| **Btrfs** | 16 EiB | 16 EiB | CoW (без традиционного журнала) | Снимки, RAID, подтома, рабочие нагрузки NAS | Нативная для Linux |
|---|
| **vFAT/FAT32** | 2 TiB | 4 GiB | Нет | USB-накопители, EFI System Partition (ESP), кросс-платформенные съёмные носители | Универсальная |
|---|
| **exFAT** | 128 PiB | 16 EiB | Нет | Большие съёмные носители, где ограничение размера файла FAT32 является проблемой | Универсальная (современные ОС) |
|---|
| **NTFS** | 256 TiB | 256 TiB | Да | Разделы данных Windows при двойной загрузке | Нативная для Windows; полная поддержка на Linux через `ntfs-3g` |
|---|
| **F2FS** | 16 TiB | 3.94 TiB | Журнально-структурированная | SSD, eMMC, SD-карты, внутреннее хранилище Android | Нативная для Linux |
|---|
Критический граничный случай — EFI System Partition: ESP должен быть отформатирован как `vfat` (конкретно FAT32). Использование любой другой файловой системы здесь не позволит прошивке UEFI найти загрузчик. Всегда форматируйте ESP с помощью:
“`bash
sudo mkfs.vfat -F 32 /dev/sda1
“`
Флаг `-F 32` явно принудительно задаёт FAT32 вместо FAT16, что важно для ESP-разделов размером более 32 MiB.
Практические примеры `mkfs` с производственными параметрами
Пример 1: Создание файловой системы ext4 с настроенными параметрами
“`bash
sudo mkfs.ext4 -L "data_vol" -m 1 -E lazy_itable_init=0,lazy_journal_init=0 /dev/sdb1
“`
Что делает каждый флаг:
- `-L "data_vol"` — присваивает постоянную метку, позволяя записям `/etc/fstab` использовать `LABEL=data_vol` вместо пути к необработанному устройству (безопаснее в системах, где порядок перечисления устройств может меняться)
- `-m 1` — уменьшает процент зарезервированных блоков с 5% по умолчанию до 1%; на томе данных объёмом 2 TB значение по умолчанию расходует впустую ~100 GB, которые может использовать только root
- `-E lazy_itable_init=0,lazy_journal_init=0` — принудительно выполняет полную инициализацию таблицы инодов во время форматирования, а не откладывает её на фоновый ввод-вывод; критически важно для производственных серверов, где фоновая инициализация может вызвать неожиданные всплески ввода-вывода спустя часы после развёртывания
Пример 2: Создание файловой системы XFS для сервера баз данных
“`bash
sudo mkfs.xfs -L "pg_data" -f /dev/sdb1
“`
- `-f` — принудительно создаёт файловую систему, даже если обнаружена существующая сигнатура файловой системы; используйте только при подтверждении, что устройство можно перезаписать
- XFS не поддерживает уменьшение размера; тщательно планируйте размер тома перед форматированием
Для рабочих нагрузок PostgreSQL или MySQL на XFS также установите параметр монтирования `noatime` в `/etc/fstab`, чтобы устранить накладные расходы на запись времени доступа к инодам при каждой операции чтения.
Пример 3: Создание файловой системы Btrfs с RAID-1 на двух устройствах
“`bash
sudo mkfs.btrfs -L "btrfs_mirror" -d raid1 -m raid1 /dev/sdb /dev/sdc
“`
Btrfs может нативно охватывать несколько блочных устройств. `-d raid1` зеркалирует данные; `-m raid1` зеркалирует метаданные. Это является законной альтернативой программному RAID mdadm для сред, где также требуется функциональность снимков и подтомов.
Пример 4: Создание файловой системы vFAT для USB-накопителя
“`bash
sudo mkfs.vfat -F 32 -n "BACKUP_USB" /dev/sdc1
“`
- `-n "BACKUP_USB"` — задаёт метку тома (метки FAT32 ограничены 11 символами в верхнем регистре)
- `-F 32` — явно выбирает FAT32 вместо FAT16
Пример 5: Создание файловой системы F2FS на SSD
“`bash
sudo mkfs.f2fs -l "ssd_cache" /dev/sdb1
“`
F2FS специально разработана для флэш-хранилищ NAND. Она снижает усиление записи и управляет выравниванием износа на уровне файловой системы. На экземплярах VPS Хостинга, использующих хранилище NVMe, F2FS может превосходить ext4 для эфемерных кэш-томов с интенсивной записью.
Форматирование целого диска без таблицы разделов
В определённых сценариях — физические тома LVM, Ceph OSD или специализированные устройства хранения — вы можете записать файловую систему непосредственно на весь диск, а не на раздел:
“`bash
sudo mkfs.ext4 /dev/sdb
“`
Когда это уместно:
- Диск предназначен для единственной цели и гибкость разделов не нужна
- Вы подготавливаете диск для LVM (`pvcreate` обрабатывает это иначе, но концепция аналогична)
- Вы создаёте образ файловой системы на loopback-устройстве
Когда это неуместно:
- Любой диск, с которого нужно загружаться (требует таблицы разделов с загрузочным флагом)
- Любой диск, совместно используемый несколькими файловыми системами или операционными системами
- Диски в системах, где правила udev или инструменты облачной инфраструктуры ожидают наличия таблицы разделов
Монтирование отформатированного раздела и обеспечение его постоянства
Форматирование создаёт файловую систему; монтирование делает её доступной. Всегда используйте ссылки на основе UUID в `/etc/fstab` вместо имён устройств, поскольку имена устройств (`/dev/sdb1`) не гарантированно стабильны при перезагрузках в системах с несколькими дисками или горячим подключением хранилища.
“`bash
Create the mount point
sudo mkdir -p /mnt/data_vol
Mount temporarily to verify
sudo mount /dev/sdb1 /mnt/data_vol
Retrieve the UUID
sudo blkid /dev/sdb1
Output: /dev/sdb1: LABEL="data_vol" UUID="a1b2c3d4-e5f6-7890-abcd-ef1234567890" TYPE="ext4"
Add a persistent, UUID-based fstab entry
echo 'UUID=a1b2c3d4-e5f6-7890-abcd-ef1234567890 /mnt/data_vol ext4 defaults,noatime 0 2' | sudo tee -a /etc/fstab
Validate the fstab entry without rebooting
sudo mount -a
“`
Значение `0 2` в конце записи fstab управляет `dump` (утилита резервного копирования, установите 0 для отключения) и порядком прохода `fsck` (2 означает проверку после корневой файловой системы; для root должно быть 1).
Проверка целостности файловой системы после форматирования
Не предполагайте, что форматирование прошло успешно без проверки.
“`bash
Check filesystem type, label, and UUID
lsblk -f /dev/sdb1
For ext4: run e2fsck in read-only check mode
sudo e2fsck -n /dev/sdb1
For XFS: verify the filesystem structure
sudo xfs_repair -n /dev/sdb1
Check available space after mounting
df -hT /mnt/data_vol
“`
Флаг `-n` как для `e2fsck`, так и для `xfs_repair` выполняет пробную проверку без изменения файловой системы. Это безопасно запускать на смонтированной файловой системе в диагностических целях, хотя полное восстановление требует предварительного размонтирования.
Справочник расширенных параметров
| Параметр | Применимо к | Эффект |
|---|
| — | — | — |
|---|
| `-L <label>` | Все | Присваивает удобочитаемую метку файловой системы |
|---|
| `-b <block_size>` | ext4, XFS | Задаёт размер блока (512, 1024, 2048, 4096 байт); более крупные блоки повышают пропускную способность для больших файлов, расходуют пространство впустую для маленьких файлов |
|---|
| `-m <percent>` | ext4 | Процент зарезервированных блоков для root (по умолчанию 5%); уменьшите до 1% на больших томах данных |
|---|
| `-i <bytes-per-inode>` | ext4 | Управляет плотностью инодов; уменьшите для файловых систем, хранящих миллионы маленьких файлов |
|---|
| `-N <inode-count>` | ext4 | Задаёт явное количество инодов; полезно, когда известно ожидаемое количество файлов |
|---|
| `-E lazy_itable_init=0` | ext4 | Отключает ленивую инициализацию инодов; более медленное форматирование, устраняет фоновый ввод-вывод после развёртывания |
|---|
| `-f` | XFS | Принудительно форматирует, даже если существует сигнатура файловой системы |
|---|
| `-d su=,sw=` | XFS | Настраивает единицу полосы и ширину для выровненного ввода-вывода RAID |
|---|
| `-F 32` | vFAT | Принудительно задаёт FAT32 (вместо FAT16) |
|---|
| `-q` | ext4 | Тихий режим; подавляет вывод прогресса (полезно в скриптах) |
|---|
Распространённые ошибки и способы их избежать
Форматирование смонтированной файловой системы: Linux не всегда предотвращает это. Запуск `mkfs` на смонтированном разделе немедленно повреждает файловую систему и может вызвать панику ядра. Всегда проверяйте статус монтирования с помощью `mount | grep /dev/sdb1` перед продолжением.
Исчерпание инодов на ext4: Если вы задаёте большой размер блока (например, 4096 байт) на томе, который будет хранить миллионы крошечных файлов (почтовые спулы, кэши сессий), вы исчерпаете иноды задолго до дискового пространства. Используйте `-i 4096` или `-i 2048` для увеличения плотности инодов. Это особенно распространённая проблема на серверах Email Хостинга и высоконагруженных веб-серверах, хранящих файлы для каждой сессии.
XFS и уменьшение размера: Тома XFS не могут быть уменьшены после создания. Если вы форматируете том XFS объёмом 2 TB и позже вам нужно освободить пространство, единственный вариант — резервное копирование, переформатирование и восстановление. Планируйте размеры томов XFS консервативно или используйте тонкое выделение LVM в качестве основы.
Выравнивание полос для RAID и SSD: Форматирование без указания выравнивания полос на массиве RAID или SSD вызывает невыровненный ввод-вывод, значительно снижая производительность. Для массива RAID-5 с полосой 512 KB и 4 дисками:
“`bash
sudo mkfs.ext4 -E stride=128,stripe-width=384 /dev/md0
“`
Где `stride = stripe_size / block_size` и `stripe-width = stride * (data_disks)`.
Коллизии UUID после клонирования диска: Клонирование диска с помощью `dd` дублирует UUID файловой системы. Два устройства с одинаковыми UUID вызывают сбои монтирования и повреждение данных. После клонирования пересоздайте UUID:
“`bash
sudo tune2fs -U random /dev/sdb1 # ext4
sudo xfs_admin -U generate /dev/sdb1 # XFS
“`
Это критически важное соображение при развёртывании Выделенных Серверов из образов дисков или подготовке нескольких узлов из единого шаблона.
Особенности файловых систем для VPS и облачных сред
На виртуальных машинах и облачных экземплярах базовое хранилище часто представляет собой тонко выделенный виртуальный диск, поддерживаемый распределённой системой хранения. Несколько решений `mkfs` становятся более значимыми в этом контексте:
- Поддержка Discard/TRIM: Форматируйте ext4 с `-E discard` или добавьте параметр монтирования `discard` для включения онлайн-TRIM, который возвращает освобождённые блоки в базовый пул хранилища и поддерживает производительность с течением времени на экземплярах VPS с cPanel, использующих SSD.
- Режим журнала: Для приложений, чувствительных к задержкам, рассмотрите режим журнала `data=writeback` в `/etc/fstab` для ext4. Это жертвует строгим порядком данных ради меньшей задержки записи, что приемлемо для баз данных, управляющих собственными журналами упреждающей записи.
- Избегайте форматирования swap как файловой системы: Разделы подкачки используют `mkswap`, а не `mkfs`. Запуск `mkfs` на разделе подкачки уничтожает сигнатуру swap без создания пригодной файловой системы.
При управлении хранилищем на Панелях управления VPS дополнительные дисковые тома обычно отображаются как неотформатированные блочные устройства. Рабочий процесс всегда таков: определите с помощью `lsblk`, при необходимости разбейте на разделы с помощью `fdisk`/`gdisk`, отформатируйте с помощью `mkfs`, смонтируйте и сохраните в `/etc/fstab`.
Матрица решений: выбор правильной файловой системы
Используйте эту матрицу для выбора файловой системы на основе вашего основного требования:
| Основное требование | Рекомендуемая файловая система | Избегать |
|---|
| — | — | — |
|---|
| Универсальный Linux-сервер | ext4 | Btrfs (накладные расходы на сложность) |
|---|
| Большие файлы, базы данных, NFS | XFS | FAT32 (нет прав доступа) |
|---|
| Снимки, подтома, NAS | Btrfs | ext4 (нет нативных снимков) |
|---|
| Кросс-платформенные USB/съёмные носители | exFAT или FAT32 | ext4 (плохая поддержка Windows) |
|---|
| EFI System Partition | FAT32 (`mkfs.vfat -F 32`) | Любая не-FAT |
|---|
| NVMe SSD, интенсивная запись | F2FS или XFS | FAT32 |
|---|
| Том данных Windows при двойной загрузке | NTFS | ext4 |
|---|
| Миллионы маленьких файлов | ext4 с `-i 2048` | XFS (фиксированное количество инодов) |
|---|
Технический контрольный список ключевых выводов
Перед запуском `mkfs` в любой среде пройдите этот контрольный список:
- Подтвердите целевое устройство с помощью `lsblk -f` и `blkid` — никогда не полагайтесь на память или предположения
- Размонтируйте цель с помощью `umount /dev/sdXN` и проверьте с помощью `mount | grep sdX`
- Создайте резервную копию данных на устройстве; `mkfs` необратима
- Выберите тип файловой системы исходя из рабочей нагрузки (см. матрицу решений выше), а не привычки
- Задайте метку файловой системы с помощью `-L` для удобочитаемой идентификации в журналах и `fstab`
- Уменьшите зарезервированные блоки на больших томах данных (`-m 1` для ext4) для освобождения используемого пространства
- Отключите ленивую инициализацию (`-E lazy_itable_init=0`) на производственных серверах для предотвращения всплесков ввода-вывода после развёртывания
- Используйте UUID в `/etc/fstab`, а не имена устройств, для постоянства монтирования
- Проверьте с помощью `mount -a` после редактирования `/etc/fstab` для обнаружения ошибок перед перезагрузкой
- Запустите `e2fsck -n` или `xfs_repair -n` после форматирования для подтверждения целостности файловой системы
- Пересоздайте UUID на любом диске, клонированном из шаблонного образа
Часто задаваемые вопросы
В: Можно ли запустить `mkfs` на разделе, который в данный момент смонтирован?
О: Технически ядро может это разрешить, но это немедленно повреждает файловую систему и может вызвать панику ядра или потерю данных. Всегда сначала размонтируйте раздел и подтвердите с помощью `mount | grep <device>` перед запуском `mkfs`.
В: В чём разница между `mkfs.ext4` и `mke2fs`?
О: `mkfs.ext4` — это символическая ссылка или обёртка, которая вызывает `mke2fs` с настройками `-t ext4` по умолчанию. Они функционально идентичны. `mke2fs` является канонической утилитой и принимает полный набор параметров создания ext2/ext3/ext4.
В: Почему форматирование большого раздела ext4 занимает так много времени по сравнению с XFS?
О: ext4 инициализирует таблицу инодов для каждой группы блоков во время форматирования (если не установлен `lazy_itable_init=1`). На томе объёмом 4 TB это включает запись гигабайт обнулённых данных таблицы инодов. XFS откладывает инициализацию структур до времени выполнения, что позволяет `mkfs.xfs` завершиться за секунды независимо от размера тома.
В: Как изменить метку файловой системы после форматирования без переформатирования?
О: Для ext4 используйте `sudo tune2fs -L "NewLabel" /dev/sdb1`. Для XFS используйте `sudo xfs_admin -L "NewLabel" /dev/sdb1`. Для FAT32 используйте `sudo fatlabel /dev/sdb1 NEWLABEL`. Переименование не влияет на данные.
В: Безопасно ли использовать `mkfs` на логическом томе LVM?
О: Да. Логические тома LVM отображаются как блочные устройства (например, `/dev/mapper/vg0-lv_data` или `/dev/vg0/lv_data`) и обрабатываются `mkfs` идентично физическим разделам. Это стандартный рабочий процесс для производственного хранилища Linux: создайте логический том с помощью `lvcreate`, отформатируйте с помощью `mkfs`, смонтируйте и сохраните в `/etc/fstab`.
