Введение в “геометрию”

Ответ на вопрос что разбивать? на первый взгляд очевиден: конечно же, диск (или диски, если их в машине более одного). Однако, чтобы использовать его в ответах на два оставшихся вопроса, придётся рассмотреть, как устроены диски (и вообще накопители аналогичного назначения) с точки зрения системы.

Начнём с "геометрии" дисков. Слово это я заключил в кавычки не случайно. Дело в том, что с тех пор, как объем дисков перевалил за 500 с небольшим мегабайт (ограничение старых BIOS персональных, ранее именовавшихся IBM-совместимыми, компьютеров), с реальной их геометрией пользователь никогда не сталкивается. Специальный софт, прошитый в дисковой электронике (т.н. firmware), преобразует её к виду, доступному восприятию BIOS -- на деталях, как именно это делается, останавливаться не буду за некомпетентностью (да и вряд ли кто, кроме производителей дисков, эти детали знает хорошо).

А доступная BIOS геометрия диска описывается в терминах цилиндр/головка/сектор (cylinders/heads/sectors, C/H/S). Фигурально говоря (а, повторяю, все, относящееся к дисковой геометрии, ныне следует понимать исключительно фигурально, аллегорически или метафорически), головки считывают информацию с концентрических магнитных дорожек (tracks), на которые поделена каждая дисковая пластина. Вертикальная совокупность треков с одинаковыми номерами на всех пластинах, составляющих диск как физическое устройство, и образует цилиндр. А сектора нарезают пластину, вместе с её треками, на радиальные фрагменты, именуемые блоками. То есть это можно представить себе таким образом, что блок лежит на пересечении (в пространстве) цилиндра, трека и сектора.

Число треков и секторов в современных дисках обычно фиксировано (вернее, предстаёт таковым в BIOS): 255 треков нарезается на 63 сектора каждый, что в совокупности дает 16065 блоков на цилиндр. А количество цилиндров определяется объёмом диска. Важно здесь только то, что головки диска механически двигаются синхронно по поверхности всех пластин. То есть если на одной пластине информация считывается с 1-го трека, то и все прочие головки перемещаются на ту же дорожку -- каждая на своей пластине. И, соответственно, считывание или запись взаимосвязанных данных в пределах одного цилиндра или нескольких соседних происходит быстрее, чем нежели они были бы разнесены на цилиндры, далеко отстоящие друг от друга.

Повторяю, всё это условно -- хотя бы потому, что понятие цилиндра в геометрическом смысле слова очень трудно применить к современным дискам, часто не то что однопластинным, а даже, если так можно выразиться, полупластинным (то есть только с одной задействованной стороной единственной пластины).

Ещё менее буквально понятие "геометрии" применимо к входящим ныне в массовый обиход твердотельным накопителям SSD (Solid State Drive), по определению не имеющим ни пластин, ни головок, ни прочей механики. Тем не менее, они предстают перед системой точно в том же виде, как и обычные винчестеры. Что относится и к самым обычным флэшкам.

Впрочем, разбираться с этой "алгеброй" с "геометрией" -- не наше собачье дело, на то существуют firmware и BIOS. Для нас же интересны именно метафорические цилиндры -- совокупность треков, к которым осуществляется синхронный доступ, и столь же аллегорические блоки -- минимальные кванты дискового пространства.

Образующие цилиндры треки создаются при первичной заводской разметке диска -- т.н. низкоуровневом форматировании. Из сказанного выше очевидно, что доступ к данным в пределах одного цилиндра или группы соседних будет выполнен быстрее, чем к данным, записанным частично на первый и, скажем, на последний цилиндр диска. Этот случай не столь уж невероятен, как может показаться: в файловой системе FAT, идущей со времён "чёрного" DOS'а, где пространство, занятое стёртыми файлами, помечается как неиспользуемое, но реально перезаписывается только тогда, когда по настоящему свободное место на диске вообще исчерпано, такая ситуация вполне могла бы возникнуть.

Так вот, чтобы свести к минимуму вероятность разнесения данных по разобщённым цилиндрам, и придуманы были дисковые разделы (вернее, в том числе и для этого -- выделение дисковых разделов преследует множество других целей). Именно таким образом в единый массив для размещения данных объединяется группа смежных цилиндров.

