Разделы являются более мелкими частями всего диска. В Linux они обозначаются цифрой после блочного устройства, поэтому у них есть такие имена, как /dev/sda1 и /dev/sdb3. Ядро представляет каждый раздел как блочное устройство, как представляло бы весь диск. Разделы определяются на небольшой области диска, называемой таблицей разделов (также метка диска).
Следующий уровень разбиения на разделы - это файловая система, база данных файлов и каталогов, с которыми вы привыкли взаимодействовать в пользовательском пространстве. Файловая система находиться в разделе. Таким образом есть следующая иерархия: диск → раздел → ФС
Для доступа к данным на диске ядро Linux и применяет систему слоев, показанную на рис.4.2 Подсистема SCSI и все остальное, описанное в разделе 3.6, представлены одним блоком. Обратите внимание: вы можете работать с диском как через 104 Глава 4. Диски и файловые системы файловую систему, так и непосредственно через дисковые устройства.
Таблица разделов - это набор данных о разделении блоков на диске.
Основные типы таблиц:
| Тип | Описание |
|---|---|
| MBR | традиционная, с ограничением на 4 основных раздела |
| GPT | современная, с уникальными идентификаторами (GUID) |
Инструменты:
# parted -l
Пример вывода:
# parted -l Model: ATA KINGSTON SM2280S (scsi) Disk /dev/sda: 240GB ❶ Sector size (logical/physical): 512B/512B Partition Table: msdos Disk Flags: Number Start End Size Type File system Flags 1 1049kB 223GB 223GB primary ext4 boot 2 223GB 240GB 17.0GB extended 5 223GB 240GB 17.0GB logical linux-swap(v1) 106 Глава 4. Диски и файловые системы Model: Generic Flash Disk (scsi) Disk /dev/sdf: 4284MB ❷ Sector size (logical/physical): 512B/512B Partition Table: gpt Disk Flags: Number Start End Size File system Name Flags 1 1049kB 1050MB 1049MB myfirst 2 1050MB 4284MB 3235MB mysecond
Различия MBR и GPT:
Структура разделов:
Пример: раздел 2 (расширённый) содержит раздел 5 (логический).
Примечание: тип ФС в parted может отличаться от MBR-идентификатора (83 - Linux, 82 - swap). Для идентификаторов используйте:
$ fdisk -l
Если видны разделы с флагом lvm (код 8e) или устройства /dev/dm-* - система использует менеджер LVM. Вместо прямого разделения диска используется слой абстракции (подробнее в разделе 4.4).
Пример вывода в системе с LVM:
# parted -l Model: ATA VBOX HARDDISK (scsi) Disk /dev/sda: 10.7GB Partition Table: msdos Number Start End Size Type File system Flags 1 1049kB 10.7GB 10.7GB primary boot, lvm Model: Linux device-mapper (linear) (dm) Disk /dev/mapper/ubuntu--vg-root: 9672MB Partition Table: loop Number Start End Size File system Flags 1 0.00B 9672MB 9672MB ext4
Логические разделы LVM отделены от таблицы разделов и отображаются как отдельные «диски» (/dev/mapper/\*).
При загрузке ядро читает таблицу MBR и выводит отладку (просмотр: `journalctl -k`):
sda: sda1 sda2 < sda5 >
Обозначение sda2 < sda5 > указывает, что /dev/sda2 - расширённый раздел, содержащий логический /dev/sda5. Сам расширённый раздел игнорируется (важны логические разделы).
Изменение таблицы разделов затрудняет восстановление данных. Требует резервной копии важных данных. Разделы не должны быть примонтированы во время изменений.
| Утилита | Особенности |
|---|---|
| fdisk | Создает таблицу в памяти, применяет изменения только при выходе. Один системный вызов ядру. |
| parted | Применяет изменения сразу при выполнении команд. Сигнализирует ядру для каждого раздела отдельно. |
| gparted | Графический интерфейс для parted. |
Используйте команду для повторного чтения ядром таблицы разделов:
# blockdev --rereadpt /dev/sdf
# fdisk /dev/sdd
Просмотр таблицы:
Command (m for help): p
Удаление существующего раздела:
Command (m for help): d Selected partition 1
Создание первого раздела (200 МБ):
Command (m for help): n Partition type: p (primary) Partition number: 1 First sector: 2048 (default) Last sector: +200M
Создание второго раздела (остаток): Используйте все значения по умолчанию (команда `n`, затем Enter для всех параметров).
Просмотр результата:
Command (m for help): p Device Boot Start End Sectors Size Id Type /dev/sdd1 2048 411647 409600 200M 83 Linux /dev/sdd2 411648 8368127 7956480 3.8G 83 Linux
Сохранение таблицы:
Command (m for help): w
Просмотрите логи ядра (только для fdisk):
journalctl -k
| Компонент | Описание |
|---|---|
| Пластина | Вращающийся магнитный диск на шпинделе |
| Головка | Считывает данные с пластины, прикреплена к коромыслу |
| Коромысло | Движущийся рычаг для позиционирования головки |
| Цилиндр | Фиксированный круг данных при одном положении головки |
| Сектор | Доля цилиндра |
| Дорожка | Часть цилиндра для одной головки |
Адресация типа CHS (cylinder-head-sector) - старая схема.
CHS - Устаревшая, значения на современных дисках неправдивы
LBA - Логическая блочная адресация, номер блока (современный стандарт)
Таблица разделов MBR содержит оба формата, но LBA игнорирует границы цилиндров.
Старые программы разбиения предупреждали о невыравнивании цилиндров. Игнорируйте это предупреждение - модернизированная логика LBA и новые утилиты гарантируют эффективное расположение разделов независимо от CHS границ.
SSD читают данные страницами (4096–8192 байт), начиная с границы, кратной размеру страницы. Невыравненный раздел требует двух операций чтения вместо одной.
Современные утилиты выравнивают разделы по границе 1 МБ (2048 блоков × 512 байт), что совместимо со всеми размерами страниц.
$ cat /sys/block/sdf/sdf2/start 1953126
Результат - смещение в единицах (512 байт). Для проверки выравнивания раздела на 4096-байтовые страницы (8 секторов):
Пример: 1953126 ÷ 8 = 244140.75 → не выравнен
ФС - связующее звено между ядром и userspace'ом, позволяющее преобразования простого блочного устройства в сложную иерархию файлов и подкаталогов, понятную пользователям.
Раньше ФС распологались только на дисках, однако древовидная структура каталогов и интерфейс ввода-вывода файловых систем довольно универсальны, поэтому файловые системы теперь выполняют множество задач, к примеру, роль системных интерфейсов, которые отображаются в каталогах в /sys и /proc.
Уровень абстракции виртуальной файловой системы (Virtual File System, VFS) завершает реализацию файловой системы. Подобно тому как подсистема SCSI стандартизирует связь между различными типами устройств и командами управления ядром, VFS гарантирует, что все реализации файловой системы поддерживают стандартный интерфейс, чтобы приложения пользовательского пространства могли одинаково обращаться к файлам и каталогам. Поддержка VFS позволила Linux поддерживать чрезвычайно большое количество файловых систем.
Создание файловой системы - операция в пользовательском пространстве, прямой доступ к блочному устройству.
mkfs - интерфейс для программ mkfs.fs (где fs - тип ФС):
Смотрите man-страницы конкретных утилит (например, mke2fs(8) для ext4).
# mkfs -t ext4 /dev/sdf2
mkfs автоматически определяет количество блоков и устанавливает значения по умолчанию. Не меняйте их без необходимости.
Суперблок - критический компонент ФС. mkfs создает несколько резервных копий. Запишите номера резервных копий - они понадобятся для восстановления при сбое диска.
ВНИМАНИЕ: Создание ФС поверх существующей уничтожает все старые данные. Выполняйте только один раз на новый раздел.
Присоединение ФС к работающей системе. Ядро монтирует корневой каталог (/) при загрузке.
$ mount /dev/sda1 on / type ext4 (rw,errors=remount-ro) proc on /proc type proc (rw,noexec,nosuid,nodev) sysfs on /sys type sysfs (rw,noexec,nosuid,nodev) tmpfs on /run type tmpfs (rw,noexec,nosuid,size=10%,mode=0755)
| Элемент | Пример | Описание |
| Устройство | /dev/sda1 | Может быть нереальным (proc, sysfs) |
| on | on | Разделитель |
| Точка монтирования | / | Путь в системе |
| type | type | Разделитель |
| Тип ФС | ext4 | Идентификатор |
| Параметры | (rw,errors=remount-ro) | Опции монтирования (см. 4.2.6) |
Монтировать:
# mount -t ext4 /dev/sdf2 /home/extra
Параметр `-t` обычно опционален, но требуется для различения похожих типов (например, FAT-варианты).
Демонтировать:
# umount /home/extra
Можно демонтировать по устройству или точке монтирования.
Имена устройств могут изменяться в зависимости от порядка их обнаружения ядром. Решение - использование UUID (Universally Unique Identifier) для идентификации и монтирования файловых систем. UUID генерируют программы создания файловых систем, такие как mke2fs.
Для просмотра список устройств, их файловых систем и UUID используйте blkid:
# blkid /dev/sdf2: UUID="b600fe63-d2e9-461c-a5cd-d3b373a5e1d2" TYPE="ext4" /dev/sda1: UUID="17f12d53-c3d7-4ab3-943e-a0a72366c9fa" TYPE="ext4" PARTUUID="c9a5ebb0-01" /dev/sda5: UUID="b600fe63-d2e9-461c-a5cd-d3b373a5e1d2" TYPE="swap" PARTUUID="c9a5ebb0-05" /dev/sde1: UUID="4859-EFEA" TYPE="vfat"
Раздел FAT имеет серийный номер тома вместо UUID.
Монтирование по UUID:
# mount UUID=b600fe63-d2e9-461c-a5cd-d3b373a5e1d2 /home/extra
UUID предпочтителен для автоматического монтирования в /etc/fstab при загрузке и используется дистрибутивами для съемных носителей. Ubuntu монтирует FAT-раздел в /media/user/4859-EFEA.
Изменить UUID можно через tune2fs(8) (для ext2/ext3/ext4).
Linux буферизует запись на диск: ядро сохраняет изменения в RAM и записывает их на диск в подходящий момент. Это невидимо пользователю и повышает производительность.
Команда umount автоматически синхронизирует буфер с диском. Команда sync принудительно синхронизирует все диски. Выполните sync перед выключением, если не можете размонтировать файловую систему.
Ядро кэширует прочитанные блоки в RAM, предотвращая повторные обращения к диску при повторном доступе к файлам.
Параметры монтирования изменяют поведение команды mount. Делятся на две категории: общие (работают со всеми ФС) и специфичные для конкретной ФС.
| Параметр | Описание |
|---|---|
| -r | Монтировать в режиме только для чтения |
| -n | Не обновлять /etc/mtab (критично при загрузке) |
| -t | Указать тип файловой системы |
Активируются через -o с ключевыми словами, разделенными запятыми:
# mount -t vfat /dev/sde1 /dos -o ro,uid=1000
| Параметр | Описание |
|---|---|
| exec/noexec | Разрешить/запретить выполнение программ |
| suid/nosuid | Разрешить/запретить setuid |
| ro | Режим только для чтения |
| rw | Режим чтения-записи |
Примечание: Unix использует \n для конца строки, DOS - \r\n. Текстовые редакторы (vim) автоматически определяют стиль.
Чтобы изменить параметры монтирования смонтированной ФС, используйте опцию remount. Пример - переключение корневого раздела в режим чтения-записи:
# mount -n -o remount /
Параметр -n необходим, чтобы не обновлять /etc/mtab, когда / доступен только для чтения. Команда предполагает наличие устройства в /etc/fstab.
Постоянный список ФС для автоматического монтирования при загрузке хранится в /etc/fstab:
UUID=70ccd6e7-6ae6-44f6-812c-51aab8036d29 / ext4 errors=remount-ro 0 1 UUID=592dcfd1-58da-4769-9ea8-5f412a896980 none swap sw 0 0 /dev/sr0 /cdrom iso9660 ro,user,nosuid,noauto 0 0
| Поле | Описание |
|---|---|
| Устройство/UUID | Идентификатор ФС (UUID предпочтителен) |
| Точка монтирования | Куда присоединить ФС |
| Тип ФС | ext4, swap, iso9660 и т.д. |
| Параметры | Опции через запятую |
| Dump | Всегда 0 (dump устаревшая) |
| fsck порядок | 1 для /, 2 для других локальных ФС, 0 для остальных |
| Параметр | Назначение |
|---|---|
| defaults | Стандартные опции (rw, dev, exec, suid) |
| errors | Поведение при ошибках ext2/3/4: continue, remount-ro, panic |
| noauto | Исключить из mount -a (для съемных носителей) |
| user | Позволить обычным пользователям монтировать (автоматически добавляет nosuid, noexec, nodev) |
Монтирование через ярлык: mount /cdrom (если ФС в fstab).
Монтирование всех ФС: mount -a (кроме помеченных noauto).
Вместо единого файла /etc/fstab возможны:
Используйте df для просмотра размера и использования смонтированных ФС:
$ df Filesystem 1K-blocks Used Available Use% Mounted on /dev/sda1 214234312 127989560 75339204 63% / /dev/sdd2 3043836 4632 2864872 1% /media/user/uuid
| Поле | Описание |
|---|---|
| Filesystem | Устройство |
| 1K-blocks | Общая емкость в 1024-байтных блоках |
| Used | Занято |
| Available | Свободно |
| Use% | Процент использования |
| Mounted on | Точка монтирования |
Команда df dir ограничивает вывод ФС конкретного каталога.
Разница между используемым и свободным пространством объясняется зарезервированными блоками (~5% на ext*). Только суперпользователь может использовать их - это защита от паники при переполнении диска.
Команда du показывает использование диска по каталогам:
du -s * # Итог для каждого элемента текущего каталога du -s # Итог для текущего каталога cd /; du # Весь диск (длинный список)
Файловые системы Unix требуют периодической проверки на ошибки, возникающие из-за физических проблем оборудования и некорректного выключения системы (отключение питания). При неправильном отключении кэш ФС в памяти может не совпадать с данными на диске. Несмотря на поддержку журналирования, правильное завершение системы критично.
fsck - инструмент для проверки ФС. Для каждого типа ФС существует своя версия (e2fsck для ext2/ext3/ext4 распознается автоматически).
# fsck /dev/sdb1
Никогда не используйте fsck на смонтированной ФС - ядро может модифицировать данные, вызывая несоответствия и сбои. Исключение: корневой раздел в режиме read-only в однопользовательском режиме.
| Проход | Описание |
|---|---|
| Pass 1 | Проверка inodes, блоков и размеров |
| Pass 2 | Проверка структуры каталогов |
| Pass 3 | Проверка связанности каталогов |
| Pass 4 | Проверка счетчиков ссылок |
| Pass 5 | Проверка сводной информации групп |
При ошибках fsck останавливается и запрашивает разрешение на исправление. Потерянные файлы размещаются в lost+found с номером в качестве имени.
Параметр -p (или -a) автоматически исправляет типичные ошибки без запроса. Дистрибутивы Linux используют fsck -p при загрузке.
При подозрении на серьезные ошибки используйте fsck -n для проверки без изменений. Если проблема с суперблоком: fsck -b num - восстановление из резервной копии. Для просмотра номеров резервных суперблоков: mkfs -n /dev/device.
Журнал обеспечивает целостность данных, поэтому ручная проверка обычно не требуется. Для сброса журнала:
# e2fsck -fy /dev/disk_device
Повреждённую ФС можно смонтировать в режиме ext2.
При серьезных проблемах:
Команда fsck -y автоматически ответит на все вопросы (крайний случай).
Если резервных копий нет - обратитесь к профессиональным сервисам восстановления данных.
Не все ФС хранят данные на физических носителях. Многие служат системными интерфейсами, предоставляя информацию о процессах, ядре и оборудовании. Эта идея восходит к /dev и /proc механизмам Unix.
| ФС | Точка монтирования | Назначение |
|---|---|---|
| proc | /proc | Информация о процессах и ядре. Нумерованные каталоги соответствуют PID, /proc/self - текущему процессу. Содержит /proc/cpuinfo и прочие данные оборудования (передаются в /sys) |
| sysfs | /sys | Системная информация устройств (см. глава 3) |
| tmpfs | /run и др. | Временное хранилище в памяти и swap. Параметры: size, nr_blocks. Осторожно: переполнение памяти вызовет сбои |
| squashfs | /snap и др. | Read-only ФС со сжатым содержимым, извлекаемым по требованию. Используется snap-пакетами |
| overlay | контейнеры | Объединяет каталоги в составную систему. Применяется в контейнеризации (глава 17) |
Раздел диска используется не только для ФС, но и для расширения оперативной памяти. Система виртуальной памяти Linux автоматически перемещает неактивные страницы памяти на диск (подкачка). Область диска для этого называется swap (подкачка).
Просмотр использования swap:
$ free total used free Swap: 514072 189804 324268
| Шаг | Команда | Описание |
|---|---|---|
| 1 | - | Убедиться, что раздел пуст |
| 2 | mkswap /dev/xxx | Поместить сигнатуру swap на раздел |
| 3 | swapon /dev/xxx | Активировать область в ядре |
Для автоматической активации при загрузке добавьте в /etc/fstab:
/dev/sda5 none swap sw 0 0
Или с UUID:
UUID=xxxx-xxxx none swap sw 0 0
При необходимости используйте обычный файл вместо раздела:
# dd if=/dev/zero of=swap_file bs=1024k count=num_mb # mkswap swap_file # swapon swap_file
Для деактивации используйте swapoff (требуется свободная память в других областях).
Классическое правило: swap = 2 × RAM. Однако это зависит от использования:
Частое обращение к swap вызывает критическое падение производительности (диск медленнее памяти).
На компьютере общего назначения swap необходима. Без неё при исчерпании памяти ядро запускает OOM Killer, убивая процессы. На серверах с мониторингом и балансировкой нагрузки это предотвращается архитектурно.
Подробнее о виртуальной памяти - глава 8.
Прямое управление разделами затруднено при изменении конфигурации после установки. Добавление диска требует переразбиения, переноса данных и перезагрузок. LVM (Logical Volume Manager) решает эту проблему добавлением слоя абстракции между физическими устройствами и файловыми системами.
| Компонент | Описание |
|---|---|
| Physical Volume (PV) | Физический блочный диск или раздел (/dev/sda1, /dev/sdb и т. д.) |
| Volume Group (VG) | Общий пул, созданный из одного или нескольких PV |
| Logical Volume (LV) | Виртуальный блочный диск, выделяемый из VG. На LV размещаются ФС или swap |
Логические тома действуют аналогично разделам на физическом диске, но размещение управляет LVM, а не пользователь.
Традиционная ФС Unix состоит из двух компонентов:
inode - структура данных, описывающая файл: тип, права доступа, расположение в пуле. Идентифицируются номерами в таблице inode.
Каталоги - тоже inode, содержащие список имен файлов и ссылки на другие inode.
Пример структуры:
mkdir dir_1 dir_2 echo a > dir_1/file_1 echo b > dir_1/file_2 echo c > dir_1/file_3 echo d > dir_2/file_4 ln dir_1/file_3 dir_2/file_5 # жесткая ссылка
Разрешение пути (например dir_1/file_2):
| Шаг | Действие |
|---|---|
| 1 | Парсинг пути: компоненты dir_1 и file_2 |
| 2 | Переход по корневому inode (2) к данным каталога |
| 3 | Поиск dir_1 в inode 2 → указывает на inode 12 |
| 4 | Проверка inode 12: это каталог |
| 5 | Переход по inode 12 к его данным каталога |
| 6 | Поиск file_2 в inode 12 → указывает на inode 14 |
| 7 | Проверка inode 14: это файл, доступ разрешен |
Специальные записи каталогов:
. - текущий каталог (ссылка на себя).. - родительский каталог (кроме корневого)
Для просмотра дескриптора используйте ls -i или stat.
Link count - общее количество записей каталога, указывающих на дескриптор.
| Операция | Действие |
| Создание файла | Новая запись каталога + новый дескриптор |
| Жесткая ссылка | Вручную созданная запись на существующий дескриптор (ln без -s) |
| Удаление файла | Удаление ссылки: счетчик −1, при 0 дескриптор удаляется |
При удалении rm file: ядро находит запись каталога, уменьшает счетчик. Если rm dir_1/file_3, счетчик inode 15 = 2→1 (т.к. dir_2/file_5 еще указывает на него) - дескриптор остается.
Для каталогов: счетчик включает саму папку (.), родительскую (..) и все подкаталоги. Корневой inode имеет +1 ссылку в суперблоке.
Block bitmap (битовая карта) - каждый бит = один блок:
Проблемы возникают при рассинхронизации дескрипторов и распределения блоков (некорректное выключение). Программа fsck:
# Проверяет и восстанавливает fsck /dev/device
Процесс: сканирование таблицы дескрипторов → генерация новых счетчиков и битовой карты → сравнение с диском → исправление → «осиротевшие» файлы в lost+found.
Процессы доступ получают через системные вызовы ядра (stat() возвращает inode и счетчики).
Данные доступны в основном для обратной совместимости. Не все ФС имеют inode:
| Файловая система | Жесткие ссылки | Примечание |
| ext4 | Да | Традиционная UNIX ФС |
| VFAT | Нет | ln не работает |
| VFS (абстракция) | Условно | Возвращает значения, не всегда значимые |
Системные вызовы Linux обеспечивают достаточную абстракцию - знать о дескрипторах не обязательно. Поддержка ФС может быть в ядре или пользовательском пространстве (FUSE).