Разделяйте ваши данные опубликовано admin числа 30/09/02

Статья является переводом текста Dru Lavigne, опубликованного по адресу: http://www.onlamp.com/pub/a/bsd/2001/02/21/FreeBSD_Basics.html.
Эта статья первая из цикла, в котором мы увидим как FreeBSD хранит на винчестере данные. Для хранения данных на жестком диске, он должен быть поделен на логические блоки, при этом каждый блок имеет свой уникальный адрес. Файловая система сохраняет данные в этих блоках, а так же хранит информацию о том, какие блоки диска содержат какие файлы.
Как все остальные UNIX-системы, FreeBSD для хранения сведений о местонахождении файлов на дисках, использует inode-таблицы (индексные таблицы). Однако перед тем, как будет создана первая индексная таблица, диск должен быть разбит на логические блоки. Этот процесс осуществляется при помощи нескольких утилит, которые применяются в следующем порядке:

1) Используя fdisk можно создать (и посмотреть структуру существующей) BIOS’овскую таблицу разделов, в которой можно определить до четырех «слайсов» (терминология FreeBSD отличается от общепринятой и раздел диска в ней называется slice -- «кусок» -- прим. переводчика).
2) Утилита disklabel применяется для создания и просмотра содержимого UNIX’вых таблиц разделов, в каждой из которых может быть создано до восьми «партиций». (Таким образом в каждом из четырех дисковых разделов (слайсов), может быть создано по восемь UNIX-партиций. Всего 32 штуки. -- прим. переводчика).
3) Команда newfs предназначена для создания файловой системы на любой UNIX-партиции (поскольку только что созданная партиция обычно содержит только «мусор» -- прим. переводчика).
4) После этого каждая файловая система содержит индексные таблицы.

Заметьте, что ваша FreeBSD-система обязательно имеет обе таблицы, и BIOS’овскую и UNIX’овую. Это необходимо из-за того, что FreeBSD, являясь UNIX-системой понимает и использует UNIX’овую таблицу разделов, однако FreeBSD так же является системой, которая вынуждена работать на PC (персональном компьютере). Персональный компьютер обязательно имеет специальное программное обеспечение, так называемый BIOS, который необходим для правильной инициализации компьютера, определения параметров жестких дисков, а так же для поиска программного обеспечения, которое загружает операционную систему.
Итак одной из функций BIOS’а является просмотр содержимого первого сектора первого жесткого диска. Этот сектор имеет размер 512 байт. Помимо прочего в нем отведен 64-х байтный участок для хранения BIOS’овской таблицы разделов. Каждая запись этой таблицы занимает 16 байт, таким образом всего в таблице есть место только для четырех записей.
Как уже было упомянуто, BIOS’овская таблица разделов может быть просмотрена и изменена программой fdisk. Когда вы, используя fdisk, изменяете BIOS’овскую таблицу разделов, вы, на самом деле «нарезаете» ваш физический диск на максимум четыре логических. Пользователи FreeBSD предпочитают назвать эти логические диски слайсами, для того, что бы не перепутать их с «партициями», которые описываются в UNIX’овой таблице разделов.
Возможно вы уже хорошо знакомы с программой fdisk, поставляемой в составе DOS. Я сравню ее с утилитой fdisk из FreeBSD, для того что бы вы смогли увидеть схожесть этих двух программ. Я покажу результаты своей работы на одной из моих персоналок. Я загрузил ее с загрузочного DOS-диска, а затем, из командной строки, запустил утилиту fdisk:

Microsoft Windows 95
Fixed Disk Setup Program
(C)Copyright Microsoft Corp/ 1983 - 1995

FDISK Options

Current fixed disk drive: 1

Choose one of the following:

1. Create DOS partition or Logical DOS Drive
2. Set active partition
3. Delete partition or Logical DOS Drive
4. Display partition information

Enter choice: [4]

Мы оказались в главном меню программы fdisk для DOS. Поскольку я не хочу менять таблицу разделов, я выберу 4 пункт, для того что бы просто посмотреть ее содержимое.

Display Partition Information

Current fixed disk drive: 1

Partition Status Type Volume Label Mbytes System Usage
C: 1 A PRI DOS 204 FAT16 3%
2 Non-DOS 3193 52%
3 EXT DOS 2753 45%