Где кончается один раздел и начинается другой? Резонные люди из Одессы сказали бы, что один раздел кончается именно там, где начинается второй. Однако для нас очевидно, что для каждого из разделов следует хранить сведения о его начале и конце (то есть номера первого и последнего из задействованных в нем цилиндров). Где их хранить? Для ответа на этот вопрос следует обратиться к понятию блока.

Как и треки, дисковые блоки (или физические -- есть ещё блоки логические, но это относится уже к файловым системам, о которых речь пойдёт другой рубрике) создаются при низкоуровневом форматировании, и пользователь влиять на них не может. Размер их также всегда одинаков и равен 512 байтам. Вернее, таким он видится BIOS’у персоналки -- каков он на самом деле, одному Аллаху ведомо. Ходят слухи, что у современных винчестеров реальный физический блок имеет переменный размер, в зависимости от удаления от начала пластины.

Однако то, что обмен данными с диском возможен минимум 512-байтными порциями -- объективная реальность, как и то, что любой, сколь угодно маленький, объем информации, записанный на него, будет занимать целый блок -- вне зависимости от реального своего размера. То есть мелкие текстовые файлики размером в пару символов (сиречь байт) все равно захватят под себя аж 512 байт, не меньше (на самом деле -- возможно, и ещё больше, но об этом -- чуть позже, в иной рубрике). С другой стороны, считывание данных блоками по 512 байт будет происходить быстрее, чем если бы при каждом обращении головки к диску данные считывались бы побайтно. Однако и это относится уже к другой теме.

Пока же нас интересен один-единственный блок, образованный первым сектором на первом треке первого цилиндра. Который и будет рассмотрен на следующей странице.

Он резервируется под служебную область диска, именуемую главной загрузочной записью (MBR -- Master Boot Recodr), которая и считывается BIOS’ом при старте машины. Очевидно, что по прямому назначению MBR используется только в том случае, если диск определен в Setup’е BIOS’а как загрузочный (или просто является единственным в системе). Однако поскольку использование каждого конкретного диска остается на усмотрение пользователя, место под него отводится всегда.

Внутри нулевого блока, помимо прочего (в частности, кода какого-либо начального загрузчика, который может быть туда записан), непременно присутствует один зарезервированный участок. Он предназначен для BIOS’овской таблицы разделов (Partition Table), под которую испокон веков (со времен самой первой IBM PC, кажется) отведено 64 байта. В эту таблицу записываются (или могут быть записаны) данные о разделе (разделах) в определенном, доступном пониманию BIOS’а, формате.

А формат этот предусматривает указание для каждого раздела его стартового блока, размера в байтах, идентификатора типа файловой системы (это, вопреки названию, совсем не то же самое, что файловая система, о которой речь пойдет в следующем разделе) и (только для одного из разделов) флага активности (то есть помечающего данный раздел как загрузочный). Последнее необходимо для некоторых операционок типа DOS, хотя FreeBSD или, например, Linux’у флаг этот глубоко безразличен.

Всего информации, необходимой для описания дискового раздела, набегает 16 байт. А поскольку, как мы помним, под всю таблицу разделов этих байт отведено лишь 64, без калькулятора можно подсчитать, что предельное количество разделов на диске -- 4. Эти разделы называются первичными или, не совсем точно, физическими. Так как в большинстве случаев такие разделы могут быть также поделены на части -- разделы логические (о чем речь впереди).

Повторю еще раз -- это относится только к машинам с PC BIOS, то есть обычным персоналкам. На всякого рода PowerPC, Sparc’ах и тому подобных станциях все может быть совсем по другому (хотя как именно -- честно говоря, не знаю).

Как можно заметить, в описание раздела входит идентификатор файловой системы. Это -- некоторое число (во FreeBSD обычно в десятичном представлении, в Linux’е, например, -- в шестнадцатеричном), которое ставится в соответствие с файловой системой операционки, планируемой к размещению на диске. Так, раздел, предназначенный для FreeBSD, имеет идентификатор 165 (десятичный) или A5, раздел для Linux (Linux native) -- 131 (или 83), FAT16 -- 6, расширенный раздел (т.н. DOS Extended) -- 5, и так далее.

Присвоение разделу какого-либо идентификатора не значит, что тем самым на нем волшебным образом возникает соответствующая файловая система. Нет, он просто предопределяет, какого рода вторичная таблица разделов может быть на нем записана (хотя и это не совсем так -- а в некоторых случаях совсем не так).


Теги: ,