Любой жёсткий диск можно представить как огромный «чистый лист», на который можно записывать данные и откуда потом их можно считать. Чтобы ориентироваться на диске, всё его пространство разбивают на небольшие «клеточки» — сектора. Сектор — это минимальная единица хранения данных на диске, обычно его размер составляет 512 байт. Все сектора на диске нумеруются: каждый из n секторов получает номер от 0 до n–1. Благодаря этому любая информация, записанная на диск, получает точный адрес — номера соответствующих секторов. Так что диск ещё можно представить как очень длинную строчку (ленточку) из секторов. Можете посчитать, сколько секторов на вaшем диске размером в N гигабайт.
Представлять жёсткий диск как единый «лист» не всегда бывает удобно: иногда полезно «разрезать» его на несколько независимых листов, на каждом из которых можно писать и стирать что угодно, не опасаясь повредить написанное на других листах. Логичнее всего записывать раздельно данные большей и меньшей важности или просто относящиеся к разным вещам.
Конечно, над жёстким диском следует производить не физическое, а логическое разрезание, для этого вводится понятие раздел (partition). Вся последовательность (очень длинная ленточка) секторов разрезается на несколько частей, каждая часть становится отдельным разделом. Фактически, нам не придётся ничего разрезать (да и вряд ли бы это удалось), достаточно объявить, после каких секторов на диске находятся границы разделов.
Технически разбиение диска на разделы организовано следующим образом: заранее определённая часть диска отводится под таблицу разделов, в которой и написано, как разбит диск. Стандартная таблица разделов для диска IBM-совместимого компьютера — HDPT (Hard Disk Partition Table) — располагается в конце самого первого сектора диска, после предзагрузчика (Master Boot Record, MBR) и состоит из четырёх записей вида «тип начало конец», по одной на каждый раздел. Начало и конец — это номера тех секторов диска, где начинается и заканчивается раздел. С помощью такой таблицы диск можно поделить на четыре или меньше разделов: если раздела нет, тип устанавливается в 0
.
Однако четырёх разделов редко когда бывает достаточно. Куда же помещать дополнительные поля таблицы разбиения? Создатели IBM PC предложили универсальный способ: один из четырёх основных разделов объявляется расширенным (extended partition); он, как правило, является последним и занимает всё оставшееся пространство диска.
Расширенный раздел можно разбить на подразделы тем же способом, что и весь диск: в самом начале — на этот раз не диска, а самого раздела — заводится таблица разделов, с записями для четырёх разделов, которые снова можно использовать, причём один из подразделов может быть, опять-таки, расширенным, со своими подразделами и т. д.
Разделы, упомянутые в таблице разделов диска, принято называть основными (primary partition), а все подразделы расширенных разделов — дополнительными (secondary partition). Так что основных разделов может быть не более четырёх, а дополнительных — сколько угодно.
Чтобы не усложнять эту схему, при разметке диска соблюдают два правила: во-первых, расширенных разделов в таблице разбиения диска может быть не более одного, а во-вторых, таблица разбиения расширенного раздела может содержать либо одну запись — описание дополнительного раздела, либо две — описание дополнительного раздела и описание вложенного расширенного раздела.
В таблице разделов для каждого раздела указывается тип, который определяет файловую систему, которая будет содержаться в этом разделе. Каждая операционная система распознаёт определённые типы и не распознаёт другие, и, соответственно, откажется работать с разделом неизвестного типа.
Подробнее о файловых системах см. раздел Типы файловых систем.
Работая с разделами, нужно учитывать, что производимые над ними действия связаны непосредственно с разметкой жёсткого диска. С одной стороны, разбиение на разделы — это наиболее традиционный для PC способ логической организации дискового пространства. Однако если в процессе работы появится потребность изменить логику разбиения диска или размеры областей (т. е. когда возникает задача масштабирования), работа с разделами не очень эффективна.
Например, при необходимости создать новый раздел или увеличить размер существующего, можно столкнуться с рядом трудностей, связанных с ограничением количества дополнительных разделов или перераспределением данных. Избежать их очень просто: нужно лишь отказаться от «привязки» данных к определённой области жёсткого диска. В Linux эта возможность реализуется при помощи менеджера логических томов (LVM — Logical Volume Manager). LVM организует дополнительный уровень абстракции между разделами с одной стороны и хранящимися на них данными с другой, выстраивая собственную иерархическую структуру.
Дисковые разделы (в терминологии LVM — физические тома) объединяются в группу томов, внутри которой создаются логические тома. Таким образом, группа томов выстраивает соответствие между физическим и логическим пространством диска.
Технологически это организуется следующим образом. Физические тома разбиваются на отдельные блоки — физические экстенты, которые объединяются в группу томов. Логические тома разбиваются на блоки такого же размера — логические экстенты. В разных группах томов размер экстента может быть различным.
Отношения между логическими и физическими томами представлены в виде отображения логических экстентов в физические. Возможны два способа отображения — линейное и расслоенное (striped). В первом случае логические экстенты располагаются последовательно соответственно физическим, во втором поочередно распределяются между несколькими физическими томами.
В свою очередь, между логическим томом и группой томов возникают отношения, аналогичные таковым между разделом и жёстким диском, с отличием в уровне абстракции и, соответственно, колоссальной разнице в гибкости манипуляции. Поскольку раздел — конкретная область физического диска между двумя определёнными секторами, а том — логическая категория, принимаемая для удобства использования дискового пространства, производить манипуляции со вторым значительно проще. Можно свободно перераспределять логические тома внутри группы, изменять их размер, увеличивать размер группы томов за счёт внесения в неё нового раздела (только при линейном отображении) и многое другое.
Иногда обычной производительности жёсткого диска может не хватать. В случаях, когда во главу угла ставится скорость работы с данными (скорость записи и чтения) или надёжность их хранения, используется технология RAID (Redundant array of independent disks — избыточный массив независимых дисков). Технология RAID позволяет объединять несколько физических дисковых устройств (жёстких дисков или разделов на них) в дисковый массив. Диски, входящие в массив, управляются централизованно и представлены в системе как одно логическое устройство, подходящее для организации на нем единой файловой системы.
Существует два способа реализации RAID: аппаратный и программный. Аппаратный дисковый массив состоит из нескольких жёстких дисков, управляемых при помощи специальной платы контроллера RAID-массива. Программный RAID в Linux-системах (Linux Software RAID) реализуется при помощи специального драйвера (Multiple Device driver — драйвер MD-устройства). В программный массив организуются дисковые разделы, которые могут занимать как весь диск, так и его часть, а управление осуществляется посредством специальных утилит (mdadm
).
Программные RAID-массивы, как правило, менее надежны, чем аппаратные, но обеспечивают более высокую скорость работы с данными (производительность процессора и системной шины обычно намного выше, чем у любого дискового контроллера). Также их преимущество по сравнению с аппаратными массивами: независимость от форматов данных на диске и как следствие — большая совместимость с различными типами и размерами дисков и их разделов. Использование программного RAID также позволяет сэкономить на покупке дополнительного оборудования. Однако обратной стороной медали станет увеличение нагрузки на процессор и системную шину, это следует иметь в виду, принимая решение об использовании программного RAID.
Существует несколько разновидностей RAID-массивов, так называемых уровней. В Linux поддерживаются следующие уровни программных RAID-массивов.
RAID0
Для создания массива этого уровня понадобится как минимум два диска одинакового размера. Запись осуществляется по принципу чередования: данные делятся на чанки (chunk) — порции данных одинакового размера, и поочерёдно распределяются по всем дискам, входящим в массив. Поскольку запись ведётся на все диски, при отказе одного из них будут утрачены все хранившиеся на массиве данные. Это цена выбора в пользу увеличения скорости работы с данными: запись и чтение на разных дисках происходит параллельно и, соответственно, быстрее.
RAID1
Массивы этого уровня построены по принципу зеркалирования, при котором все данные, записанные на одном диске, дублируются на другом. Для создания такого массива потребуется два или более дисков одинакового размера. Избыточность обеспечивает отказоустойчивость массива: в случае выхода из строя одного из дисков, данные на другом остаются неповреждёнными. Расплата за надёжность — фактическое сокращение дискового пространства вдвое. Скорость чтения и записи остается на уровне обычного жесткого диска.
RAID4
В массивах RAID4 реализован принцип чётности, объединяющий технологии чередования и зеркалирования. Один из трёх (или из большего числа) дисков задействуется для хранения информации о чётности в виде суперблоков с контрольными суммами блоков данных, последовательно распределённых на остальных дисках (как в RAID0). Достоинства этого уровня — отказоустойчивость уровня RAID1 при меньшей избыточности (из скольких бы дисков не состоял массив, под контрольную информацию задействуется лишь один из них). При отказе одного из дисков утраченные данные можно будет восстановить из контрольных суперблоков, причем, если в составе массива есть резервный диск, реконстукция данных начнется автоматически. Очевидным недостатком, однако, является снижение скорости записи, поскольку информацию о чётности приходится высчитывать при каждой новой записи на диск.
RAID5
Этот уровень аналогичен RAID4, за тем исключением, что суперблоки с информацией о чётности располагаются не на отдельном диске, а равномерно распределяются по всем дискам массива вместе с блоками данных. Как результат — повышение скорости работы с данными и высокая отказоустойчивость.
Массивы всех уровней помимо блоков данных и суперблоков с контрольными суммами могут также содержать специальный суперблок (persistent superblock), который располагается в начале всех дисков массива и содержит информацию о конфигурации MD-устройства. Наличие отдельного суперблока позволяет ядру операционной системы получать информацию о конфигурации устройства RAID прямо с дисков, а не из конфигурационного файла, что может быть полезным, если файл по каким-то причинам перестанет быть доступным. Кроме того, наличие отдельного суперблока — необходимое условие автоопределения RAID-устройств при загрузке системы.
Более подробную информацию можно найти в документации и статьях, посвящённых RAID:
(русский перевод:
http://www.opennet.ru/docs/HOWTO-RU/Software-RAID-HOWTO.html
)