Total disk space is 6150 Mbytes (1 Mbyte = 1048576 bytes)

The Extended DOS Partition contains Logical DOS Drives.
Do you want to display the logical drive information (Y/N)......?[Y]

Обратите внимание, что я разбил мой диск на три слайса, которые в DOS называются партиции (partition). Первый слайс имеет признак «A» что означает, что в нем записан загрузочный код, необходимый для правильной загрузки операционной системы. Этот раздел имеет объем 204 Мб и отформатирован в системе FAT16.
Второй слайс, объемом 3139 Мб содержит мою FreeBSD. DOS-версия утилиты fdisk не в состоянии правильно определить тип файловой системы на этом разделе, поэтому она просто называет ее «non-DOS» (не-DOS).
Третий слайс это 2753 мегабайтный дополнительный раздел (extended partition). Заметьте, что для того что бы поглядеть структуру дополнительного раздела, вам придется войти в другой экран программы fdisk. Дополнительный раздел был придуман для того, что бы вы могли разбить ваш жесткий диск более чем на четыре раздела. Дополнительный раздел, это просто ссылка на область диска, которая содержит еще одну таблицу разделов, в которой описываются логические разделы находящиеся в дополнительном разделе. К сожалению эти логические разделы действительно «логические» -- большинство операционных систем не могут быть установлены на логический раздел, поскольку он не может содержать загрузочного кода. Я нажал «Y» для того что бы попасть на экран, который отображает содержимое дополнительного раздела.

Display Logical DOS Drive Information

Drv Volume Label Mbytes System Usage
D: 1396 FAT16 51%
E: 361 FAT16 13%

Total Extended DOS Partition size is 2753 Mbytes (1 Mbyte = 1048576 bytes)

Давайте резюмируем информацию, которую мы с так тщательно добывали при помощи DOS-овского fdisk’а. Итак этот компьютер имеет жесткий диск объемом 6150 Мб. Он разбит на разделы следующим образом:

Буква DOS-диска Тип раздела Размер раздела Файловая система
C: Основной 204 Мб FAT16
D: Логический 1,396 Мб FAT16
E: Логический 361 Мб FAT16
Нет Неизвестно 3,193 Мб Неизвестно

DOS использует следующую схему именования разделов:

1) Основные разделы именуются в первую очередь, начиная с буквы «C», поскольку буквы «A» и «B» зарезервированы для дисководов гибких дисков.
2) Когда все основные разделы поименованы, именуются логические диски.
3) Дополнительный раздел, а так же разделы неизвестных типов не именуются.

Теперь давайте сравним fdisk’а для DOS с выводом fdisk для FreeBSD. Если вы просто напечатаете fdisk в приглашении командного интерпретатора, то он выведет вам содержимое BIOS’овской таблицы разделов. Однако если вы попытаетесь сделать это от имени обычного пользователя, вы получите только такое сообщение:

fdisk
fdisk: can't open device /dev/ad0
fdisk: cannot open disk /dev/ad0: Permission denied

Только суперпользователь имеет разрешение на доступ к устройству, которым представлен мой первый IDE жесткий диск. Это хорошая идея, поскольку fdisk дает возможность изменять разделы определенные на жестком диске. Если вы измените информацию о разделе, вы потеряете на нем все данные. Однако не переживайте, суперпользователь не изменит данные о разделах, если просто введет команду fdisk без параметров, для того что бы просмотреть информацию. Для того что бы что-нибудь изменить, суперпользователь должен указать устройство и ключи в командной строке программы fdisk. Я стал суперпользователем и попробовал опять выполнить команду fdisk:

fdisk

******* Working on device /dev/ad0 *******
parameters extracted from in-core disklabel are:
cylinders=784 heads=255 sectors/track=63 (16065 blks/cyl)

parameters to be used for BIOS calculations are:
cylinders=784 heads=255 sectors/track=63 (16065 blks/cyl)

