====== Глава 4: Диски и файловые системы ====== Разделы являются более мелкими частями всего диска. В Linux они обозначаются цифрой после блочного устройства, поэтому у них есть такие имена, как /dev/sda1 и /dev/sdb3. Ядро представляет каждый раздел как блочное устройство, как представляло бы весь диск. Разделы определяются на небольшой области диска, называемой **таблицей разделов** (также **метка диска**). Следующий уровень разбиения на разделы - это **файловая система**, база данных файлов и каталогов, с которыми вы привыкли взаимодействовать в пользовательском пространстве. Файловая система находиться в разделе. Таким образом есть следующая иерархия: диск -> раздел -> ФС Для доступа к данным на диске ядро Linux и применяет систему слоев, показанную на рис.4.2 Подсистема SCSI и все остальное, описанное в разделе 3.6, представлены одним блоком. Обратите внимание: вы можете работать с диском как через 104 Глава 4. Диски и файловые системы файловую систему, так и непосредственно через дисковые устройства. {{:notes:howlinuxworks:pic_4.2.png|Рис.4.2: Схема ядра с доступом к диску}} ===== 4.1 Разбиение дисков на разделы ===== Таблица разделов - это набор данных о разделении блоков на диске. **Основные типы таблиц:** ^ Тип ^ Описание ^ | MBR | традиционная, с ограничением на 4 основных раздела | | GPT | современная, с уникальными идентификаторами (GUID) | **Инструменты:** * **parted** - текстовый, поддерживает MBR и GPT (используется для просмотра) * **fdisk** - традиционный, интерактивный (используется для создания/изменения) ==== 4.1.1 Просмотр таблицы разделов ==== # 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:** * MBR: нет столбца Name, традиционная нумерация разделов * GPT: поддержка произвольных имён разделов (myfirst, mysecond) === Основы MBR === **Структура разделов:** * **Основной** - обычный раздел (макс. 4 штуки в MBR) * **Расширенный** - контейнер для логических разделов * **Логический** - раздел внутри расширённого Пример: раздел 2 (расширённый) содержит раздел 5 (логический). **Примечание:** тип ФС в parted может отличаться от MBR-идентификатора (83 - Linux, 82 - swap). Для идентификаторов используйте: $ fdisk -l === Разделы LVM === Если видны разделы с флагом **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. Сам расширённый раздел игнорируется (важны логические разделы). ===== 4.1.2 Редактирование таблиц разделов ===== ==== Основные риски и предосторожности ==== Изменение таблицы разделов затрудняет восстановление данных. **Требует резервной копии** важных данных. Разделы не должны быть примонтированы во время изменений. ==== Выбор инструмента ==== ^ Утилита ^ Особенности ^ | fdisk | Создает таблицу в памяти, применяет изменения только при выходе. Один системный вызов ядру. | | parted | Применяет изменения сразу при выполнении команд. Сигнализирует ядру для каждого раздела отдельно. | | gparted | Графический интерфейс для parted. | ==== Отслеживание изменений (parted) ==== * **udevadm monitor --kernel** - показывает удаление/добавление устройств * **/proc/partitions** - полная информация о разделах * **/sys/block/device/** или **/dev** - измененные интерфейсы разделов ==== Принудительная перезагрузка таблицы разделов ==== Используйте команду для повторного чтения ядром таблицы разделов: # blockdev --rereadpt /dev/sdf ===== 4.1.3 Создание таблицы разделов ===== ==== Условия примера ==== * Диск: 4 ГБ (USB-флеш) * Таблица: MBR * Разделы: ext4 (200 МБ + 3.8 ГБ) * Устройство: /dev/sdd ==== Процесс с fdisk ==== # 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 ===== 4.1.4. Геометрия дисков и разделов ===== ==== Физическая структура жесткого диска ==== ^ Компонент ^ Описание ^ | Пластина | Вращающийся магнитный диск на шпинделе | | Головка | Считывает данные с пластины, прикреплена к коромыслу | | Коромысло | Движущийся рычаг для позиционирования головки | | Цилиндр | Фиксированный круг данных при одном положении головки | | Сектор | Доля цилиндра | | Дорожка | Часть цилиндра для одной головки | Адресация типа **CHS** (cylinder-head-sector) - старая схема. ==== CHS vs LBA ==== CHS - **Устаревшая**, значения на современных дисках неправдивы LBA - **Логическая блочная адресация**, номер блока (современный стандарт) Таблица разделов **MBR содержит оба формата**, но LBA игнорирует границы цилиндров. ==== Границы цилиндров больше не важны ==== Старые программы разбиения предупреждали о невыравнивании цилиндров. **Игнорируйте это предупреждение** - модернизированная логика LBA и новые утилиты гарантируют эффективное расположение разделов независимо от CHS границ. ===== 4.1.5 Чтение твердотельных дисков (SSD) ===== ==== Выравнивание разделов - критический фактор ==== SSD читают данные **страницами** (4096–8192 байт), начиная с границы, кратной размеру страницы. Невыравненный раздел требует **двух операций чтения вместо одной**. Современные утилиты выравнивают разделы по границе **1 МБ** (2048 блоков × 512 байт), что совместимо со всеми размерами страниц. ==== Проверка выравнивания раздела ==== $ cat /sys/block/sdf/sdf2/start 1953126 Результат - смещение в единицах (512 байт). Для проверки выравнивания раздела на 4096-байтовые страницы (8 секторов): * **Разделите порядковый номер раздела на 8** * Если делится **нацело** - раздел выравнен оптимально * Если **нацело не делится** - производительность снижена //Пример: 1953126 ÷ 8 = 244140.75 → не выравнен// ===== 4.2 Файловые системы ===== ФС - связующее звено между ядром и userspace'ом, позволяющее преобразования простого блочного устройства в сложную иерархию файлов и подкаталогов, понятную пользователям. Раньше ФС распологались только на дисках, однако древовидная структура каталогов и интерфейс ввода-вывода файловых систем довольно универсальны, поэтому файловые системы теперь выполняют множество задач, к примеру, роль системных интерфейсов, которые отображаются в каталогах в /sys и /proc. Уровень абстракции виртуальной файловой системы (Virtual File System, VFS) завершает реализацию файловой системы. Подобно тому как подсистема SCSI стандартизирует связь между различными типами устройств и командами управления ядром, VFS гарантирует, что все реализации файловой системы поддерживают стандартный интерфейс, чтобы приложения пользовательского пространства могли одинаково обращаться к файлам и каталогам. Поддержка VFS позволила Linux поддерживать чрезвычайно большое количество файловых систем. ==== 4.2.1 Типы файловых систем ==== * ext2 - традиционная FS Linux, вдохновленная Unix (UFS, FFS) * ext3 - добавила журналирование для целостности данных и ускорения загрузки * ext4 - текущая версия; поддерживает большие файлы и большое количество подкаталогов * Btrfs - новейшая FS Linux, расширяет возможности ext4 * XFS - высокопроизводительная FS; стандарт Red Hat Enterprise Linux 7.0+ * FAT/msdos - примитивная MS-DOS FS * VFAT - Microsoft FS для съемных носителей (до 4 ГБайт); стандарт для SD-карт и USB-накопителей * exFAT - Microsoft FS для больших файлов (4 ГБайт и более) * NTFS - продвинутая Windows FS * HFS+ - стандарт Apple для Macintosh * ISO9660 - стандарт CD-ROM ++++ Обратная совместимость ext| ext2 и ext3 монтируются как ext4, но ext4 не монтируется как ext2 или ext3. ++++ ==== 4.2.2 Создание файловой системы ==== Создание файловой системы - операция в пользовательском пространстве, прямой доступ к блочному устройству. === Утилита mkfs === **mkfs** - интерфейс для программ mkfs.fs (где fs - тип ФС): * Команда `mkfs -t ext4` запускает `mkfs.ext4` * **mkfs.ext4, mkfs.ext3, mkfs.ext2** - символические ссылки на **mke2fs** * **mkfs.vfat, mkfs.msdos** - ссылки на **mkdosfs** * **mkfs.ntfs** - ссылка на **mkntfs** Смотрите man-страницы конкретных утилит (например, **mke2fs(8)** для ext4). ++++подробнее| $ ls -l /sbin/mkfs.* -rwxr-xr-x 1 root root 17896 Mar 29 21:49 /sbin/mkfs.bfs -rwxr-xr-x 1 root root 30280 Mar 29 21:49 /sbin/mkfs.cramfs lrwxrwxrwx 1 root root 6 Mar 30 13:25 /sbin/mkfs.ext2 -> mke2fs lrwxrwxrwx 1 root root 6 Mar 30 13:25 /sbin/mkfs.ext3 -> mke2fs lrwxrwxrwx 1 root root 6 Mar 30 13:25 /sbin/mkfs.ext4 -> mke2fs lrwxrwxrwx 1 root root 6 Mar 30 13:25 /sbin/mkfs.ext4dev -> mke2fs -rwxr-xr-x 1 root root 26200 Mar 29 21:49 /sbin/mkfs.minix lrwxrwxrwx 1 root root 7 Dec 19 2011 /sbin/mkfs.msdos -> mkdosfs lrwxrwxrwx 1 root root 6 Mar 5 2012 /sbin/mkfs.ntfs -> mkntfs lrwxrwxrwx 1 root root 7 Dec 19 2011 /sbin/mkfs.vfat -> mkdosfs ++++ === Создание ФС === # mkfs -t ext4 /dev/sdf2 mkfs автоматически определяет количество блоков и устанавливает значения по умолчанию. **Не меняйте их без необходимости.** **Суперблок** - критический компонент ФС. mkfs создает несколько резервных копий. **Запишите номера резервных копий** - они понадобятся для восстановления при сбое диска. **ВНИМАНИЕ:** Создание ФС поверх существующей уничтожает все старые данные. Выполняйте только один раз на новый раздел. ==== 4.2.3 Монтирование файловой системы ==== Присоединение ФС к работающей системе. Ядро монтирует корневой каталог (/) при загрузке. === Требуемые параметры монтирования === * **Устройство** - раздел диска (/dev/sda1) или идентификатор ФС. Специальные ФС (proc, sysfs) не требуют * **Тип ФС** - ext4, vfat, ntfs и т.д. * **Точка монтирования** - обычный каталог в иерархии (/music, /home/extra и т.д.). Может быть в любом месте системы === Просмотр смонтированных ФС === $ 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 Можно демонтировать по устройству или точке монтирования. ==== 4.2.4 Идентификатор UUID файловой системы ==== Имена устройств могут изменяться в зависимости от порядка их обнаружения ядром. Решение - использование 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). ==== 4.2.5 Буферизация диска, кэширование и файловые системы ==== 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) автоматически определяют стиль. ==== 4.2.7 Повторное монтирование файловой системы ==== Чтобы изменить параметры монтирования смонтированной ФС, используйте опцию **remount**. Пример - переключение корневого раздела в режим чтения-записи: # mount -n -o remount / Параметр **-n** необходим, чтобы не обновлять /etc/mtab, когда / доступен только для чтения. Команда предполагает наличие устройства в /etc/fstab. ==== 4.2.8 Таблица файловой системы /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). ==== 4.2.9 Альтернативы файлу /etc/fstab ==== Вместо единого файла /etc/fstab возможны: * **/etc/fstab.d** - каталог с отдельными конфиг-файлами ФС * **systemd units** - конфигурация через systemd (часто генерируется из /etc/fstab) ==== 4.2.10 Емкость файловой системы ==== Используйте **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*). Только суперпользователь может использовать их - это защита от паники при переполнении диска. === Опции df === * **-h** - читаемый формат (K, M, G, T) * **-m** - в мегабайтах * **-k** - в килобайтах (по умолчанию) === Поиск крупных файлов === Команда **du** показывает использование диска по каталогам: du -s * # Итог для каждого элемента текущего каталога du -s # Итог для текущего каталога cd /; du # Весь диск (длинный список) ==== 4.2.11 Проверка и восстановление файловых систем ==== Файловые системы 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**. === Проверка ext3 и ext4 === Журнал обеспечивает целостность данных, поэтому ручная проверка обычно не требуется. Для сброса журнала: # e2fsck -fy /dev/disk_device Повреждённую ФС можно смонтировать в режиме ext2. === Наихудший случай === При серьезных проблемах: * **dd** - экстракция образа ФС на другой диск * Монтирование в read-only режиме и сохранение данных * **debugfs** - просмотр и копирование файлов (режим read-only по умолчанию) Команда **fsck -y** автоматически ответит на все вопросы (крайний случай). Если резервных копий нет - обратитесь к профессиональным сервисам восстановления данных. ==== 4.2.12 Файловые системы специального назначения ==== Не все ФС хранят данные на физических носителях. Многие служат системными интерфейсами, предоставляя информацию о процессах, ядре и оборудовании. Эта идея восходит к /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) | ===== 4.3 Область подкачки swap ===== Раздел диска используется не только для ФС, но и для расширения оперативной памяти. Система виртуальной памяти 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 = 2 × RAM - перемещение памяти неактивных пользователей * **Однопользовательские системы**: зависит от количества одновременно активных процессов * **Серверы с высокой нагрузкой**: swap минимален или отсутствует (избежать дисковых операций) **Частое обращение к swap** вызывает критическое падение производительности (диск медленнее памяти). **На компьютере общего назначения** swap необходима. Без неё при исчерпании памяти ядро запускает [[glossary:gnu_linux:oom_killer|OOM Killer]], убивая процессы. На серверах с мониторингом и балансировкой нагрузки это предотвращается архитектурно. Подробнее о виртуальной памяти - глава 8. ===== 4.4 Менеджер логических томов LVM ===== [[soft:lvm|Гайд по пользованию LVM]] Прямое управление разделами затруднено при изменении конфигурации после установки. Добавление диска требует переразбиения, переноса данных и перезагрузок. **LVM** (Logical Volume Manager) решает эту проблему добавлением слоя абстракции между физическими устройствами и файловыми системами. ==== Компоненты LVM ==== ^ Компонент ^ Описание ^ | **Physical Volume (PV)** | Физический блочный диск или раздел (/dev/sda1, /dev/sdb и т. д.) | | **Volume Group (VG)** | Общий пул, созданный из одного или нескольких PV | | **Logical Volume (LV)** | Виртуальный блочный диск, выделяемый из VG. На LV размещаются ФС или swap | Логические тома действуют аналогично разделам на физическом диске, но размещение управляет LVM, а не пользователь. ===== 4.6 Что находится внутри традиционной файловой системы ===== Традиционная ФС Unix состоит из двух компонентов: * **Пул блоков данных** - хранилище информации * **Система БД на основе inode** - управление пулом данных **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: это файл, доступ разрешен | **Специальные записи каталогов:** * ''.'' - текущий каталог (ссылка на себя) * ''..'' - родительский каталог (кроме корневого) {{:notes:howlinuxworks:pic_4.10.png|Структура дескрипторов файловой системы}} ==== 4.6.1 Сведения о дескрипторе и количество ссылок ==== Для просмотра дескриптора используйте ''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 ссылку в суперблоке. ==== 4.6.2 Распределение блоков ==== **Block bitmap** (битовая карта) - каждый бит = один блок: * 0 = свободен * 1 = используется Проблемы возникают при рассинхронизации дескрипторов и распределения блоков (некорректное выключение). Программа ''fsck'': # Проверяет и восстанавливает fsck /dev/device Процесс: сканирование таблицы дескрипторов → генерация новых счетчиков и битовой карты → сравнение с диском → исправление → «осиротевшие» файлы в ''lost+found''. ==== 4.6.3 Работа с файловыми системами в пользовательском пространстве ==== Процессы доступ получают через системные вызовы ядра (''stat()'' возвращает inode и счетчики). Данные доступны в основном для обратной совместимости. Не все ФС имеют inode: | Файловая система | Жесткие ссылки | Примечание | | ext4 | Да | Традиционная UNIX ФС | | VFAT | Нет | ''ln'' не работает | | VFS (абстракция) | Условно | Возвращает значения, не всегда значимые | Системные вызовы Linux обеспечивают достаточную абстракцию - знать о дескрипторах не обязательно. Поддержка ФС может быть в ядре или пользовательском пространстве (FUSE).