Media sector size is 512
Warning: BIOS sector numbering starts with sector 1
Information from DOS bootblock is:
The data for partition 1 is:
sysid 6,(Primary "big" DOS (> 32MB))
start 63, size 417627 (203 Meg), flag 80 (active)
beg: cyl 0/ sector 1/ head 1;
end: cyl 25/ sector 63/ head 254
The data for partition 2 is:
sysid 165,(FreeBSD/NetBSD/386BSD)
start 417690, size 6538455 (3192 Meg), flag 0
beg: cyl 26/ sector 1/ head 0;
end: cyl 432/ sector 63/ head 254
The data for partition 3 is:
sysid 5,(Extended DOS)
start 6956145, size 5638815 (2753 Meg), flag 0
beg: cyl 433/ sector 1/ head 0;
end: cyl 783/ sector 63/ head 254
The data for partition 4 is:


Если вы внимательно поглядите на этот вывод, то заметите, что fdisk для FreeBSD выдает ту же самую информацию что и fdisk для DOS и еще большое количество разнообразных подробностей относительно физического разбиения диска. Вся эта информация всегда содержится в BIOS’овской таблице разделов, однако fdisk для DOS выдает лишь малую ее часть.
Жесткий диск разбивается на логические блоки, которые называются цилиндрами и секторами. Мой FreeBSD-раздел (номер 2) начинается с первого сектора 26 цилиндра, а заканчивается в 63 секторе 432 цилиндра. Поскольку цилиндр состоит из 63 секторов, мы начали с начала 26 цилиндра и закончили концом 432-го. Итого FreeBSD-раздел содержит 407 цилиндров. Мы еще увидим информацию о цилиндрах, когда будем рассматривать содержимое UNIX’овой таблицы разделов. Так же вы можете посмотреть краткую информацию о таблице разделов при помощи команды fdisk, выполнив ее с ключом -s:

fdisk -s

/dev/ad0: 784 cyl 255 hd 63 sec
Part Start Size Type Flags
1: 63 417627 0x06 0x80
2: 417690 6538455 0xa5 0x00
3: 6956145 5638815 0x05 0x00

Этот вывод опять показывает нам информацию о всех трех существующих дисковых разделах. Так же там можно увидеть начальный адрес каждого из слайсов, а так же их размер, указанный в секторах. Типы файловых систем слайсов указаны в шестнадцатеричной системе счисления, на что указывает префикс 0x перед каждым числом. Шестнадцатеричное число a5 эквивалентно десятичным 165, которое является «магическим числом» определяющим файловую систему FreeBSD. Шестнадцатеричное число 06 равно десятичным шести и определяет файловую систему FAT16. Легко догадаться что шестнадцатеричное 05 в десятичной системе рано пяти. Номер пять обозначает дополнительный раздел DOS. Только один раздел может иметь флаг 0x80, поскольку он указывает на «активность» слайса, а BIOS’овская таблица разделов имеет только один загрузочный слайс.
Давайте резюмируем наши сведения о BIOS’овской таблице разделов. Итак она используется BIOS’ом персонального компьютера для определения физической геометрии жесткого диска, который может быть разбит на логические диски (до четырех). Обычно пользователи разбивают жесткий диск на несколько слайсов тогда, когда они хотят использовать на своем компьютере несколько операционных систем. Если слайс содержит к примеру операционную систему фирмы Microsoft, то в начале он должен быть отформатирован в соответствующей файловой системе, которая должна быть понятна этой операционной системе. Процесс форматирования создаст на этом слайсе таблицу, которая будет использоваться файловой системой для отслеживания местонахождения данных на слайсе.
Ценным качеством, говорящим в пользу разбиения диска на слайсы, является возможность переформатирования слайса (при этом будут уничтожены все таблицы размещения данных на разделе, что означает, что найти там ваши данные будет почти невозможно), без затрагивания данных на других дисковых разделах. Однако слайс предназначенный для операционной системы Microsoft, может содержать только одну файловую систему. Таким образом, вы не можете иметь несколько файловых систем, на слайсе с операционной системой Microsoft.
Если слайс содержит операционную систему FreeBSD, то на него будет записана UNIX’овая таблица разделов. Слайс FreeBSD может содержать до восьми разделов и каждый из них может иметь свою файловую систему или быть разделом свопинга.
Если вы запустите утилиту disklabel без ключей, вы сможете безопасно посмотреть содержимое UNIX’овой таблицы разделов. Однако как и в случае с fdisk’ом без прав суперпользователя не обойтись, поскольку только он имеет право на доступ к дисковому устройству. Моя персоналка работает под управлением FreeBSD 4.2, IDE жесткий диск имеет в ней имя ad. Жесткие диски нумеруются с нуля, и поскольку у меня система стоит на первом диске, то укажем устройство ad0:

disklabel ad0

# /dev/ad0c:
type: ESDI
disk: ad0s2
label:
flags:
bytes/sector: 512
sectors/track: 63
tracks/cylinder: 255
sectors/cylinder: 16065
cylinders: 407
sectors/unit: 6538455
rpm: 3600
interleave: 1
trackskew: 0
cylinderskew: 0
headswitch: 0 # milliseconds
track-to-track seek: 0 # milliseconds
drivedata: 0

8 partitions:
# size offset fstype [fsize bsize bps/cpg]
a: 102400 0 4.2BSD 0 0 0 # (Cyl. 0 - 6*)
b: 270976 102400 swap # (Cyl. 6*- 23*)
c: 6538455 0 unused 0 0 # (Cyl. 0 - 406)
e: 40960 373376 4.2BSD 0 0 0 # (Cyl. 23*- 25*)
f: 6124119 414336 4.2BSD 0 0 0 # (Cyl. 25*- 406*)

UNIX’овая таблица разделов разительно отличается от BIOS’овской. Все эти разделы живут в одном FreeBSD-слайсе, который BIOS видит как раздел номер 2. Обратите внимание, что один этот слайс обозначен пятью буквами, однако буква файловая системы закрепленная за «c» обозначена как «неиспользуемая» (unused). По внутрисистемному соглашению буква «c» всегда означает весь слайс целиком, а реальные файловые системы закрепляются за буквами «a-b» и «d-e». Этот FreeBSD-слайс содержит в себе три файловые системы, обозначенные буквами «a», «e» и «f». Буквой «b» обозначен раздел свопинга.
Каждая файловая система определяется своей группой цилиндров, которая представляет из себя простой непрерывный участок сгруппированных вместе цилиндров. Каждая файловая система отвечает за данные только той группы цилиндров, которые ей принадлежат. Итак файловая система «a» находится на пространстве от нулевого до шестого цилиндра, файловая система «e» располагается на протяжении 23-25 цилиндров и, наконец файловая система «f» находится на 25-406 цилиндрах. Обратите внимание, что весь слайс (обозначенный буквой «c») размещается на цилиндрах 0-406, что в сумме дает объем в 407 цилиндров, которые и показывает нам утилита fdisk для FreeBSD.
Из верхних строк вывода команды disklabel мы можем сделать вывод о том, каким образом диск разбит на логические блоки: цилиндры разбиты на сектора и треки, каждый трек состоит за 63 секторов, а каждый сектор в свою очередь имеет размер 512 байт. Если вы незнакомы с секторами и треками, то хорошая иллюстрация есть здесь: http://www.howstuffworks.com/hard-disk.htm/printable.
Наконец, немного математики и мы сможем подсчитать насколько велик наш слайс в мегабайтах. Итак наш слайс состоит из 6538455 секторов, при этом размер каждого сектора -- 512 байт. Если мы умножим количество секторов на количество байт в секторе, то мы получим объем слайса в байтах (ох-ох-ох... это несомненно стоит объяснять подробно -- прим. переводчика). Если мы разделим полученное число на 1024, то получим размер слайса в килобайтах. А если мы еще раз разделим результат на 1024, то получим искомый размер слайса в мегабайтах:

6,538,455 x 512 = 3,347,688,960 байт
3,347,688,960 / 1,024 = 3,269,227 килобайт
3,269,227 / 1,024 = 3,192 мегабайт

что полностью совпадает с данными программы fdisk.
Утилита disklabel может использоваться для создания UNIX’овых разделов, однако не может на самом деле создавать файловые системы. Вместо этого эта утилита создает специальные дисковые метки, которые читает программа newfs. Эта утилита называется созвучно своей функции -- созданию файловых систем (newfs -- new file system -- новая файловая система -- прим переводчика), она-то и создает файловую систему и ее индексные таблицы. Мы поподробнее остановимся на утилите newfs и индексных таблицах в следующей статье цикла.


Комментарии: 0
Отправить другу

Домашняя страничка Станислава Лапшанского

RusHelp.com - вся компьютерная документация на русском!